【技术分享】Verilog打造TFT接口1
0赞说明下,我的TFT所用的控制芯片是SSD1289,用纯 Verilog驱动,不用nios。
首先,必须介绍下SSD1289,我看网上很多资料都是介绍ILI9325的,介绍SSD1289
的比较少,我找了好久,找到了一个介绍SSD1289的帖子写不错~~
http://forum.eepw.com.cn/thread/209537/4
这里在它的基础上,我也好好总结下:
先来看看几个总要的寄存器:
总结:这个寄存器主要是设置,扫屏时的扫屏顺序。
0x6070设置是竖屏,如下:
总结:这个寄存器,主要是设置横屏,竖屏。
也就是说:当寄存器R01 = 2B3F; 且R11 = 6070时,那么你的屏将
是一个竖屏,且扫描方式是从上到下,从左到右,我想这样的设置是最
正常的,呵呵~~
接着来:
R00h :晶振使能,0x0001打开晶振,0x0000关闭晶振。
R4eh:设置GDDRAM X的计数地址。
R4fh:设置GDDRAM Y的计数地址。
这两个寄存器用于设定画点的位置
R22h:用于确定这个点的颜色
假设初始化完成之后,我想画一个点:
用C来写就是这样:(我们是竖屏,只看竖屏部分)
用Verilog来写就是这样:
上面这段话的意思就是,在坐标(55,55)的这个位置打一个红色的点~~以上
这段程序不必深究,领会下就行,主要是为了解释R4eh,R4fh,R22h,这几个寄存器的
用法~~
当然,这都是后话,TFT还没初始化呢?
先介绍下要用到哪些引脚:
我们要用的引脚是:
#TFT复位信号: RST(硬复位TFT)
#TFT片选: CS(片选信号)
#命令数据选择 : RS (低命令,高数据)
#TFT写信号 : WR(向TFT写入数据)
#TFT读信号: RD(从TFT读取数据)
#TFT数据总线: DB[15:0](16位双向数据线)
现在就是如和通过芯片的这几个引脚,让FPGA把数据发给TFT,
那么请看8080并行接口时序~~
8080并行接口的发明者是INTEL,该总线也被广泛应用于各类液晶显示器。
模块的8080并口读/写的过程为:先根据要写入/读取的数据的类型,设置RS 为高(数据)/低(命令),然后拉低片选,选中SSD1289,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:
在RD的上升沿, 使数据锁存到数据线(DB[15:0])上;
在WR的上升沿,使数据写入到数据线(DB[15:0])上;
根据上面的时序要求,最后贴上我的写数据模块:
1: module TFT_Write
2: (
3: input CLK,
4: input RSTn,
5: input [16:0]iData,//{1'TFT_RS,16'TFT_Data}6: input Start_Sig,
7: output [18:0]oData,//{1'TFT_CS,1'TFT_RS,1'TFT_WR,16'TFT_Data}8: output reg Done
9: );
10:
11: reg CS; //驱动TFT片选12: reg WR; //驱动TFT写信号13: reg [15:0]Data; //驱动TFT数据总线14: reg [3:0]i;
15: always @(posedge CLK or negedge RSTn)
16: if(!RSTn)17: begin
18: CS <= 1'b1;19: WR <= 1'b0;
20: Done <= 1'b0;21: i <= 4'd0;
22: end
23: else if(Start_Sig)24: case(i)25: 0:
26: begin
27: CS <= 1'b0;28: WR <= 1'b0;
29: i <= i + 1'b1;30: end
31: 1:
32: begin
33: Data <= iData[15:0];
34: i <= i + 1'b1;
35: end
36: 2://延时20ns,拉底CS 60ns,CS的读周期,最小是100ns37: begin
38: i <= i + 1'b1;39: end
40: 3,4,5://保证CS拉高60ns,这样读的CS周期就大于100ns了~
41: begin
42: CS <= 1'b1;
43: WR <= 1'b1; //WR的上升沿数据锁存44: i <= i + 1'b1;
45: end
46: 6:
47: begin
48: Done <= 1'b1;49: i <= i + 1'b1;
50: end
51: 7:
52: begin
53: Done <= 1'b0;54: i <= 4'd0;
55: end
56: endcase
57:
58: assign oData = {CS,iData[16],WR,Data};
59:
60: endmodule
接下来就运用这个模块,去控制TFT吧~~
未完待续~~