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
72
31
40
125
21
832
800/600
128
85
806
37
1056
56
36
1024
50
120
611
53
1040
2.垂直時序:
2
30
484
9
525
26
3
7
520
28
1
20
604
-1
625
4
628
6
35
666
vga行時序:
vga場時序:
vga顔色顯示原理:
通過三基色r,g,b的不同組合,顯示出不同的顔色。
三基色示意圖如下:
三基色顔色編碼:
顔色
黑
藍
紅
紫
綠
青
黃
白
r
g
b
代碼部分:
/******************************
********************************/
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 clk
or negedge rst_n)
if(!rst_n)
lcd_hs_cnt <=
10'd0;
else
if(lcd_hs_cnt==lcd_hs_cnt)
lcd_hs_cnt <= lcd_hs_cnt
+ 1'b1;
reg lcd_hs;
lcd_hs <=
1'b0;
if(lcd_hs_cnt<96)
1'b1;
[9:0] lcd_vs_cnt;//場同步計數
lcd_vs_cnt <=
if(lcd_hs_cnt==lcd_hs_cnt
&& lcd_vs_cnt==lcd_vs_cnt)
lcd_vs_cnt <= lcd_vs_cnt
if(lcd_vs_cnt==lcd_vs_cnt)
lcd_vs_cnt <= lcd_vs_cnt;
reg lcd_vs;
lcd_vs <=
if(lcd_vs_cnt<2)
[24:0]time_1s;
//1s計數器
time_1s <=
25'd0;
if(time_1s ==
24_999_999)
time_1s <= time_1s
[3:0]time_1s_cnt;
//計數1s的個數
always
@(posedge clk or
negedge rst_n)
time_1s_cnt<=
4'd0;
if(time_1s_cnt==14)
time_1s_cnt <=
if(time_1s==24_999_999)
time_1s_cnt <= time_1s_cnt
time_1s_cnt <= time_1s_cnt;
[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)
<= 516));
end
//c:2*2 4部分,将646*484分成4部分
[9:0]valid_area_c1;
//畫出矩形,長為:464-141=323,寬為:274-32=242
valid_area_c1 =
<= 464)
<= 274));
[9:0]valid_area_c2;
//畫出矩形,長為:787-464=323,寬為:274-32=242
valid_area_c2 =
((lcd_hs_cnt >=464)
[9:0]valid_area_c3;
//畫出矩形,長為:464-141=323,寬為:516-274=242
valid_area_c3 =
>= 274)
//d:3*3 9部分,将646*484分成9部分
[9:0]valid_area_d1;
//畫出矩形,長為:356-141=215,寬為:193-32=161
valid_area_d1 =
<= 356)
<= 193));
[9:0]valid_area_d2;
//畫出矩形,長為:571-356=215,寬為:354-193=161
valid_area_d2 =
((lcd_hs_cnt >=356)
<= 571)
[9:0]valid_area_d3;
//畫出矩形,長為:787-571=216,寬為:516-354=162
valid_area_d3 =
((lcd_hs_cnt >=571)
[9:0]valid_area_d4;
valid_area_d4 =
>= 193)
<= 354));
[9:0]valid_area_d5;
valid_area_d5 =
[9:0]valid_area_d6;
valid_area_d6 =
[9:0]valid_area_d7;
valid_area_d7 =
>= 354)
[9:0]valid_area_d8;
valid_area_d8 =
//e:150*100邊框
[9:0]valid_area_e;
valid_area_e =
((lcd_hs_cnt >=389)
<= 539)
>= 224)
<= 324));
[9:0]valid_area_e1;
valid_area_e1 =
(((lcd_hs_cnt >=
389)
&& (lcd_hs_cnt <=
409))
|
((lcd_hs_cnt
>= 519)
<= 539))
((lcd_vs_cnt
<= 244))
((lcd_vs_cnt
>= 304)
<= 324)));
[7:0]lcd_data;
lcd_data <=
8'h0;
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
8'b111_111_11;
//全白
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;
//藍
if(valid_area_c3)
lcd_data <=8'b000_111_00;
//綠
else
lcd_data <=8'b111_111_00;
//黃
if(time_1s_cnt>=9
&& time_1s_cnt<=11)
//d
if(valid_area_d1)
lcd_data <=8'b111_000_00;//紅
if(valid_area_d2)
lcd_data <=8'b111_111_00;//黃
if(valid_area_d3)
lcd_data <=8'b000_000_11;//藍
if(valid_area_d4)
lcd_data <=8'b000_111_00;//綠
if(valid_area_d5)
lcd_data <=8'b000_000_00;//黑
if(valid_area_d6)
lcd_data <=8'b111_000_11;//紫
if(valid_area_d7)
lcd_data <=8'b111_111_11;//白
if(valid_area_d8)
lcd_data <=8'b000_111_11;//青
lcd_data <=8'b000_111_10;//粉(不知)
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;//白
lcd_data <=8'b111_111_11;//白
end
8'h0;
//black
endmodule
ps:行邊沿從141開始,場邊沿從32開始,使得圖像在顯示屏的中心顯示。
在電腦顯示屏上的顯示結果如下: