--作者:肖肖肖
本文为明德扬原创及录用文章,转载请注明出处!
液晶显示器是一种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。
在7寸LCD显示屏上实现图片的居中显示。
系统结构框图如下所示:
1. 将输入的50MHz时钟分频输出40MHz时钟。
2. 存储图像数据。
1、 产生驱动LCD屏显示的时序
2、 读取ROM里存储的数据并输出显示
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
下面为使用矩阵键盘时的接口信号:
本模块主要用于产生LCD驱动时序所需要的时钟,关于PLL的使用详细介绍请看下方链接:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105
本模块主要用于存储需要显示的图像数据,关于ROM的使用详细介绍请看下方数据手册:
产生驱动LCD显示的行场时序信号,其计数器架构如下图所示:
行计数器h_cnt:该计数器用来计算行同步信号的帧长。加一条件为1,表示一直在计数。结束条件为数1056个,也就是一行有1056个像素。
场计数器v_cnt:该计数器用来计算场同步信号的帧长。加一条件为end_h_cnt,即行计数器的计数器的结束条件,表示每计数完一行像素就加一。结束条件为数525个,也就是一共有525行像素。
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
以下为工程上板后的现象效果图:
感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:
《至简设计系列_LCD入门案例_边框显示》
《至简设计系列_BCD译码实现》
《至简设计系列_简易计算器》
《至简设计系列_基于FPGA的超声波测距系统设计》
《至简设计系列_串口回环工程》
《至简设计系列_矩阵按键检测》
《至简设计系列_闹钟》
《至简设计系列_7段数码管显示》
《阻塞赋值与非阻塞赋值》
《参数例化时自动计算位宽的解决办法》
明德扬是一家专注于FPGA领域的专业性公司,公司主要业务包括开发板、教育培训、项目承接、人才服务等多个方向。点拨开发板——学习FPGA的入门之选。MP801开发板——千兆网、ADDA、大容量SDRAM等,学习和项目需求一步到位。网络培训班——不管时间和空间,明德扬随时在你身边,助你快速学习FPGA。周末培训班——明天的你会感激现在的努力进取,升职加薪明德扬来助你。就业培训班——七大企业级项目实训,获得丰富的项目经验,高薪就业。专题课程——高手修炼课:提升设计能力;实用调试技巧课:提升定位和解决问题能力;FIFO架构设计课:助你快速成为架构设计师;时序约束、数字信号处理、PCIE、综合项目实践课等你来选。项目承接——承接企业FPGA研发项目。人才服务——提供人才推荐、人才代培、人才派遣等服务。
版权声明:我们致力于保护作者版权,注重分享,被刊用文章【fpga培训班(每周FPGA案例)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
