一、概述
顶层模块就是例化lcd初始化模块和写命令/数据模块,然后把两个模块连接起来就完成了
先贴一下最后实现的效果图
顶层模块代码如下
二、Verilog代码
module lcd_drive(
input clk, //时钟信号 50m
input rst_n, //按键复位
output scl, //iic scl
inout sda //iic sda
);
wire clk_1m; //1m的时钟信号
wire done_write; //一次数据/命令写完成
wire [7:0] data; //写的字节
wire cmd_data; //数据还是命令 0:命令,1:数据
wire ena_write; //使能写数据/命令模块
//时钟分频模块 产生1M的时钟
clk_fenpin clk_fenpin_inst(
.clk(clk),
.rst_n(rst_n),
.clk_1m(clk_1m)
);
//lcd初始化模块
lcd_init u_lcd_init(
.clk(clk_1m),
.rst_n(rst_n),
.ena(1'b1),
.done_write(done_write),
.data(data),
.cmd_data(cmd_data),
.ena_write(ena_write)
);
//lcd写命令/数据模块
lcd_write_cmd_data u_lcd_write_cmd_data(
.clk(clk_1m),
.rst_n(rst_n),
.ena(ena_write),
.data(data),
.cmd_data(cmd_data),
.sda(sda),
.scl(scl),
.done(done_write)
);
endmodule
三、小结
- 注意iic的时序,开始、停止和等待ack
- 多使用仿真和singal tap寻找问题,仿真不对就不要先下载到板子上,现象也大概率不会对的,不能心急,必须先保证仿真出正确的结果再开始下载到板子上。现象不对再使用singal tap寻找问题
- 使用小建议:lcd每次重新下载显示的时候最好还是断电再上电,然后复位板子,不然可能现象不是很多(可能是因为自动移位的原因把)