VGA接口时序练习之图像动态显示
来源:互联网 发布:格力空调代码含义 知乎 编辑:程序博客网 时间:2024/05/17 03:42
Vga练习之动态显示图案
Vga接口应用,并在电脑显示屏上显示
功能:每隔3s变化一次,a~e循环变换
a.全红
b.全白
c.2*2 4部分,分别是:红,蓝,绿,黄
d.3*3 9部分,分别是:红黄蓝绿黑紫白青粉
e.150*100矩形边框,边缘是20宽度的绿色框,其他为白色
分辨率:600*480
VGA支持的规格:
1.水平时序:
分辨率
刷新速率
像素频率
同步脉冲
后沿
有效时间
前沿
帧长
640/480
60
25
96
45
646
13
800
640/480
72
31
40
125
646
21
832
800/600
60
40
128
85
806
37
1056
800/600
56
36
72
125
806
21
1024
800/600
72
50
120
611
806
53
1040
2.垂直时序:
分辨率
刷新速率
像素频率
同步脉冲
后沿
有效时间
前沿
帧长
640/480
60
31
2
30
484
9
525
640/480
72
26
3
26
484
7
520
800/600
56
28
1
20
604
-1
625
800/600
60
26
4
21
604
-1
628
800/600
72
20
6
21
604
35
666
VGA行时序:
VGA场时序:
VGA颜色显示原理:
通过三基色r,g,b的不同组合,显示出不同的颜色。
三基色示意图如下:
三基色颜色编码:
颜色
黑
蓝
红
紫
绿
青
黄
白
R
0
0
1
1
0
0
1
1
G
0
0
0
0
1
1
1
1
B
0
1
0
1
0
1
0
1
代码部分:
/******************************
分辨率:600*480
功能:每隔3s变化一次,a~e循环变换
a.全红
b.全白
c.2*2 4部分,分别是:红,蓝,绿,黄
d.3*3 9部分,分别是:红黄蓝绿黑紫白青粉
e.150*100矩形边框,边缘是20宽度的绿色框,其他为白色
********************************/
module VGA_test4(clk,rst_n,lcd_data,lcd_hs,lcd_vs);
input clk; //25mhz
input rst_n;
output lcd_vs;//场同步信号
output lcd_hs;//行同步信号
output [7:0]lcd_data;//lcd_data[1:0]是B,
//lcd_data[4:2]是G,lcd_data[7:5]是R
parameter LCD_HS_CNT= 799,
LCD_VS_CNT = 524;
reg [9:0] lcd_hs_cnt;//行同步计数
always@(posedge clkor negedge rst_n)
if(!rst_n)
lcd_hs_cnt <=10'd0;
else if(lcd_hs_cnt==LCD_HS_CNT)
lcd_hs_cnt <=10'd0;
else
lcd_hs_cnt <= lcd_hs_cnt+ 1'b1;
reg lcd_hs;
always@(posedge clkor negedge rst_n)
if(!rst_n)
lcd_hs <=1'b0;
else if(lcd_hs_cnt<96)
lcd_hs <=1'b0;
else
lcd_hs <=1'b1;
reg [9:0] lcd_vs_cnt;//场同步计数
always@(posedge clkor negedge rst_n)
if(!rst_n)
lcd_vs_cnt <=10'd0;
else if(lcd_hs_cnt==LCD_HS_CNT&& lcd_vs_cnt==LCD_VS_CNT)
lcd_vs_cnt <=10'd0;
else if(lcd_hs_cnt==LCD_HS_CNT)
lcd_vs_cnt <= lcd_vs_cnt+ 1'b1;
else if(lcd_vs_cnt==LCD_VS_CNT)
lcd_vs_cnt <= lcd_vs_cnt;
reg lcd_vs;
always@(posedge clkor negedge rst_n)
if(!rst_n)
lcd_vs <=1'b0;
else if(lcd_vs_cnt<2)
lcd_vs <=1'b0;
else
lcd_vs <=1'b1;
reg [24:0]time_1s; //1s计数器
always@(posedge clkor negedge rst_n)
if(!rst_n)
time_1s <=25'd0;
else if(time_1s ==24_999_999)
time_1s <=25'd0;
else
time_1s <= time_1s+ 1'b1;
reg [3:0]time_1s_cnt; //计数1s的个数
always @(posedge clk ornegedge rst_n)
if(!rst_n)
time_1s_cnt<=4'd0;
else if(time_1s_cnt==14)
time_1s_cnt <=4'd0;
else if(time_1s==24_999_999)
time_1s_cnt <= time_1s_cnt+ 1'b1;
else
time_1s_cnt <= time_1s_cnt;
reg [9:0]valid_area; //画出矩形,长为:787-141=646,宽为:516-32=484
always@(*)begin
valid_area = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 516));
end
//c:2*2 4部分,将646*484分成4部分
reg [9:0]valid_area_c1;//画出矩形,长为:464-141=323,宽为:274-32=242
always@(*)begin
valid_area_c1 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 464)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 274));
end
reg [9:0]valid_area_c2;//画出矩形,长为:787-464=323,宽为:274-32=242
always@(*)begin
valid_area_c2 = ((lcd_hs_cnt >=464)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 274));
end
reg [9:0]valid_area_c3;//画出矩形,长为:464-141=323,宽为:516-274=242
always@(*)begin
valid_area_c3 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 464)&& (lcd_vs_cnt>= 274)&& (lcd_vs_cnt<= 516));
end
//d:3*3 9部分,将646*484分成9部分
reg [9:0]valid_area_d1;//画出矩形,长为:356-141=215,宽为:193-32=161
always@(*)begin
valid_area_d1 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));
end
reg [9:0]valid_area_d2;//画出矩形,长为:571-356=215,宽为:354-193=161
always@(*)begin
valid_area_d2 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));
end
reg [9:0]valid_area_d3;//画出矩形,长为:787-571=216,宽为:516-354=162
always@(*)begin
valid_area_d3 = ((lcd_hs_cnt >=571)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));
end
reg [9:0]valid_area_d4;//画出矩形,长为:356-141=215,宽为:193-32=161
always@(*)begin
valid_area_d4 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));
end
reg [9:0]valid_area_d5;//画出矩形,长为:571-356=215,宽为:354-193=161
always@(*)begin
valid_area_d5 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));
end
reg [9:0]valid_area_d6;//画出矩形,长为:787-571=216,宽为:516-354=162
always@(*)begin
valid_area_d6 = ((lcd_hs_cnt >=571)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));
end
reg [9:0]valid_area_d7;//画出矩形,长为:356-141=215,宽为:193-32=161
always@(*)begin
valid_area_d7 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 354)&& (lcd_vs_cnt<= 516));
end
reg [9:0]valid_area_d8;//画出矩形,长为:571-356=215,宽为:354-193=161
always@(*)begin
valid_area_d8 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 354)&& (lcd_vs_cnt<= 516));
end
//e:150*100边框
reg [9:0]valid_area_e;
always@(*)begin
valid_area_e = ((lcd_hs_cnt >=389)&& (lcd_hs_cnt<= 539)&& (lcd_vs_cnt>= 224)&& (lcd_vs_cnt<= 324));
end
reg [9:0]valid_area_e1;
always@(*)begin
valid_area_e1 = (((lcd_hs_cnt >=389) && (lcd_hs_cnt <=409)) |
((lcd_hs_cnt>= 519)&& (lcd_hs_cnt<= 539))|
((lcd_vs_cnt>= 224)&& (lcd_vs_cnt<= 244))|
((lcd_vs_cnt>= 304)&& (lcd_vs_cnt<= 324)));
end
reg [7:0]lcd_data;
always@(posedge clkor negedge rst_n)
if(!rst_n)
lcd_data <=8'h0;
else if(valid_area)begin
if(time_1s_cnt>=0&& time_1s_cnt<=2) //a
lcd_data <=8'b111_000_00; //全红
else if(time_1s_cnt>=3&& time_1s_cnt<=5) //b
lcd_data <=8'b111_111_11; //全白
else if(time_1s_cnt>=6&& time_1s_cnt<=8) //c
if(valid_area_c1)
lcd_data <=8'b111_000_00; //红
else if(valid_area_c2)
lcd_data <=8'b000_000_11; //蓝
else if(valid_area_c3)
lcd_data <=8'b000_111_00; //绿
else
lcd_data <=8'b111_111_00; //黄
else if(time_1s_cnt>=9&& time_1s_cnt<=11) //d
if(valid_area_d1)
lcd_data <=8'b111_000_00;//红
else if(valid_area_d2)
lcd_data <=8'b111_111_00;//黄
else if(valid_area_d3)
lcd_data <=8'b000_000_11;//蓝
else if(valid_area_d4)
lcd_data <=8'b000_111_00;//绿
else if(valid_area_d5)
lcd_data <=8'b000_000_00;//黑
else if(valid_area_d6)
lcd_data <=8'b111_000_11;//紫
else if(valid_area_d7)
lcd_data <=8'b111_111_11;//白
else if(valid_area_d8)
lcd_data <=8'b000_111_11;//青
else
lcd_data <=8'b000_111_10;//粉(不知)
else if(time_1s_cnt>=12&& time_1s_cnt<=14) //e
if(valid_area_e)
if(valid_area_e1)
lcd_data <=8'b000_111_00;//绿
else
lcd_data <=8'b111_111_11;//白
else
lcd_data <=8'b111_111_11;//白
end
else
lcd_data <=8'h0; //black
endmodule
ps:行边沿从141开始,场边沿从32开始,使得图像在显示屏的中心显示。
在电脑显示屏上的显示结果如下:
- VGA接口时序练习之图像动态显示
- VGA练习之图像的动态显示(后续)
- RGB VGA显示时序
- VGA显示原理与VGA时序实现
- VGA接口之显示彩色条
- 视频图像传输与显示(5)——视频图像阵列VGA及其时序的VHDL实现
- VGA时序
- VmodCAM图像采集 VGA显示
- VGA 之 图片显示
- 嵌入式平台的VGA接口设计及VGA接口时序波形图
- 嵌入式高分辨率VGA图像显示方法研究
- VGA 时序 说明
- VGA时序及其原理
- VGA时序及其原理
- VGA时序标准大全
- VGA时序及其原理
- VGA时序及其原理
- VGA时序及其原理
- win10下详细配置nodejs+express4开发环境
- VS2015 ATL 在XP 系统下无法注册
- Android Context完全解析,你所不知道的Context的各种细节
- Javascript中Event属性大全
- gettid 和pthread_self的区别
- VGA接口时序练习之图像动态显示
- JSON中JObject和JArray,JValue序列化(Linq)
- 如何打造一个可以无限注册账号的手机
- linux编译boost
- 互联网推送服务原理:长连接+心跳机制(MQTT协议)
- Spring学习笔记(十三):jsp、freemarker、velocity的区别
- Objective-c语言_基本数据类型封装和拆包
- 解决Xcode 9.2系统真机测试时出现 could not find developer disk image问题
- Java线程面试题 Top 50