1)行掃描時序圖

a:行同步時期,掃描地址的復位 b:行消隱后肩,掃描地址轉移后的穩定等待準備期 c:行顯示時期,數據有效區域 d:行消隱前肩,掃描地址轉移的準備 e:行掃描總時間,一行掃描的總時間
2)場掃描時序圖

o:場同步時期,掃描地址的復位 p:場消隱后肩,掃描地址轉移后的穩定等待準備期 q:場顯示時期,數據有效區域 r:場消隱前肩,掃描地址轉移的準備 s:場掃描總時間,一場掃描的總時間
3)VGA顯示器掃描軌跡

由于FPGA擅長計數電路這里采用像素表示法來設計驅動

FPGA硬件 測試時要將sys_pll中的輸出頻率改為25MHZ。
由亍目前液晶顯示器的普及,而高于 60Hz 的刷新率對于液晶來說,沒有任何意義,所以我們以 640*480 在 60Hz 的刷新率下為例。
本次我們采用的是ADV7123視頻轉換芯片來實現。
1)為便于移植,根據640*480 60hz分辨率下的參數,宏定義相關數據
//---------------------------------// 640 * 480`define H_FRONT 11'd16`define H_SYNC 11'd96 `define H_BACK 11'd48 `define H_DISP 11'd640 `define H_TOTAL 11'd800 `define V_FRONT 11'd10 `define V_SYNC 11'd2 `define V_BACK 11'd33 `define V_DISP 11'd480 `define V_TOTAL 11'd5252)行掃描單位hcnt計數
/******************************************* SYNC--BACK--DISP--FRONT*******************************************///------------------------------------------//h_sync counter & generatorreg [10:0] hcnt; always @ (posedge clk or negedge rst_n)begin if (!rst_n) hcnt <= 11'd0; else begin if(hcnt < `H_TOTAL - 1'b1) //line over hcnt <= hcnt + 1'b1; else hcnt <= 11'd0; endend assign lcd_hs = (hcnt <= `H_SYNC - 1'b1) ? 1'b0 : 1'b1;//VGA行同步信號3)列掃描單位vcnt計數 每掃描完一行,即hcnt完成H_TOTAL次計數后,vcnt進行自加。
//------------------------------------------//v_sync counter & generatorreg [10:0] vcnt;always@(posedge clk or negedge rst_n)begin if (!rst_n) vcnt <= 11'b0; else if(hcnt == `H_TOTAL - 1'b1) //line over begin if(vcnt < `V_TOTAL - 1'b1) //frame over vcnt <= vcnt + 1'b1; else vcnt <= 11'd0; endendassign lcd_vs = (vcnt <= `V_SYNC - 1'b1) ? 1'b0 : 1'b1;//VGA場同步信號4)ADV7123控制信號輸出 為了實現數據在lcd_dclk上升沿有效,我們將clk翻轉輸出,已實現上升沿采樣 lcd_blank作為顯示空白信號,低電平有效。 設計中不需要lcd_sync信息,可以直接接地。
//------------------------------------------//LCELL LCELL(.in(clk),.out(lcd_dclk));assign lcd_dclk = ~clk;assign lcd_blank = lcd_hs & lcd_vs; assign lcd_sync = 1'b0;5)有效顯示使能信號輸出 當使能信號有效時,接收外部輸入的RGB數據lcd_data.
//-----------------------------------------assign lcd_en = (hcnt >= `H_SYNC + `H_BACK && hcnt < `H_SYNC + `H_BACK + `H_DISP) && (vcnt >= `V_SYNC + `V_BACK && vcnt < `V_SYNC + `V_BACK + `V_DISP) ? 1'b1 : 1'b0;assign lcd_rgb = lcd_en ? lcd_data : 24'h000000; //ffffff;6)外部數據請求控制信號。 為了實現數據的穩定,lcd_request要提前一個時鐘請求外部輸入數據 同時,設計中實時顯示下一時刻的掃描地址lcd_xpos、lcd_ypos,也要提前一個時鐘輸出,以保證外部數據輸入的同步化。 lcd_xpos、lcd_ypos作為顯示器有效顯示區域的行列坐標計數值。
//------------------------------------------//ahead x clocklocalparam H_AHEAD = 11'd1;assign lcd_request = (hcnt >= `H_SYNC + `H_BACK - H_AHEAD && hcnt < `H_SYNC + `H_BACK + `H_DISP - H_AHEAD) && (vcnt >= `V_SYNC + `V_BACK && vcnt < `V_SYNC + `V_BACK + `V_DISP) ? 1'b1 : 1'b0;//lcd xpos & yposassign lcd_xpos = lcd_request ? (hcnt - (`H_SYNC + `H_BACK - H_AHEAD)) : 11'd0;assign lcd_ypos = lcd_request ? (vcnt - (`V_SYNC + `V_BACK)) : 11'd0;1)宏定義三原色組合的顏色如下
//define colors RGB--8|8|8`define RED 24'hFF0000 /*11111111,00000000,00000000 */`define GREEN 24'h00FF00 /*00000000,11111111,00000000 */`define BLUE 24'h0000FF /*00000000,00000000,11111111 */`define WHITE 24'hFFFFFF /*11111111,11111111,11111111 */`define BLACK 24'h000000 /*00000000,00000000,00000000 */`define YELLOW 24'hFFFF00 /*11111111,11111111,00000000 */`define CYAN 24'hFF00FF /*11111111,00000000,11111111 */`define ROYAL 24'h00FFFF /*00000000,11111111,11111111 */2)根據輸入的行、列地址信號,輸出三原色組合后得到的8條彩色。
//-------------------------------------------`ifdef VGA_HORIZONTAL_COLORalways@(posedge clk or negedge rst_n)begin if(!rst_n) lcd_data <= 24'h0; else begin if (lcd_ypos >= 0 && lcd_ypos < (`V_DISP/8)*1) lcd_data <= `RED; else if(lcd_ypos >= (`V_DISP/8)*1 && lcd_ypos < (`V_DISP/8)*2) lcd_data <= `GREEN; else if(lcd_ypos >= (`V_DISP/8)*2 && lcd_ypos < (`V_DISP/8)*3) lcd_data <= `BLUE; else if(lcd_ypos >= (`V_DISP/8)*3 && lcd_ypos < (`V_DISP/8)*4) lcd_data <= `WHITE; else if(lcd_ypos >= (`V_DISP/8)*4 && lcd_ypos < (`V_DISP/8)*5) lcd_data <= `BLACK; else if(lcd_ypos >= (`V_DISP/8)*5 && lcd_ypos < (`V_DISP/8)*6) lcd_data <= `YELLOW; else if(lcd_ypos >= (`V_DISP/8)*6 && lcd_ypos < (`V_DISP/8)*7) lcd_data <= `CYAN; else// if(lcd_ypos >= (`V_DISP/8)*7 && lcd_ypos < (`V_DISP/8)*8) lcd_data <= `ROYAL; endend`endif
|
新聞熱點
疑難解答