宋桓公

【技术分享】Verilog打造TFT接口1

0
阅读(4753)

说明下,我的TFT所用的控制芯片是SSD1289,用纯 Verilog驱动,不用nios。

首先,必须介绍下SSD1289,我看网上很多资料都是介绍ILI9325的,介绍SSD1289

的比较少,我找了好久,找到了一个介绍SSD1289的帖子写不错~~

http://forum.eepw.com.cn/thread/209537/4

这里在它的基础上,我也好好总结下:

先来看看几个总要的寄存器:

image

image

总结:这个寄存器主要是设置,扫屏时的扫屏顺序。

image

0x6070设置是竖屏,如下:

image

总结:这个寄存器,主要是设置横屏,竖屏。

也就是说:当寄存器R01 = 2B3F; 且R11 = 6070时,那么你的屏将

是一个竖屏,且扫描方式是从上到下,从左到右,我想这样的设置是最

正常的,呵呵~~

接着来:

R00h :晶振使能,0x0001打开晶振,0x0000关闭晶振。

R4eh:设置GDDRAM X的计数地址。

R4fh:设置GDDRAM Y的计数地址。

这两个寄存器用于设定画点的位置

R22h:用于确定这个点的颜色

image

假设初始化完成之后,我想画一个点:

用C来写就是这样:(我们是竖屏,只看竖屏部分)

image

image

image

image

image

用Verilog来写就是这样:

image

上面这段话的意思就是,在坐标(55,55)的这个位置打一个红色的点~~以上

这段程序不必深究,领会下就行,主要是为了解释R4eh,R4fh,R22h,这几个寄存器的

用法~~

当然,这都是后话,TFT还没初始化呢?

先介绍下要用到哪些引脚:

image

我们要用的引脚是:

#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])上;

image

根据上面的时序要求,最后贴上我的写数据模块:

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:elseif(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的读周期,最小是100ns
37: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吧~~

未完待续~~

Baidu
map