FPGA VGA顯示
VGA介面有15針,3排,每排5針。它是顯示卡上應用最廣泛的介面型別,傳輸紅/綠/藍以及同步訊號(水平以及垂直訊號)。
如圖所示,
VGA顯示器一般從左上角開始掃描,從左向右逐點掃描,每掃描完一行後,向下移動一行,繼續掃描。在這期間,CRT對電子束進行消隱,每行結束時,用行同步訊號進行同步;當掃描完所有行,形成一幀圖片時,用場同步訊號進行同步,使掃描回到螢幕的左上角,同時進行消隱,開始下一幀。
完成一行掃描的時間為水平掃描時間,倒數為行頻率;完成一幀的掃描時間為垂直掃描時間,倒數為場頻率。基本上用場頻率來表示顯示屏的重新整理頻率。
當計算設計的FPGA的時鐘頻率時需要考慮到無效顯示區。以
行時序/場時序都需要同步脈衝(Sync a)、顯示後沿(Back porch b)、顯示時序段(Display interval c)和顯示前沿(Front porch d)四部分。VGA工業標準顯示模式要求:行同步,場同步都為負極性,即同步脈衝要求是負脈衝。
採用16位高彩色,R5G6B5。電路上用電阻網路實現RGB數字訊號到模擬的轉換。
網路關係如下:
VGA_R=8*(2^4 * VGA_R4 + 2^3 * VGA_R3 + 2^2 * VGA_R2 + 2^1 * VGA_R1 + 2^0 * VGA_R0 )
其餘分量同理
軟體設計部分,描述上述的vga時序圖
always @ (posedge vga_clk) if(~rst_n) x_cnt <= 1; else if(x_cnt == LinePeriod) x_cnt <= 1; else x_cnt <= x_cnt+ 1; //---------------------------------------------------------------- ////////// 水平掃描訊號hsync,hsync_de產生 //---------------------------------------------------------------- always @ (posedge vga_clk) begin if(~rst_n) hsync_r <= 1'b1; else if(x_cnt == 1) hsync_r <= 1'b0; //產生hsync訊號 else if(x_cnt == H_SyncPulse) hsync_r <= 1'b1; if(~rst_n) hsync_de <= 1'b0; else if(x_cnt == Hde_start) hsync_de <= 1'b1; //產生hsync_de訊號 else if(x_cnt == Hde_end) hsync_de <= 1'b0; end
//---------------------------------------------------------------- ////////// 垂直掃描計數 //---------------------------------------------------------------- always @ (posedge vga_clk) if(~rst_n) y_cnt <= 1; else if(y_cnt == FramePeriod) y_cnt <= 1; else if(x_cnt == LinePeriod) y_cnt <= y_cnt+1;
//---------------------------------------------------------------- ////////// 垂直掃描訊號vsync, vsync_de產生 //---------------------------------------------------------------- always @ (posedge vga_clk) begin if(~rst_n) vsync_r <= 1'b1; else if(y_cnt == 1) vsync_r <= 1'b0; //產生vsync訊號 else if(y_cnt == V_SyncPulse) vsync_r <= 1'b1; if(~rst_n) vsync_de <= 1'b0; else if(y_cnt == Vde_start) vsync_de <= 1'b1; //產生vsync_de訊號 else if(y_cnt == Vde_end) vsync_de <= 1'b0; end
hsync_de /vsync_de 為有效畫素的標誌位,高電平有效
接下來輸入需要顯示圖片的資料
always @(negedge vga_clk) if(~rst_n) begin vga_r_reg<=0; vga_g_reg<=0; vga_b_reg<=0; end else begin vga_r_reg<=xxxxxx; //需要的資料 vga_g_reg<=xxxxxxx; //需要的資料 vga_b_reg<=xxxxxx; //需要的資料 end
vga_r_reg/ vga_g_reg/vga_b_reg 輸入相應的畫素,*****注意在下降沿觸發*****。