一、lcd_write模块框图
1、输入端口部分
sys_clk_50MHz:与EP4CE10E22C8N的系统时钟相关,为50MHz。
sys_rst_n:低电平系统复位。
data:设为9位,最高位用于寄存器/数据选择信号,0:寄存器,1:数据。
en_write:使能lcd_write模块。
2、输出端口部分
wr_done:传输完成标志信号。
cs:cs片选信号,低电平有效。
dc:液晶屏寄存器/数据选择信号,低电平:寄存器,高电平:数据。
sclk:SPI时钟信号。
mosi:SPI写数据信号。
二、波形图与状态机
1、操作时序
该lcd模块接口为4-wire SPI interface。
查看ILI9341的数据手册。
选用SPI0模式,空闲时scl为低电平,在上升沿采样,下降沿更新数据。
时序方面主要关注twc串行时钟周期和tcss芯片选择时间。
twc串行时钟周期可知其最小的周期为100ns,我们需要把系统时钟降频,使sclk符合其要求。
tcss芯片选择时间为片选信号拉低到第一个数据被采集的时间,至少40ns。只需要保证在更新第一个数据的同时拉低cs即可。
2、状态机
用状态机来描叙这个流程。代码图3-3处实现。
3、波形图绘制
根据时序自己设计波形图。
借用野火的画波形图规范,绿色底代表输出端口,黄色底代表定义变量,红色底代表输出端口。
三、代码编写
部分解析嵌在代码里面。
该模块为了适用性更广,把SPI1模式、SPI2模式和SPI3模式也考虑进去。
注意:cnt_delay至少要计数到3然后进入状态STATE2,LCD才正常显示。
代码图3-7对应的波形图部分如下所示 ,在SPI1和SPI3模式下拉高sclk_flag虚线部分。
代码图3-10对应的波形图部分如下 。
四、仿真代码与ModelSim仿真波形图
1、仿真代码
`timescale 1ns/1ns
module tb_lcd_write();
reg sys_clk_50MHz;
reg sys_rst_n ;
reg [8:0] data ;
reg en_write ;
wire wr_done ;
wire cs ;
wire dc ;
wire sclk ;
wire mosi ;
initial
begin
sys_clk_50MHz <= 1'b1;
sys_rst_n <= 1'b0;
data <= 9'd0;
en_write <= 1'b0;
#100
sys_rst_n <= 1'b1;
data <= 9'h1ae;
#100
en_write <= 1'b1;
end
always #10 sys_clk_50MHz <= ~sys_clk_50MHz;
lcd_write lcd_write_inst
(
.sys_clk_50MHz (sys_clk_50MHz),
.sys_rst_n (sys_rst_n ),
.data (data ),
.en_write (en_write ),
.wr_done (wr_done ),
.cs (cs ),
.dc (dc ),
.sclk (sclk ),
.mosi (mosi )
);
endmodule