至简设计系列_LCD入门案例_动态矩形

本设计基于FPGA实现LCD控制器,可在LCD上显示变化的蓝色矩形动画,矩形大小从2x2逐步增加至600x400。利用至简设计法和明德扬计数器模板,高效完成了设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第1节 至简设计系列_LCD入门案例_动态矩形
–作者:喝喝

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

1.1 总体设计

1.1.1 概述

液晶显示器是一-种通过液晶和色彩过滤器过滤光源,在平面面板上产生图像的数字显示器。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置薄膜晶体管,.上基板玻璃上设置彩色滤光片,通过薄膜晶体管上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。与传统的阴极射线管相比,LCD具有占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳等优点。现在LCD已渐替代CRT成为主流,价格也已经下降了很多,并已充分的普及。
本设计的主要任务是基于FPGA的LCD显示控制器设计,兼顾程序的易用性,方便此后模块的移植和应用。采用VHDL硬件描述语言在QUARTUS II软件平台上实现FPGA对LCD的控制,在LCD模块上实现任意彩色图片的显示,与此同时还须实现实时刷新数据的功能。这将有助于采用FPGA的系列产品的开发,特别是需要用到LCD而采用FPGA的产品的开发。不但缩短了FPGA的开发周期,也使更多采用FPGA设计的产品上出现LCD,增加了人机之间的交互性。

1.1.2 设计目标

此设计通过fpga给lcd发送图片信息,然后直接在LCD显示矩形动画,矩形的宽从2变化到600,矩形的高从2变化到400

1.1.3 信号列表

信号名接口方向定义
clk_50m输入系统时钟
rst_n输入低电平复位信号
lcd_hsync输出行同步信号
lcd_vsync输出场同步信号
lcd_de输出行和场同时显示时序段有效显示数据段信号
lcd_rgb输出显示颜色RGB[23:16]:表示的是R[7:0],[15:8]:表示的是G[7:0],[7:0]:表示的是B[7:0]
lcd_dclk输出像素时钟信号

1.1.4 设计思路

设计行显示时序段和场显示时序段,来确定矩形边框的宽度,根据各种颜色的数值来确定lcd显示屏显示出的边框颜色
行时钟计数器cnt_hys:用来计算行同步信号的帧长,加一条件是1,结束条件为数到1056个像素就结束
场时钟计数器cnt_vys:用来计算场同步信号的帧长,加一条件是场信号每数到1056个像素(即为一行结束的时刻),结束条件为数到525行就结束

1.1.5 参考代码

1.	module mdyLcdDispDynaRect( 
2.	    clk_50m     ,  
3.	    rst_n       , 
4.	
5.	    lcd_hsync   ,
6.	    lcd_vsync   ,
7.	    lcd_de      ,
8.	 
9.	
10.	    lcd_rgb     ,
11.	    lcd_dclk    
12.	       
13.	);
14.	
15.	    input               clk_50m     ;  
16.	    input               rst_n       ; 
17.	    output              lcd_hsync   ;
18.	    output              lcd_vsync   ;
19.	    output              lcd_de      ;
20.	
21.	    output  [23:0]      lcd_rgb     ;
22.	    output              lcd_dclk    ;
23.	      
24.	
25.	    reg    [30:0]        h;
26.		 reg     [30:0]        v;
27.		 
28.	    reg                 lcd_hsync   ;
29.	    reg                 lcd_vsync   ;
30.	 
31.	    reg     [23:0]      lcd_rgb     ;
32.	
33.	
34.	    parameter     LINE_PR   =  1056 ;       
35.	    parameter     FRAME_PER =   525 ;           
36.	
37.	
38.	    parameter     H_SYNC    =    20 ;       
39.	    parameter     V_SYNC    =    10 ;              
40.	
41.	    parameter     HDE_START =    46 ;
42.	    parameter     HDE_END   =   846 ;
43.	    parameter     VDE_START =    23 ;
44.	    parameter     VDE_END   =   503 ;
45.	
46.	    
47.	
48.	    reg    [12:0]     cnt_hsy       ;
49.	    reg    [12:0]     cnt_vsy       ;
50.	    reg               hsync_de      ;
51.	    reg               vsync_de      ;
52.	
53.	    wire              display_area  ;
54.	    wire              e_area        ;
55.	    wire              add_cnt_hsy   ;
56.	    wire              end_cnt_hsy   ;
57.	    wire              add_cnt_vsy   ;
58.	    wire              end_cnt_vsy   ;
59.	    reg [ 7:0]        cnt0          ;
60.	    wire              add_cnt0      ;
61.	    wire              end_cnt0      ;
62.	    reg  [15:0]       cnt1          ;
63.	    wire              add_cnt1      ;
64.	    wire              end_cnt1      ;
65.	
66.	
67.	    assign clk       = clk_50m              ;
68.	    assign lcd_dclk  = ~ clk_50m            ;
69.	    assign lcd_de    = hsync_de & vsync_de  ;
70.	    
71.	    
72.	
73.	
74.	    always @ (posedge clk or negedge rst_n)begin
75.	            if(!rst_n)begin
76.	                cnt_hsy <= 0;
77.	            end
78.	            else if(add_cnt_hsy)begin
79.	                if(end_cnt_hsy)
80.	                    cnt_hsy <= 0;
81.	                else
82.	                    cnt_hsy <= cnt_hsy + 1;
83.	            end
84.	        end
85.	    
86.	    assign add_cnt_hsy = 1;
87.	    assign end_cnt_hsy = add_cnt_hsy && cnt_hsy == LINE_PR -1;
88.	    
89.	
90.	    always @ (posedge clk or negedge rst_n)begin
91.	        if(!rst_n)begin
92.	            cnt_vsy <= 0;
93.	        end
94.	        else if(add_cnt_vsy)begin
95.	            if(end_cnt_vsy)
96.	                cnt_vsy <= 0;
97.	            else
98.	                cnt_vsy <= cnt_vsy + 1;
99.	        end
100.	    end
101.	   
102.	    assign add_cnt_vsy = end_cnt_hsy;
103.	    assign end_cnt_vsy = add_cnt_vsy && cnt_vsy == FRAME_PER - 1;
104.		 
105.	
106.	    always @ (posedge clk or negedge rst_n)begin
107.	        if(!rst_n)begin
108.	            lcd_hsync <= 1'b0 ;
109.	        end
110.	        else if(end_cnt_hsy)begin
111.	            lcd_hsync <= 1'b0;
112.	        end
113.	        else if(add_cnt_hsy && cnt_hsy == H_SYNC-1 )begin
114.	            lcd_hsync <= 1'b1;
115.	        end
116.	    end
117.	
118.	    always @ (posedge clk or negedge rst_n)begin
119.	        if(!rst_n)begin
120.	            hsync_de <= 1'b0;
121.	        end
122.	        else if(add_cnt_hsy && cnt_hsy == HDE_START-1)begin
123.	            hsync_de <= 1'b1;
124.	        end
125.	        else if(add_cnt_hsy && cnt_hsy == HDE_END-1)begin
126.	            hsync_de <= 1'b0;
127.	        end
128.	    end
129.	
130.		 
131.	    always @ (posedge clk or negedge rst_n)begin
132.	        if(!rst_n)begin
133.	            lcd_vsync <= 1'b0 ;
134.	        end
135.			  else if(add_cnt_vsy && cnt_vsy == V_SYNC-1 )begin
136.	            lcd_vsync <= 1'b1;
137.	        end
138.	        else if(end_cnt_vsy)begin
139.	            lcd_vsync <= 1'b0;
140.	        end
141.	
142.	    end
143.	
144.		 
145.	    always @ (posedge clk or negedge rst_n)begin
146.	        if(!rst_n)begin
147.	            vsync_de <= 1'b0;
148.	        end
149.	        else if(add_cnt_vsy && cnt_vsy == VDE_START-1)begin
150.	            vsync_de <= 1'b1;
151.	        end
152.	        else if(add_cnt_vsy && cnt_vsy ==VDE_END-1)begin
153.	            vsync_de <= 1'b0;
154.	        end
155.	    end
156.	
157.	
158.	    assign   display_area = hsync_de && vsync_de;
159.	
160.	
161.	    assign   blue_area = (cnt_hsy >= HDE_START + 400-h) && (cnt_hsy<HDE_START+400+h) && 
162.	                         (cnt_vsy >= VDE_START + 240-v) && (cnt_vsy<VDE_START+240+v) ; 
163.	
164.	                     
165.	
166.	        always  @(posedge clk or negedge rst_n)begin
167.	        if(rst_n==1'b0)begin
168.	            h<=1;
169.	        end
170.	        else if(end_cnt_vsy && h<300)begin
171.	            h<=h+2;
172.	        end
173.	    end
174.	
175.	    always  @(posedge clk or negedge rst_n)begin
176.	        if(rst_n==1'b0)begin
177.	            v<=1;
178.	        end
179.	        else if(end_cnt_vsy && v<200)begin
180.	            v<=v+1;
181.	        end
182.	    end
183.	
184.	
185.	    always @ (posedge clk or negedge rst_n)begin
186.	        if(!rst_n)begin
187.					lcd_rgb <= 0;
188.	        end
189.	        else if(display_area)begin
190.	            if(blue_area)begin
191.	                lcd_rgb <= 24'h00_00_ff ;
192.	            end
193.	            else begin
194.	                lcd_rgb <= 24'hff_ff_ff ;
195.	            end
196.	        end
197.	        else begin
198.	            lcd_rgb <= 0;
199.	        end
200.	    end
201.	
202.	
203.	
204.	endmodule

1.2 效果和总结

在这里插入图片描述

本案例我们设计了蓝色的矩形,蓝色矩形的场信号是从2行变到400行、行信号是从2个像素变到600个像素;
在这个设计案例中,至简设计法和明德扬计数器模板发挥了至关重要的作用,使我能够快速准确完成设计。希望有兴趣的同学可以运用至简设计法和明德扬模板尝试一下拓展设计哦。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值