目錄
- 一.VGA
-
-
- 1.VGA的原理
- 2.基于FPGA的VGA顯示
-
- 3.實驗
- 二.參考資料
-
一.VGA
1.VGA的原理
VGA驅動顯示器用的是掃描的方式,一般是逐行掃描。
2.基于FPGA的VGA顯示
附上部分代碼,完整可以進入下網站摘用
https://blog.csdn.net/cchulu/article/details/73876978
module VGA_test(
OSC_50, //原CLK2_50時鐘信号
VGA_CLK, //VGA自時鐘
VGA_HS, //行同步信号
VGA_VS, //場同步信号
VGA_BLANK, //複合空白信号控制信号 當BLANK為低電平時模拟視訊輸出消隐電平,此時從R9~R0,G9~G0,B9~B0輸入的所有資料被忽略
VGA_SYNC, //符合同步控制信号 行時序和場時序都要産生同步脈沖
VGA_R, //VGA綠色
VGA_B, //VGA藍色
VGA_G); //VGA綠色
input OSC_50; //外部時鐘信号CLK2_50
output VGA_CLK,VGA_HS,VGA_VS,VGA_BLANK,VGA_SYNC;
output [7:0] VGA_R,VGA_B,VGA_G;
parameter H_FRONT = 16; //行同步前沿信号周期長
parameter H_SYNC = 96; //行同步信号周期長
parameter H_BACK = 48; //行同步後沿信号周期長
parameter H_ACT = 640; //行顯示周期長
parameter H_BLANK = H_FRONT+H_SYNC+H_BACK; //行空白信号總周期長
parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT; //行總周期長耗時
parameter V_FRONT = 11; //場同步前沿信号周期長
parameter V_SYNC = 2; //場同步信号周期長
parameter V_BACK = 31; //場同步後沿信号周期長
parameter V_ACT = 480; //場顯示周期長
parameter V_BLANK = V_FRONT+V_SYNC+V_BACK; //場空白信号總周期長
parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT; //場總周期長耗時
reg [10:0] H_Cont; //行周期計數器
reg [10:0] V_Cont; //場周期計數器
wire [7:0] VGA_R; //VGA紅色控制線
wire [7:0] VGA_G; //VGA綠色控制線
wire [7:0] VGA_B; //VGA藍色控制線
reg VGA_HS;
reg VGA_VS;
reg [10:0] X; //目前行第幾個像素點
reg [10:0] Y; //目前場第幾行
reg CLK_25;
[email protected](posedge OSC_50)
begin
CLK_25=~CLK_25; //時鐘
end
assign VGA_SYNC = 1'b0; //同步信号低電平
assign VGA_BLANK = ~((H_Cont<H_BLANK)||(V_Cont<V_BLANK)); //當行計數器小于行空白總長或場計數器小于場空白總長時,空白信号低電平
assign VGA_CLK = ~CLK_to_DAC; //VGA時鐘等于CLK_25取反
assign CLK_to_DAC = CLK_25;
[email protected](posedge CLK_to_DAC)
begin
if(H_Cont<H_TOTAL) //如果行計數器小于行總時長
H_Cont<=H_Cont+1'b1; //行計數器+1
else H_Cont<=0; //否則行計數器清零
if(H_Cont==H_FRONT-1) //如果行計數器等于行前沿空白時間-1
VGA_HS<=1'b0; //行同步信号置0
if(H_Cont==H_FRONT+H_SYNC-1) //如果行計數器等于行前沿+行同步-1
VGA_HS<=1'b1; //行同步信号置1
if(H_Cont>=H_BLANK) //如果行計數器大于等于行空白總時長
X<=H_Cont-H_BLANK; //X等于行計數器-行空白總時長 (X為目前行第幾個像素點)
else X<=0; //否則X為0
end
[email protected](posedge VGA_HS)
begin
if(V_Cont<V_TOTAL) //如果場計數器小于行總時長
V_Cont<=V_Cont+1'b1; //場計數器+1
else V_Cont<=0; //否則場計數器清零
if(V_Cont==V_FRONT-1) //如果場計數器等于場前沿空白時間-1
VGA_VS<=1'b0; //場同步信号置0
if(V_Cont==V_FRONT+V_SYNC-1) //如果場計數器等于行前沿+場同步-1
VGA_VS<=1'b1; //場同步信号置1
if(V_Cont>=V_BLANK) //如果場計數器大于等于場空白總時長
Y<=V_Cont-V_BLANK; //Y等于場計數器-場空白總時長 (Y為目前場第幾行)
else Y<=0; //否則Y為0
end
reg valid_yr;
[email protected](posedge CLK_to_DAC)
if(V_Cont == 10'd32) //場計數器=32時
valid_yr<=1'b1; //行輸入激活
else if(V_Cont==10'd512) //場計數器=512時
valid_yr<=1'b0; //行輸入當機
wire valid_y=valid_yr; //連線
reg valid_r;
[email protected](posedge CLK_to_DAC)
if((H_Cont == 10'd32)&&valid_y) //行計數器=32時
valid_r<=1'b1; //像素輸入激活
else if((H_Cont==10'd512)&&valid_y) //行計數器=512時
valid_r<=1'b0; //像素輸入當機
wire valid = valid_r; //連線
wire[10:0] x_dis; //像素顯示控制信号
wire[10:0] y_dis; //行顯示控制信号
assign x_dis=X; //連線X
assign y_dis=Y; //連線Y
reg[8:0] char_bit;
[email protected](posedge CLK_to_DAC)
if(X==10'd144)char_bit<=9'd272; //當顯示到144像素時準備開始輸出圖像資料
else if(X>10'd144&&X<10'd416) //左邊距螢幕144像素到416像素時 416=144+272(圖像寬度)
char_bit<=char_bit-1'b1; //倒着輸出圖像資訊
reg[29:0] vga_rgb; //定義顔色緩存
[email protected](posedge CLK_to_DAC)
if(X>10'd144&&X<10'd416) //X控制圖像的橫向顯示邊界:左邊距螢幕左邊144像素 右邊界距螢幕左邊界416像素
begin case(Y) //Y控制圖像的縱向顯示邊界:從距離螢幕頂部160像素開始顯示第一行資料
10'd160:
endcase
end
else vga_rgb<=30'h000000000; //否則黑色
assign VGA_R=vga_rgb[23:16];
assign VGA_G=vga_rgb[15:8];
assign VGA_B=vga_rgb[7:0];
endmodule
3.實驗
(1)管腳相關示意圖
(2)顯示結果
二.參考資料
參考:
- https://blog.csdn.net/cchulu/article/details/73876978
- https://blog.csdn.net/chengfengwenalan/article/details/79854730
- https://blog.csdn.net/u013793399/article/details/51319235