国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

FPGA 學習筆記(十一) VGA驅動的實現

2019-11-08 20:02:01
字體:
來源:轉載
供稿:網友

VGA時序圖

1)行掃描時序圖

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

2)場掃描時序圖

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

3)VGA顯示器掃描軌跡

常見的刷新率時序表

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

FPGA硬件 測試時要將sys_pll中的輸出頻率改為25MHZ。

驅動電路的verilog設計(lcd_driver)

由亍目前液晶顯示器的普及,而高于 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'd525

2)行掃描單位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;

模擬VGA圖像數據的輸入

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泌阳县| 吴堡县| 桂东县| 东阳市| 亚东县| 布尔津县| 峨眉山市| 宁化县| 高平市| 海口市| 台湾省| 长丰县| 陆河县| 苏州市| 安阳县| 磐安县| 防城港市| 田林县| 高州市| 花垣县| 昌邑市| 娄底市| 寿阳县| 丰都县| 永康市| 洪雅县| 岳普湖县| 长顺县| 离岛区| 平陆县| 深泽县| 年辖:市辖区| 常宁市| 成都市| 淮滨县| 宣城市| 肥西县| 蓝田县| 晋江市| 洪湖市| 子洲县|