当前位置:文档之家› 16位乘法器学习笔记(Verilog语言源程序+仿真程序)

16位乘法器学习笔记(Verilog语言源程序+仿真程序)

LCD1602显示源程序如下:module lcd1602(input clk, //60Minput rst_n,output lcd_p, //Backlight Source + lcd屏幕背光output lcd_n, //Backlight Source -output reg lcd_rs, //0:write order; 1:write dataoutput lcd_rw, //0:write data; 1:read dataoutput reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效output reg [7:0] lcd_data);mux16mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联//--------------------lcd1602 order----------------------------parameter Mode_Set = 8'h31, //功能设置,Cursor_Set = 8'h0c, //光标设置Address_Set = 8'h06, //输入模式设置Clear_Set = 8'h01; //清屏设置/****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数wire [15:0]data0,data1; //结果显示wire [31:0]data2;wire [7:0] addr; //write addresswire start,done;assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。

assign data_r1 = 8'h30 + data1[7:0] ;assign data_r2 = 8'h30 + data2[7:0];//-------------------address------------------assign addr = 8'h80;/****************************LCD1602 Driver****************************///-----------------------lcd1602 clk_en---------------------reg [31:0] cnt;reg lcd_clk_en;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt <= 1'b0;lcd_clk_en <= 1'b0;endelse if(cnt == 32'h24999) //600usbeginlcd_clk_en <= 1'b1;cnt <= 1'b0;endelsebegincnt <= cnt + 1'b1;lcd_clk_en <= 1'b0;endend//-----------------------lcd1602 display state-------------------------------------------reg [6:0] state;always@(posedge clk or negedge rst_n)beginif(!rst_n)beginstate <= 1'b0;lcd_rs <= 1'b0;lcd_en <= 1'b0;lcd_data <= 1'b0;endelse if(lcd_clk_en)begincase(state)//-------------------init_state---------------------6'd0: beginlcd_rs <= 1'b0;lcd_en <= 1'b1;lcd_data <= Mode_Set; //进入功能设置模式,“31”:数据总线8位,显示一行。

6*7点阵/每字符state <= state + 1'd1;end6'd1: beginlcd_en <= 1'b0; //lcd_en变低电平,使led_en出现下降沿state <= state + 1'd1;end6'd2: beginlcd_rs <= 1'b0;lcd_en <= 1'b1;lcd_data <= Cursor_Set;//光标设置:光标右移一格,且AC值加1.state <= state + 1'd1;end6'd3: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd4: beginlcd_rs <= 1'b0;lcd_en <= 1'b1;lcd_data <= Address_Set;//模式设置:写入新数据后光标右移,AC自增1state <= state + 1'd1;end6'd5: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd6: beginlcd_rs <= 1'b0;lcd_en <= 1'b1;lcd_data <= Clear_Set;//清屏操作:0x01state <= state + 1'd1;end6'd7: beginlcd_en <= 1'b0;state <= state + 1'd1;end//--------------------work state--------------------6'd8: beginlcd_rs <= 1'b0;lcd_en <= 1'b1;lcd_data <= addr; //write addrstate <= state + 1'd1;end6'd9: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd10: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "R"; //write datastate <= state + 1'd1;6'd11: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd12: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "E"; //write datastate <= state + 1'd1;end6'd13: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd14: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "S"; //write datastate <= state + 1'd1;end6'd15: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd16: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= ":"; //write datastate <= state + 1'd1;end6'd17: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd18: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= data_r1; //write data: tens digitstate <= state + 1'd1;end6'd19: beginlcd_en <= 1'b0;state <= state + 1'd1;6'd20: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "*";state <= state + 1'd1;end6'd21: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd22: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= data_r0; //write data: single digitstate <= state + 1'd1;end6'd23: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd24: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "="; //write data: single digitstate <= state + 1'd1;end6'd25: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd26: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= data_r2; //write data: single digitstate <= state + 1'd1;end6'd27: beginlcd_en <= 1'b0;state <= state + 1'd1;end6'd28: beginlcd_rs <= 1'b1;lcd_en <= 1'b1;lcd_data <= "."; //write data: single digitstate <= state + 1'd1;end6'd29: beginlcd_en <= 1'b0;state <= 6'd8;enddefault: state <= 6'bxxxxxx;endcaseendendassign lcd_rw =1'b0; //only write//------------------backlight driver----------------assign lcd_n = 1'b0;assign lcd_p = 1'b1;Endmodule16位乘法器源程序如下:`timescale 1ns / 1psmodule mux16(clk,rst_n,start,ain,bin,yout,done);input clk; //芯片的时钟信号。

相关主题