1、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 data output lcd_rw, /0:write data; 1:read dataoutput reg lcd_en, /negedge 在 lcd_en 下降沿需保证数据有效output reg 7:0 lcd_data);mux16
2、mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done);/端口名称关联 /-lcd1602 order-parameter Mode_Set = 8h31, /功能设置,Cursor_Set = 8h0c, /光标设置Address_Set = 8h06, /输入模式设置Clear_Set = 8h01; /清屏设置/*LCD1602 Display Data*/ wire 7:0 data_r0,data_r1,data_r2; /乘数、被乘数wire 15:0dat
3、a0,data1; /结果显示wire 31:0data2; wire 7:0 addr; /write addresswire start,done;assign data_r0 = 8h30 + data07:0 ; / 8h30 在 LCD1602 上显示值为 0。 assign data_r1 = 8h30 + data17:0 ;assign data_r2 = 8h30 + data27:0;/-address-assign addr = 8h80;/*LCD1602 Driver*/ /-lcd1602 clk_en-reg 31:0 cnt;reg lcd_clk_en;alw
4、ays (posedge clk or negedge rst_n) beginif(!rst_n)begincnt 5d0 /移位不累加endelse if(i = 5d16 /移位不累加endelse if(i = 5d16 /累加不移位对于 if(aregi-1) yout_r = 1b0,yout30:15+breg,yout_r14:1;此句说明如下:(1) 、二进制中 16 位加上 16 位结果为 17 位(2) 、areg0为 1 时,第一次只是加并不右移,后面 aregi-1再次为 1 时执行累加并右移命令。右移实现通过拼接强制最高位(即第32 位)为 0 实现的。(3) 、
5、else if(i = 5d16 /累加不移位对于此语句当 areg15即最高位为 1 且 i=16 时只进行累加,再次应注意最高位(即第 32 位)的变化。3、第 2 条的思想是基于如下二进制算法实现的:1101X 10111101110100001101100 01 0114、尝试结果在 LCD1602 上面显示出来:(1)assign data_r2 = 8h30 + data27:0;此语句之所以加上 8h30是因为 8h30 在 lcd 显示时存放的是 0 的地址。(2)问题:现在 lcd 显示屏只能显示八个字符,暂时不知道为什么?另一个问题就是:此 lcd 显示两行的时候字符会变暗,显示一行就很正常!只能显示八个的原因是:硬件问题,lcd1602 出问题了!(坑了)5、16 位乘法器仿真图如下:从上图中能看到 start 变为 1 后的第一个周期内 yout 为 0,从下面一个周期开始 yout 开始输出值,且移位 14 次即到第 15 个周期,一直到第 16 个时钟周期时,yout 输出了最终结果值,done 也由 0 变为了 1。