--作者:肖肖肖
本文为明德扬原创及录用文章,转载请注明出处!
1.1 总体设计
1.1.1 概述
液晶显示器是一种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。
1.1.2 设计目标
在7寸LCD显示屏上实现图片的居中显示。
1.1.3 系统结构框图
系统结构框图如下所示:
![8bdbe5ec42bec43c37db9e6073dc731d.png](https://i-blog.csdnimg.cn/blog_migrate/9a75214018677c3f99f15e260c5a7ad7.jpeg)
1.1.4 模块功能
Ø PLL模块实现功能
1. 将输入的50MHz时钟分频输出40MHz时钟。
Ø ROM模块实现功能
2. 存储图像数据。
Ø LCD驱动模块实现功能
1、 产生驱动LCD屏显示的时序
2、 读取ROM里存储的数据并输出显示
1.1.5 顶层信号
![623b9906e7df069d0a28f79579523323.png](https://i-blog.csdnimg.cn/blog_migrate/5a44f79b452a1a2b78ab542352e75cd4.jpeg)
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模块设计
1.2.1 接口信号
下面为使用矩阵键盘时的接口信号:
![56d1105a17ae5fd69fcc73bc85211db1.png](https://i-blog.csdnimg.cn/blog_migrate/6de7615dfa81b474d1aa14becc2a182a.jpeg)
1.2.2 设计思路
本模块主要用于产生LCD驱动时序所需要的时钟,关于PLL的使用详细介绍请看下方链接:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105
1.3 ROM模块设计
1.3.1 接口信号
![9b3deb0dd67659787dfd739840207997.png](https://i-blog.csdnimg.cn/blog_migrate/09ff6515ca53a7f1b4b580c5088a7bfa.jpeg)
1.3.2 设计思路
本模块主要用于存储需要显示的图像数据,关于ROM的使用详细介绍请看下方数据手册:
1.4 LCD驱动模块设计
1.4.1 接口信号
![33824362caec685a05833c6c6f847401.png](https://i-blog.csdnimg.cn/blog_migrate/b6984e05bfb42fafb090bd42a87233ca.jpeg)
1.4.2 设计思路
产生驱动LCD显示的行场时序信号,其计数器架构如下图所示:
![6497cb89ac94b9a05a43a7c635799c2d.png](https://i-blog.csdnimg.cn/blog_migrate/cdd70b46db9ddb75e3183f14637babb1.jpeg)
行计数器h_cnt:该计数器用来计算行同步信号的帧长。加一条件为1,表示一直在计数。结束条件为数1056个,也就是一行有1056个像素。
场计数器v_cnt:该计数器用来计算场同步信号的帧长。加一条件为end_h_cnt,即行计数器的计数器的结束条件,表示每计数完一行像素就加一。结束条件为数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=(TVB-1) && v_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 效果和总结
以下为工程上板后的现象效果图:
Ø mp801开发板
![278945c91c25b361688a4e1e9fc57ea4.png](https://i-blog.csdnimg.cn/blog_migrate/32f724e8cea5bc46ce67ab40d97e3e72.jpeg)
Ø ms980试验箱
![f9c0ab776cead794243f0ee50eb50503.png](https://i-blog.csdnimg.cn/blog_migrate/bd36ab1bf305df1967ce94239275e598.jpeg)
感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:
《至简设计系列_LCD入门案例_边框显示》
《至简设计系列_BCD译码实现》
《至简设计系列_简易计算器》
《至简设计系列_基于FPGA的超声波测距系统设计》
《至简设计系列_串口回环工程》
《至简设计系列_矩阵按键检测》
《至简设计系列_闹钟》
《至简设计系列_7段数码管显示》
《阻塞赋值与非阻塞赋值》
《参数例化时自动计算位宽的解决办法》
1.1 公司简介
明德扬是一家专注于FPGA领域的专业性公司,公司主要业务包括开发板、教育培训、项目承接、人才服务等多个方向。
点拨开发板——学习FPGA的入门之选。
MP801开发板——千兆网、ADDA、大容量SDRAM等,学习和项目需求一步到位。
网络培训班——不管时间和空间,明德扬随时在你身边,助你快速学习FPGA。
周末培训班——明天的你会感激现在的努力进取,升职加薪明德扬来助你。
就业培训班——七大企业级项目实训,获得丰富的项目经验,高薪就业。
专题课程——高手修炼课:提升设计能力;实用调试技巧课:提升定位和解决问题能力;FIFO架构设计课:助你快速成为架构设计师;时序约束、数字信号处理、PCIE、综合项目实践课等你来选。
项目承接——承接企业FPGA研发项目。
人才服务——提供人才推荐、人才代培、人才派遣等服务。