官方论坛
官方淘宝
官方博客
微信公众号
点击联系吴工 点击联系周老师

【案例】LCD显示图片

发布时间:2023-04-13   作者:admin 浏览量:

--作者:肖肖肖

本文为明德扬原创及录用文章,转载请注明出处!

1.1 总体设计

1.1.1 概述

液晶显示器是一种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。

1.1.2 设计目标

在7寸LCD显示屏上实现图片的居中显示。

1.1.3 系统结构框图

系统结构框图如下所示:

「每周FPGA案例」至简设计系列_LCD显示图片

1.1.4 模块功能

Ø PLL模块实现功能

1. 将输入的50MHz时钟分频输出40MHz时钟。

Ø ROM模块实现功能

2. 存储图像数据。

Ø LCD驱动模块实现功能

1、 产生驱动LCD屏显示的时序

2、 读取ROM里存储的数据并输出显示

1.1.5 顶层信号

「每周FPGA案例」至简设计系列_LCD显示图片

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 接口信号

下面为使用矩阵键盘时的接口信号:

「每周FPGA案例」至简设计系列_LCD显示图片

1.2.2 设计思路

本模块主要用于产生LCD驱动时序所需要的时钟,关于PLL的使用详细介绍请看下方链接:

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105

1.3 ROM模块设计

1.3.1 接口信号


「每周FPGA案例」至简设计系列_LCD显示图片

1.3.2 设计思路

本模块主要用于存储需要显示的图像数据,关于ROM的使用详细介绍请看下方数据手册:


1.4 LCD驱动模块设计

1.4.1 接口信号

「每周FPGA案例」至简设计系列_LCD显示图片

1.4.2 设计思路

产生驱动LCD显示的行场时序信号,其计数器架构如下图所示:

「每周FPGA案例」至简设计系列_LCD显示图片

行计数器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<(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 效果和总结

以下为工程上板后的现象效果图:

Ø mp801开发板

「每周FPGA案例」至简设计系列_LCD显示图片

Ø ms980试验箱

「每周FPGA案例」至简设计系列_LCD显示图片

感兴趣的朋友也可以访问明德扬论坛(http://www.fpgabbs.cn/)进行FPGA相关工程设计学习,也可以看一下我们往期的文章:

源工程和设计教学视频请到论坛下载学习:FPGA至简设计案例200例【分享贴】
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1134&fromuid=9437
(出处: 明德扬论坛)



公司简介

明德扬是一家专注于FPGA领域的专业性公司,公司主要业务包括开发板、教育培训、项目承接、人才服务等多个方向。
点拨开发板——学习FPGA的入门之选。
MP801开发板——千兆网、ADDA、大容量SDRAM等,学习和项目需求一步到位。
网络培训班——不管时间和空间,明德扬随时在你身边,助你快速学习FPGA。
周末培训班——明天的你会感激现在的努力进取,升职加薪明德扬来助你。
就业培训班——七大企业级项目实训,获得丰富的项目经验,高薪就业。
专题课程——高手修炼课:提升设计能力;实用调试技巧课:提升定位和解决问题能力;FIFO架构设计课:助你快速成为架构设计师;时序约束、数字信号处理、PCIE、综合项目实践课等你来选。
项目承接——承接企业FPGA研发项目。
人才服务——提供人才推荐、人才代培、人才派遣等服务。

   拓展阅读