1. 程式人生 > >FPGA VGA顯示

FPGA VGA顯示

VGA介面有15針,3排,每排5針。它是顯示卡上應用最廣泛的介面型別,傳輸紅/綠/藍以及同步訊號(水平以及垂直訊號)。

如圖所示,

VGA顯示器一般從左上角開始掃描,從左向右逐點掃描,每掃描完一行後,向下移動一行,繼續掃描。在這期間,CRT對電子束進行消隱,每行結束時,用行同步訊號進行同步;當掃描完所有行,形成一幀圖片時,用場同步訊號進行同步,使掃描回到螢幕的左上角,同時進行消隱,開始下一幀。

完成一行掃描的時間為水平掃描時間,倒數為行頻率;完成一幀的掃描時間為垂直掃描時間,倒數為場頻率。基本上用場頻率來表示顯示屏的重新整理頻率。

當計算設計的FPGA的時鐘頻率時需要考慮到無效顯示區。以

[email protected](60Hz)為例,每場對應806個行週期,其中768為顯示行。每顯示行包括1344點時鐘,其中1024點為有效顯示區。由此可知:需要時鐘頻率:806*1344*60約65MHz。

行時序/場時序都需要同步脈衝(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  輸入相應的畫素,*****注意在下降沿觸發*****。