--作者:肖肖肖
本文為明德?lián)P原創(chuàng)及錄用文章,轉(zhuǎn)載請注明出處!
1.1 總體設(shè)計
1.1.1 概述
液晶顯示器是一種通過液晶和色彩過濾器過濾光源,在平面面板上產(chǎn)生圖像的數(shù)字顯示器。LCD 的構(gòu)造是在兩片平行的玻璃基板當(dāng)中放置液晶盒,下基板玻璃上設(shè)置薄膜晶體管,.上基板玻璃上設(shè)置彩色濾光片,通過薄膜晶體管上的信號與電壓改變來控制液晶分子的轉(zhuǎn)動方向,從而達(dá)到控制每個像素點偏振光出射與否而達(dá)到顯示目的。與傳統(tǒng)的陰極射線管相比,LCD具有占用空間小,低功耗,低輻射,無閃爍,降低視覺疲勞等優(yōu)點。現(xiàn)在LCD已漸替代CRT成為主流,價格也已經(jīng)下降了很多,并已充分的普及。
1.1.2 設(shè)計目標(biāo)
在7寸LCD顯示屏上實現(xiàn)圖片的居中顯示。
1.1.3 系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)結(jié)構(gòu)框圖如下所示:

1.1.4 模塊功能
? PLL模塊實現(xiàn)功能
1. 將輸入的50MHz時鐘分頻輸出40MHz時鐘。
? ROM模塊實現(xiàn)功能
2. 存儲圖像數(shù)據(jù)。
? LCD驅(qū)動模塊實現(xiàn)功能
1、 產(chǎn)生驅(qū)動LCD屏顯示的時序
2、 讀取ROM里存儲的數(shù)據(jù)并輸出顯示
1.1.5 頂層信號

1.1.6 參考代碼
1. module top_mdyLcdPic( 2. clk , 3. rst_n , 4. hys , 5. vys , 6. lcd_de , 7. lcd_rgb , 8. lcd_dclk 9. ); 10. 11. parameter PICTURE_W = 24 ; 12. 13. input clk ; 14. input rst_n ; 15. output hys ; 16. output vys ; 17. output lcd_de ; 18. output [PICTURE_W-1:0] lcd_rgb ; 19. output lcd_dclk ; 20. 21. 22. wire clk_0 ; 23. 24. wire hys ; 25. wire vys ; 26. wire lcd_de ; 27. wire [PICTURE_W-1:0] lcd_rgb ; 28. wire lcd_dclk ; 29. 30. 31. //40MHz 32. pll_40m u_pll_40m( 33. .areset (~rst_n ), 34. .inclk0 (clk ), 35. .c0 (clk_0 ) 36. ); 37. 38. 39. lcd_driver u2( 40. .clk (clk_0 ),//40MHz 41. .rst_n (rst_n ), 42. 43. .hys (hys ), 44. .vys (vys ), 45. .lcd_de (lcd_de ), 46. .lcd_rgb (lcd_rgb ), 47. .lcd_dclk (lcd_dclk ) 48. ); 49. 50. endmodule
1.2 PLL模塊設(shè)計
1.2.1 接口信號
下面為使用矩陣鍵盤時的接口信號:

1.2.2 設(shè)計思路
本模塊主要用于產(chǎn)生LCD驅(qū)動時序所需要的時鐘,關(guān)于PLL的使用詳細(xì)介紹請看下方鏈接:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105
1.3 ROM模塊設(shè)計
1.3.1 接口信號

1.3.2 設(shè)計思路
本模塊主要用于存儲需要顯示的圖像數(shù)據(jù),關(guān)于ROM的使用詳細(xì)介紹請看下方數(shù)據(jù)手冊:
1.4 LCD驅(qū)動模塊設(shè)計
1.4.1 接口信號

1.4.2 設(shè)計思路
產(chǎn)生驅(qū)動LCD顯示的行場時序信號,其計數(shù)器架構(gòu)如下圖所示:

行計數(shù)器h_cnt:該計數(shù)器用來計算行同步信號的幀長。加一條件為1,表示一直在計數(shù)。結(jié)束條件為數(shù)1056個,也就是一行有1056個像素。
場計數(shù)器v_cnt:該計數(shù)器用來計算場同步信號的幀長。加一條件為end_h_cnt,即行計數(shù)器的計數(shù)器的結(jié)束條件,表示每計數(shù)完一行像素就加一。結(jié)束條件為數(shù)525個,也就是一共有525行像素。
1.4.3 參考代碼
1. module lcd_driver(
2. clk ,//40MHz
3. rst_n ,
4.
5. hys ,
6. vys ,
7. lcd_de ,
8. lcd_rgb ,
9. lcd_dclk
10. );
11.
12. input clk ;
13. input rst_n ;
14.
15. output hys ;
16. output vys ;
17. output lcd_de ;
18. output [23:0] lcd_rgb ;
19. output lcd_dclk ;
20.
21. reg hys ;
22. reg vys ;
23. reg lcd_de ;
24. reg [23:0] lcd_rgb ;
25. wire lcd_dclk ;
26.
27. //1056
28. parameter THPW = 20 ;
29. parameter THB = 46 ;
30. parameter THD = 800 ;
31. parameter THFP = 210 ;
32.
33. //525
34. parameter TVPW = 10 ;
35. parameter TVB = 23 ;
36. parameter TVD = 480 ;
37. parameter TVFP = 22 ;
38.
39. parameter HDE_CENTRE = THD/2 ;//400
40. parameter VDE_CENTRE = TVD/2 ;//240
41.
42. reg [ 10:0] h_cnt ;
43. wire add_h_cnt ;
44. wire end_h_cnt ;
45. reg [ 9:0] v_cnt ;
46. wire add_v_cnt ;
47. wire end_v_cnt ;
48.
49.
50. wire active_area ;
51. reg rom_area ;
52. reg [15:0] rom_addr ;
53. wire [7:0] rom_data ;
54.
55.
56. always @(posedge clk or negedge rst_n) begin
57. if (rst_n==0) begin
58. h_cnt <= 0;
59. end
60. else if(add_h_cnt) begin
61. if(end_h_cnt)
62. h_cnt <= 0;
63. else
64. h_cnt <= h_cnt+1 ;
65. end
66. end
67. assign add_h_cnt = 1;
68. assign end_h_cnt = add_h_cnt && h_cnt == (THB + THD + THFP)-1 ;
69.
70.
71.
72. always @(posedge clk or negedge rst_n) begin
73. if (rst_n==0) begin
74. v_cnt <= 0;
75. end
76. else if(add_v_cnt) begin
77. if(end_v_cnt)
78. v_cnt <= 0;
79. else
80. v_cnt <= v_cnt+1 ;
81. end
82. end
83. assign add_v_cnt = end_h_cnt;
84. assign end_v_cnt = add_v_cnt && v_cnt == (TVB + TVD + TVFP)-1 ;
85.
86. /*******************************************************/
87. //dclk
88. assign lcd_dclk = clk;
89.
90. //hsync
91. always @(posedge clk or negedge rst_n)begin
92. if(rst_n==1'b0)begin
93. hys <= 0;
94. end
95. else if(add_h_cnt && h_cnt==THPW-1)begin
96. hys <= 1;
97. end
98. else if(end_h_cnt)begin
99. hys <= 0;
100. end
101. end
102.
103.
104. //vsync
105. always @(posedge clk or negedge rst_n)begin
106. if(rst_n==1'b0)begin
107. vys <= 0;
108. end
109. else if(add_v_cnt && v_cnt==TVPW-1)begin
110. vys <= 1;
111. end
112. else if(end_v_cnt)begin
113. vys <= 0;
114. end
115. end
116.
117.
118. //lcd_de
119. always @(posedge clk or negedge rst_n)begin
120. if(rst_n==1'b0)begin
121. lcd_de <= 0;
122. end
123. else if(active_area)begin
124. lcd_de <= 1;
125. end
126. else begin
127. lcd_de <= 0;
128. end
129. end
130.
131.
132. /********************************************************************/
133.
134.
135.
136. assign active_area = h_cnt>=(THB-1) && h_cnt<(THB+THD-1) && v_cnt>=(TVB-1) && v_cnt<(TVB+TVD-1);
137.
138.
139. always @(*)begin
140. rom_area = h_cnt >=((HDE_CENTRE-60) + (THB-1)) && h_cnt < ((HDE_CENTRE+60) + (THB-1)) && v_cnt >= ((VDE_CENTRE-27)+(TVB-1)) && v_cnt < ((VDE_CENTRE+28) +(TVB-1));
141. end
142.
143.
144. always @(posedge clk or negedge rst_n)begin
145. if(rst_n==1'b0)begin
146. lcd_rgb <= 0;
147. end
148. else if(active_area)begin
149. if(rom_area)
150. lcd_rgb <= {rom_data[7:5],5'b11111,rom_data[4:2],5'b11111,rom_data[1:0],6'b111111};
151. else
152. lcd_rgb <= {24{1'b1}};
153. end
154. else begin
155. lcd_rgb <=0;
156. end
157. end
158.
159.
160. always @(*)begin
161. if(active_area && rom_area)begin
162. rom_addr = (h_cnt-((HDE_CENTRE-60)+(THB-1))) + 120*(v_cnt-((VDE_CENTRE-27)+(TVB-1)));
163. end
164. end
165.
166.
167.
168.
169. fpga_rom u_fpga_rom(
170. .address (rom_addr),
171. .clock (clk ),
172. .q (rom_data));
173.
174.
175. endmodule
1.5 效果和總結(jié)
以下為工程上板后的現(xiàn)象效果圖:
? mp801開發(fā)板

? ms980試驗箱

感興趣的朋友也可以訪問明德?lián)P論壇(http://www.fpgabbs.cn/)進行FPGA相關(guān)工程設(shè)計學(xué)習(xí),也可以看一下我們往期的文章:
源工程和設(shè)計教學(xué)視頻請到論壇下載學(xué)習(xí):FPGA至簡設(shè)計案例200例【分享貼】
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1134&fromuid=9437
(出處: 明德?lián)P論壇)
公司簡介
明德?lián)P是一家專注于FPGA領(lǐng)域的專業(yè)性公司,公司主要業(yè)務(wù)包括開發(fā)板、教育培訓(xùn)、項目承接、人才服務(wù)等多個方向。
點撥開發(fā)板——學(xué)習(xí)FPGA的入門之選。
MP801開發(fā)板——千兆網(wǎng)、ADDA、大容量SDRAM等,學(xué)習(xí)和項目需求一步到位。
網(wǎng)絡(luò)培訓(xùn)班——不管時間和空間,明德?lián)P隨時在你身邊,助你快速學(xué)習(xí)FPGA。
周末培訓(xùn)班——明天的你會感激現(xiàn)在的努力進取,升職加薪明德?lián)P來助你。
就業(yè)培訓(xùn)班——七大企業(yè)級項目實訓(xùn),獲得豐富的項目經(jīng)驗,高薪就業(yè)。
專題課程——高手修煉課:提升設(shè)計能力;實用調(diào)試技巧課:提升定位和解決問題能力;FIFO架構(gòu)設(shè)計課:助你快速成為架構(gòu)設(shè)計師;時序約束、數(shù)字信號處理、PCIE、綜合項目實踐課等你來選。
項目承接——承接企業(yè)FPGA研發(fā)項目。
人才服務(wù)——提供人才推薦、人才代培、人才派遣等服務(wù)。