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 clk or 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 clk or 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 clk or 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 clk or 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 clk or 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 or negedge 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 clk or 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開始,使得圖像在顯示屏的中心顯示。
在電腦顯示屏上的顯示結果如下: