至简设计系列_LCD显示图片

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

1.1 总体设计

1.1.1 概述

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

1.1.2 设计目标

在7寸LCD显示屏上实现图片的居中显示。
1.1.3 系统结构框图
系统结构框图如下所示:
在这里插入图片描述

图一

1.1.4 模块功能

PLL模块实现功能
1.将输入的50MHz时钟分频输出40MHz时钟。
ROM模块实现功能
2.存储图像数据。

LCD驱动模块实现功能
1、产生驱动LCD屏显示的时序
2、读取ROM里存储的数据并输出显示

1.1.5 顶层信号

信号名I/O位宽定义
clkI1系统工作时钟 50M
rst_nI1系统复位信号,低电平有效
hysO1LCD 行时序信号
vysO1LCD 场时序信号
lcd_deO1LCD 数据输入使能信号
lcd_rgbO24LCD RGB信号,RGB格式为使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。
lcd_dclkO1LCD 数据采样时钟

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

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

信号名I/O位宽定义
aresetI1PLL复位信号,高电平有效
inclk0I1PLL输入时钟 50MHz
c0O1PLL输出时钟 40MHz

1.2.2 设计思路

本模块主要用于产生LCD驱动时序所需要的时钟,关于PLL的使用详细介绍请看下方链接:
http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=322&fromuid=100105

1.3 ROM模块设计

1.3.1 接口信号

信号名I/O位宽定义
addressI16ROM数据存放地址
clockI1ROM工作时钟40MHz
qO8ROM输出数据

1.3.2 设计思路

本模块主要用于存储需要显示的图像数据,关于ROM的使用详细介绍请看生成界面右上角的数据手册documentation。

1.4 LCD驱动模块设计

1.4.1 接口信号

信号名I/O位宽定义
clkI1模块工作时钟 40MHz
rst_nI1系统复位信号,低电平有效
hysO1LCD 行时序信号
vysO1LCD 场时序信号
lcd_deO1LCD 数据输入使能信号
lcd_rgbO24LCD RGB信号,RGB格式为使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。
lcd_dclkO1LCD 数据采样时钟

1.4.2 设计思路

产生驱动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开发板
在这里插入图片描述

ms980试验箱
在这里插入图片描述

感兴趣的朋友也可以访问明德扬论坛进行FPGA相关工程设计学习,也可以看一下我们往期的文章。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值