天天看點

VGA相關練習一.VGA

目錄

  • 一.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)管腳相關示意圖

VGA相關練習一.VGA

(2)顯示結果

VGA相關練習一.VGA

二.參考資料

參考:

  1. https://blog.csdn.net/cchulu/article/details/73876978
  2. https://blog.csdn.net/chengfengwenalan/article/details/79854730
  3. https://blog.csdn.net/u013793399/article/details/51319235