基于FPGA的VGA可移植模塊終極設計
b) 專用視頻轉換芯片
利用專用視頻轉換芯片,ADV7120等,將數字信號轉換為VGA RGB的模擬信號。ADV7120為高速D/A芯片,將數字信號轉換為模擬信號輸給VGA,電路如下:
Bingo玩VGA也算是比較早了,當年也是視覺的誘惑,以及唯FPGA獨尊的優勢。于是之后一發而不可收拾。本章Bingo將自己這些年最終優化的VGA驅動模塊,發布至此。本模塊所有代碼均Bingo獨家創造,請尊重版權哈。
本設計已經封裝成模塊,只要修改時序參數、掃描時鐘參數以及在vga_display.v中添加顯示電路,即可。方便移植,希望對大家有用。
1、模塊劃分
(1)vga_design.v
工程頂層文件,例化各個模塊。
(2)sys_ctrl.v
PLL時鐘分配電路。
(3)vga_display.v
顯示電路,根據時序,用于描述VGA的顯示電路。
(4)vga_driver.v
VGA驅動電路,對時序,狀態的約束。
RTL圖如下所示:
2、代碼設計
Bingo例程以16bit RGB VGA驅動為例,不同位數的顯示只要改一下vga_data即可。
前文以及代碼講述了那么多,此處不再貼完整代碼,而是對代碼中部分結構進行解析。
代碼下載地址:http://blog.chinaaet.com/detail/21606.html
(1)vga_driver.v代碼分析
a) 參數例化列表
#(
// VGA_1024_768_60fps_65MHz
// Horizontal Parameter ( Pixel )
parameter H_DISP = 11'd1024,
parameter H_FRONT = 11'd24,
parameter H_SYNC = 11'd136,
parameter H_BACK = 11'd160,
parameter H_TOTAL = 11'd1344,
// Virtical Parameter ( Line )
parameter V_DISP = 10'd768,
parameter V_FRONT = 10'd3,
parameter V_SYNC = 10'd6,
parameter V_BACK = 10'd29,
parameter V_TOTAL = 10'd806
)
這樣寫的目的是為了軟件封裝性,能夠在例化的時候修改法分辨率,同時電路結構保持不變。
DISP,FRONT ,SYNC,BACK,TOTAL分別為顯示期,消隱前肩,消音期,消隱后肩,總時間,各自對應各自的行場信號。
b) 行同步信號設計
//------------------------------------------
// 行同步信號發生器
reg [10:0] hcnt;
always @ (posedge clk_vga or negedge rst_n)
begin
if (!rst_n)
hcnt = 0;
else
begin
if (hcnt H_TOTAL-1'b1)
hcnt = hcnt + 1'b1;
else
hcnt = 0;
end
end
//------------------------------------------
always@(posedge clk_vga or negedge rst_n)
begin
if(!rst_n)
vga_hs = 1;
else
begin
if( (hcnt >= H_DISP+H_FRONT-1'b1) (hcnt H_DISP+H_FRONT+H_SYNC-1'b1) )
vga_hs = 0;
else
vga_hs = 1;
end
end
如上所示,分析代碼可以知道,行同步信號的計數狀態機按照時序的劃分,是以下過程:H_DISP,H_FRONT,H_SYNC,H_BACK,這似乎和上述分析的VGA時序不是完全吻合。但是VGA時序是一個循環,順推H_BACK個時終域便可以得到以上時期劃分,但是這樣更方便后續坐標計數,因為Bingo此處這樣設計,當然實際證明是完全可行的。
注意:(hcnt >= H_DISP+H_FRONT-1'b1) (hcnt H_DISP+H_FRONT+H_SYNC-1'b1) 只是因為后續坐標計算,就把時序提前了1個時鐘已達到同步。
評論