【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗二十九:LCD模塊


實驗二十九:LCD模塊

據說Alinx 301支持 7”TFT,好奇的朋友一定疑惑道,它們3.2”TFT以及7”TFT等兩者之間究竟有何區別呢?答案很簡單,前者自帶控制器也有圖像內存。換之,后者好似縮小版台式的液晶,它除了接口以外什么也沒有。

clip_image002

圖29.1 7”TFT的引腳。

如圖29.1所示,這只7“TFT擁有840 * 480的分辨率,應用VGA接口,所以左邊才有熟悉的 HSYNC以及 VYSNC信號。LCD_CLOCK是像素時鍾,最大為50Mhz,並且沒有下限。LCD_RED/GREEN/BLUE 為 18位RGB,顏色支持范圍是 218 = 262K。右邊的DE為Data Enable拉高表示數據輸入有效,LR/UD為掃描次序,例如自左向右,由高至下就是 2’b10,結果如表29.1所示:

表29.1 TFT的掃描次序。

LR

UD

掃描次序

0

0

自右向左,由上至下

0

1

自右向左,由下至上

1

0

自左向右,由上至下

1

1

自左向右,由下至上

根據手冊,它支持兩種模式,MODE拉低表示傳統的VGA模式,MODE拉高則是DE模式。老實說,什么是DE模式,筆者真有點搞不懂,手冊也沒有詳細注明,所以MODE信號必須拉低。這只7”TFT自帶背光,我們可以經由PWM信號調節背光的亮度,具體內容請瀏覽手冊,我們一般都是常年拉高。

clip_image004

clip_image005

圖26.4 VGA時序。

如圖29.2所示,HSYNC以及VSYNC均為五段,具體長度如表29.2所示:

表29.2 顯示標准800 × 480。

信號

A

B

C

D

E

VGA_HSYNC

48

40

800

40

928

信號

O

P

Q

R

S

VGA_VSYNC

3

29

480

13

525

筆者曾前面說過,折尺7”TFT應用VGA接口,驅動方法與實驗二十六差不多。所以說,懶惰的筆者就直接沿用實驗二十六的資源。

clip_image007

圖29.3 128×96大小的小可愛。

圖29.3是我們要顯示的小可愛 ... 啊,不管怎么看,比卡丘最可愛了!完后,我們讓我們建模去吧。

clip_image009

圖29.4 LCD基礎模塊的建模圖。

圖29.4是LCD基礎模塊的建模圖,內容包括儲存模塊以及的功能模塊。相對PLL模塊將時間分頻為25Mhz,因為像素時鍾是任意的。

lcd_funcmod.v

clip_image011

圖29.5 LCD 功能模塊。

圖29.5是LCD功能模塊的建模圖,讀者可能很好奇控制模塊去哪兒了?非呀,控制模塊已經被整合進去了。

1.    module lcd_funcmod 
2.    (
3.         input CLOCK, RESET,
4.         output LCD_CLOCK,
5.         output LCD_HSYNC, LCD_VSYNC,
6.         output [5:0]LCD_RED,LCD_GREEN,LCD_BLUE,
7.         output LCD_DE,
8.         output LCD_UD, LCD_LR,
9.         output LCD_MODE,
10.         output LCD_PWM,
11.         output [13:0]oAddr,
12.         input [15:0]iData
13.    );
14.         parameter SA = 11'd48, SB = 11'd40, SC = 11'd800, SD = 11'd40, SE = 11'd928;
15.         parameter SO = 11'd3, SP = 11'd29, SQ = 11'd480, SR = 11'd13, SS = 11'd525;
16.        

以上內容為相關的出入端聲明以及常量聲明。

17.         reg [10:0]CH;
18.         always @ ( posedge CLOCK or negedge RESET )
19.            if( !RESET )
20.                 CH <= 11'd0;
21.             else if( CH == SE -1 )
22.                 CH <= 11'd0;
23.             else 
24.                 CH <= CH + 1'b1;
25.            
26.        reg [9:0]CV;        
27.         always @ ( posedge CLOCK or negedge RESET )
28.            if( !RESET )
29.                 CV <= 10'd0;
30.             else if( CV == SS -1 )
31.                 CV <= 10'd0;
32.             else if( CH == SE -1 )
33.                 CV <= CV + 1'b1;
34.                  

以上內容為列計數與行計數的周邊操作。

35.         reg H;
36.         always @ ( posedge CLOCK or negedge RESET )
37.            if( !RESET )
38.                 H <= 1'b1;
39.             else if( CH == SE -1 )
40.                 H <= 1'B0;
41.             else if( CH == SA -1 )
42.                 H <= 1'b1;
43.                  
44.         reg V;
45.         always @ ( posedge CLOCK or negedge RESET )
46.            if( !RESET )
47.                 V <= 1'b1;
48.             else if( CV == SS -1 )
49.                 V <= 1'b0;
50.             else if( CV == SO -1 )
51.                 V <= 1'b1;
52.         

以上內容為列控制以及行控制的周邊操作。

53.         parameter XSIZE = 8'd128, YSIZE = 8'd96, XOFF = 10'd0, YOFF = 10'd0; 
54.        
55.         wire isX = ( (CH >= SA + SB + XOFF -1 ) && ( CH <= SA + SB + XOFF + XSIZE -1) );
56.         wire isY = ( (CV >= SO + SP + YOFF -1 ) && ( CV <= SO + SP + YOFF + YSIZE -1) );
57.         wire isReady = isX & isY;
58.         
59.         wire [31:0] x = CH - XOFF - SA - SB -1; 
60.         wire [31:0] y = CV - YOFF - SO - SP -1;
61.         

以上內容為圖像信息的常量聲明,有效行列,以及地址轉換等即時聲明。

62.         reg [31:0]D1;
63.         reg [15:0]D2;
64.         
65.         always @ ( posedge CLOCK or negedge RESET )
66.             if( !RESET )
67.                  begin
68.                        D1 <= 18'd0;
69.                        D2 <= 16'd0;
70.                    end

以上內容為相關的寄存器聲明以及復位操作。D1暫存圖像的地址信息,D2暫存圖像信息。

71.                else
72.                   begin
73.                    
74.                        // step 1 : compute data address and index-n
75.                         if( isReady )
76.                             D1 <= (y << 7) + x; 
77.                         else
78.                             D1 <= 14'd0;
79.                         
80.                         // step 2 : reading data from rom
81.                         // but do-nothing
82.                         
83.                         // step 3 : assign RGB_Sig
84.                         D2 <= isReady ? iData : 16'd0;
85.                         
86.                    end
87.                    

以上內容為核心操作。它是流水操作,步驟1轉換圖像信息地址至D1,步驟2等待圖像信息反饋,步驟3暫存圖像信息至D2。

88.         reg [1:0]B1,B2,B3;
89.         
90.        always @ ( posedge CLOCK or negedge RESET )
91.             if( !RESET )
92.                  {  B3, B2, B1 } <= 6'b11_11_11;
93.              else
94.                  begin
95.                         B1 <= { H,V };
96.                         B2 <= B1;
97.                         B3 <= B2;
98.                    end    
99.        

以上內容為對此行列延遲的周邊操作。

100.        assign LCD_CLOCK = CLOCK;
101.        assign { LCD_HSYNC, LCD_VSYNC } = B3;
102.        assign LCD_RED = { D2[15:11],1'b0};
103.        assign LCD_GREEN = D2[10:5];
104.        assign LCD_BLUE = { D2[4:0],1'b0};
105.        assign LCD_DE = 1'b1;
106.        assign {LCD_LR, LCD_UD} = 2'b10;
107.        assign LCD_MODE = 1'b0;
108.        assign LCD_PWM = 1'b1;
109.        assign oAddr = D1[13:0];
110.         
111.    endmodule

以上內容為相關的輸出驅動聲。注意LCD_RED/BLUE 都是舍棄最低位,LCD_LR/UD為2’b10,LCD_MODE拉低,LCD_DE常年拉高。

lcd_savemod.v

內容基本上與實驗二十六一樣。

lcd_basemod.v

連線部署請參考圖29.5。

1.    module lcd_basemod
2.    (
3.        input CLOCK, RESET,
4.         
5.         output LCD_CLOCK,
6.         output LCD_HSYNC, LCD_VSYNC,
7.         output [5:0]LCD_RED,LCD_GREEN,LCD_BLUE, 
8.         output LCD_DE,
9.         output LCD_UD, LCD_LR,
10.         output LCD_MODE,
11.         output LCD_PWM
12.    );

以上內容為相關出入端聲明。

13.        wire CLOCK_25M;
14.         
15.        pll_module U1  
16.        (
17.            .inclk0 ( CLOCK ),
18.            .c0 ( CLOCK_25M ) 
19.         );
20.         

以上內容為PLL的實例化。注意,7”TFT除了最大像素時鍾是50Mhz以外,余下可以任意設置。

21.         wire [13:0]AddrU2; 
22.         
23.         lcd_funcmod U2    
24.         (
25.            .CLOCK( CLOCK_25M ), 
26.            .RESET( RESET ),
27.            .LCD_CLOCK( LCD_CLOCK ),
28.            .LCD_HSYNC( LCD_HSYNC ), 
29.            .LCD_VSYNC( LCD_VSYNC ),
30.            .LCD_RED( LCD_RED ),
31.            .LCD_GREEN( LCD_GREEN ),
32.            .LCD_BLUE( LCD_BLUE ),
33.            .LCD_DE( LCD_DE ),
34.            .LCD_LR( LCD_LR ),
35.            .LCD_UD( LCD_UD ),
36.            .LCD_MODE( LCD_MODE ),
37.            .LCD_PWM( LCD_PWM ),
38.            .oAddr( AddrU2 ),
39.            .iData( DataU3 )
40.         );             
41.         

以上內容為功能模塊的實例化。

42.         wire [15:0]DataU3;
43.         
44.         lcd_savemod U3
45.         (
46.             .CLOCK( CLOCK_25M ),
47.             .RESET( RESET ),
48.             .iAddr( AddrU2 ),
49.             .oData ( DataU3 )
50.        );
51.         
52.    endmodule

以上內容為儲存模塊的實例化。

clip_image013

圖29.6 顯示效果。

完后,綜合程序並且下載進去,如果7”TFT的左上角出現一群小可愛,結果如圖29.6,那么表示實驗成功。

細節一:完整的個體模塊

本實驗的LCD基礎模塊只是演示7”TFT如何驅動而已。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM