當(dāng)前位置:首頁 > EDA > 電子設(shè)計自動化
[導(dǎo)讀]一、VGA的誘惑首先,VGA的驅(qū)動,這事,一般的單片機是辦不到的;由于FPGA的速度,以及并行的優(yōu)勢,加上可現(xiàn)場配置的優(yōu)勢,VGA的配置,只有俺們FPGA可以勝任,也只有FPGA可以隨心所欲地配置(當(dāng)然ARM也可以,應(yīng)用比較

一、VGA的誘惑

首先,VGA的驅(qū)動,這事,一般的單片機是辦不到的;由于FPGA的速度,以及并行的優(yōu)勢,加上可現(xiàn)場配置的優(yōu)勢,VGA的配置,只有俺們FPGA可以勝任,也只有FPGA可以隨心所欲地配置(當(dāng)然ARM也可以,應(yīng)用比較高吧)。

初學(xué)者就是喜歡看炫的效果,往往會忍不住想玩。尤其玩FPGA的,沒玩VGA就感到跟單片機沒啥提升,因此VGA的驅(qū)動也不得不講。Bingo當(dāng)年也是如此。擋不住VGA的誘惑,初學(xué)者問Bingo VGA問題的人也是灰常的多,也許一般教科書理論太強,實際應(yīng)用不是很身后,在此Bingo用淺顯易懂的語言來講述VGA的驅(qū)動原理,以及通過設(shè)計一個可移植模塊的應(yīng)用來講述。

二、VGA驅(qū)動原理

此處Bingo不參考任何資料,用當(dāng)年已學(xué)的知識,用淺顯易懂的語言講述。

2、VGA時序

VGA其實就是相當(dāng)于一塊芯片,跟單片機驅(qū)動IC一樣,滿足一定的時序,便能驅(qū)動起來。

(1)掃描軌跡

VGA的掃描其實很簡單,大致軌跡如下所示:

沒掃描完一行,從新開始下一行;每掃完一場,重新開始下一場。相信你應(yīng)該看的懂。

(2)行場掃描

以下是行掃描,場掃描HS,VS時序圖

如上如所示:VGA一直在掃描,沒一場的掃描包括了若干行掃描,如此循環(huán)。

(3)VS時序深入分析

VS時序如下所示:

可見時序的循環(huán),可被劃分為a,b,c,d4個時期。這四個時期定義如下:

A~B:場消隱期 即同步,相當(dāng)于還原掃描坐標(biāo)吧

B~C:場消隱后肩 相當(dāng)于準(zhǔn)備開始掃描吧

C~D:場顯示期 掃描中,數(shù)據(jù)有效區(qū)域

D~E:場消隱前肩 完成掃描,相當(dāng)于準(zhǔn)備同步

(4)HS時序深入分析

可見時序的循環(huán),可被劃分為a,b,c,d4個時期。這四個時期定義如下:

A~B:行消隱期 即同步,相當(dāng)于還原掃描坐標(biāo)吧

B~C:行消隱后肩 相當(dāng)于準(zhǔn)備開始掃描吧

C~D:行顯示期 掃描中,數(shù)據(jù)有效區(qū)域

D~E:行消隱前肩 完成掃描,相當(dāng)于準(zhǔn)備同步

綜上描述,我們只要知道每個時期的時間,便可以表示出VGA的時序。而FPGA的工作是由固定頻率的時鐘觸發(fā)的,因此某固定時間可以用n次觸發(fā)來表示。因此我們很容易就想到了FPGA常用的計數(shù)方法:比如說行掃描,我們計數(shù)0~H_total-1。用另一個進(jìn)程將其劃分為4個時期,安標(biāo)注分配。其實這相當(dāng)于狀態(tài)機。

以下是固定分辨率1024*768 60fps下HS,VS的標(biāo)準(zhǔn):

 

用代碼表示4個時期,如下:

// 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

3、VGA電路

(1)三原色

VGA接口:R,G,B三通道,直接賦給數(shù)字信號,RGB,最多產(chǎn)生8種色彩。這是最基本的。電路如下所示:

(2)真彩顯示

a) 電阻網(wǎng)絡(luò)

考慮到成本意識實現(xiàn)的簡易方案,用R-2R電阻網(wǎng)絡(luò)分流模擬DAC替換ADV7123視頻轉(zhuǎn)換芯片。見以下幾個方案:

DE1 VGA模擬電路

小馬哥電路圖

具體設(shè)計參考Bingo當(dāng)年總結(jié):

http://www.cnblogs.com/crazybingo/archive/2010/07/31/1789323.html

或者參考小馬哥設(shè)計:

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3582675&bbs_page_no=1&search_mode=2&search_text=VGA&bbs_id=9999

b) 專用視頻轉(zhuǎn)換芯片

利用專用視頻轉(zhuǎn)換芯片,ADV7120等,將數(shù)字信號轉(zhuǎn)換為VGA RGB的模擬信號。ADV7120為高速D/A芯片,將數(shù)字信號轉(zhuǎn)換為模擬信號輸給VGA,電路如下:

三、可移植VGA模塊設(shè)計

Bingo玩VGA也算是比較早了,當(dāng)年也是視覺的誘惑,以及唯FPGA獨尊的優(yōu)勢。于是之后一發(fā)而不可收拾。本章Bingo將自己這些年最終優(yōu)化的VGA驅(qū)動模塊,發(fā)布至此。本模塊所有代碼均Bingo獨家創(chuàng)造,請尊重版權(quán)哈。

本設(shè)計已經(jīng)封裝成模塊,只要修改時序參數(shù)、掃描時鐘參數(shù)以及在vga_display.v中添加顯示電路,即可。方便移植,希望對大家有用。

1、模塊劃分

(1)vga_design.v

工程頂層文件,例化各個模塊。

(2)sys_ctrl.v

PLL時鐘分配電路。

(3)vga_display.v

顯示電路,根據(jù)時序,用于描述VGA的顯示電路。

(4)vga_driver.v

VGA驅(qū)動電路,對時序,狀態(tài)的約束。

RTL圖如下所示:

2、代碼設(shè)計

Bingo例程以16bit RGB VGA驅(qū)動為例,不同位數(shù)的顯示只要改一下vga_data即可。

前文以及代碼講述了那么多,此處不再貼完整代碼,而是對代碼中部分結(jié)構(gòu)進(jìn)行解析。

代碼下載地址:http://blog.chinaaet.com/detail/21606.html

(1)vga_driver.v代碼分析

a) 參數(shù)例化列表

#(

// 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

)

這樣寫的目的是為了軟件封裝性,能夠在例化的時候修改法分辨率,同時電路結(jié)構(gòu)保持不變。

DISP,F(xiàn)RONT ,SYNC,BACK,TOTAL分別為顯示期,消隱前肩,消音期,消隱后肩,總時間,各自對應(yīng)各自的行場信號。

b) 行同步信號設(shè)計

//------------------------------------------

// 行同步信號發(fā)生器

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

如上所示,分析代碼可以知道,行同步信號的計數(shù)狀態(tài)機按照時序的劃分,是以下過程:H_DISP,H_FRONT,H_SYNC,H_BACK,這似乎和上述分析的VGA時序不是完全吻合。但是VGA時序是一個循環(huán),順推H_BACK個時終域便可以得到以上時期劃分,但是這樣更方便后續(xù)坐標(biāo)計數(shù),因為Bingo此處這樣設(shè)計,當(dāng)然實際證明是完全可行的。

注意:(hcnt >= H_DISP+H_FRONT-1'b1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1'b1) 只是因為后續(xù)坐標(biāo)計算,就把時序提前了1個時鐘已達(dá)到同步。

c) 場同步信號設(shè)計

同上。

d) 數(shù)據(jù)顯示坐標(biāo)以及輸出設(shè)計

//------------------------------------------

assign vga_xpos = (hcnt < H_DISP) ? hcnt[9:0]+1'b1 : 10'd0;

assign vga_ypos = (vcnt < V_DISP) ? vcnt[9:0]+1'b1 : 10'd0;

assign vga_rgb  = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? vga_data : 16'd0;

這部分很容易理解,在顯示期坐標(biāo)根據(jù)顯示的掃描而改變,在非顯示期,坐標(biāo)置零。

(2)Vga_display.v代碼分析

a) 標(biāo)準(zhǔn)色彩定義

//define colors RGB--5|6|5

localparam RED      = 16'hF800;

localparam GREEN     = 16'h07E0;

localparam BLUE      = 16'h001F;

localparam WHITE     = 16'hFFFF;

localparam BLACK     = 16'h0000;

localparam YELLOW    = 16'hFFE0;

localparam CYAN      = 16'hF81F;

localparam ROYAL     = 16'h07FF;

定義當(dāng)?shù)氐膮?shù),目的是為了后續(xù)標(biāo)準(zhǔn)色彩調(diào)用的方便,沒有其他作用。

b) 根據(jù)固定區(qū)域輸出數(shù)據(jù)

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

vga_data <= 16'h0;

else

begin

if (vga_xpos >= 0 && vga_xpos < (H_DISP/3))

vga_data <= RED;

else if(vga_xpos >= (H_DISP>>3)*1 && vga_xpos < (H_DISP/3)*2)

vga_data <= GREEN;

else

vga_data <= BLUE;

end

end

如上代碼,根據(jù)xpos坐標(biāo),來輸出固定色彩。由于vga_driver模塊已經(jīng)完全設(shè)計好接口,因此vga_display.v模塊就是簡單的根據(jù)區(qū)域,輸出設(shè)計的顏色。

(3) Vga_ctrl.v代碼分析

a) 同步化解析

略。

b) 可控鎖相環(huán)PLL設(shè)計

本來可空鎖相環(huán)PLL設(shè)計,Bingo想單獨成章來講述的,但覺得可能別的地方實際應(yīng)用價值不是很大,最后便在此處闡明這樣設(shè)計的原因。

由于VGA不同分辨率的掃描時鐘不同,因此分辨率變化的時候,PLL的輸出時鐘是必要跟隨著變化。但是Bingo覺得好麻煩,于是想了偷懶的一招:PLL IP定義,無非是用Quartus II GUI對PLL參數(shù)的設(shè)定,最后生成pll.v這個文件。而這個文件相當(dāng)于是鎖相環(huán)的驅(qū)動電路,故勢必包含著參數(shù)的定義。實際如下:

altpll_component.clk0_divide_by = 1,

altpll_component.clk0_duty_cycle = 50,

altpll_component.clk0_multiply_by = 1,

如上圖所示,每次修改參數(shù),這三個變量會相應(yīng)的發(fā)生變化。因此,何不把這三個參數(shù)作為例化的參數(shù),可以再頂層直接修改代碼來實現(xiàn)固定頻率的輸出?這樣豈不是很方便?

因此設(shè)計參數(shù)例化接口如下:

#(

parameter DUTY_CYCLE = 50,

parameter DIVIDE_DATA = 1,

parameter MULTIPLY_DATA = 1

)

理論上是完全行得通的,這樣設(shè)計的另一個好處就是電路的封裝性更好Bingo實踐證明,完全可行,因此在此處說明,要學(xué)會正確的偷懶呵呵。

(4)Vga_design.v頂層文件代碼解析

a) Vga接口定義

//vga interface

output vga_adv_clk,

output vga_blank_n,

output vga_sync_n,

output vga_hs,

output vga_vs,

output [15:0] vga_rgb

如上所示,上面三個信號線是在使用adv712x視頻轉(zhuǎn)換芯片的時候才會出現(xiàn),一般的電阻模擬電路,或者直接RGB3線驅(qū)動,可以直接刪除相關(guān)信號以及電路。

b) 進(jìn)一步偷懶法則

根據(jù)常用的幾種分辨率,Bingo進(jìn)行了總結(jié),以下三種應(yīng)用較多,因此進(jìn)一步偷懶法則,圍繞他們?nèi)邅恚ú辉谶@三種以內(nèi)的話,自己模仿著再寫一個):

VGA_640_480_60FPS_25MHz

VGA_800_600_72FPS_50MHz

VGA_1024_768_60FPS_65MHz

Verilog語法也有define的用法,是否還記得C語言中,大工程的調(diào)試經(jīng)常對相關(guān)變量的注釋,注銷來調(diào)整整個工程變量的應(yīng)用,因此此處Bingo套用這種思維模式,定義以上三種模式的變量,通過修改注釋define便可以輕松修改全局。具體如下所示:

//----------------------------------------

//vga parameter define

//`define VGA_640_480_60FPS_25MHz

//`define VGA_800_600_72FPS_50MHz

`define VGA_1024_768_60FPS_65MHz

`ifdef VGA_640_480_60FPS_25MHz

parameter DUTY_CYCLE = 50;

parameter DIVIDE_DATA = 2;

parameter MULTIPLY_DATA = 1;

parameter H_DISP = 11'd640;

parameter H_FRONT = 11'd16;

parameter H_SYNC  = 11'd96;

parameter H_BACK  = 11'd48;

parameter H_TOTAL = 11'd800;

parameter V_DISP  = 10'd480;

parameter V_FRONT = 10'd10;

parameter V_SYNC  = 10'd2;

parameter V_BACK  = 10'd33;

parameter V_TOTAL = 10'd525;

`endif

`ifdef VGA_800_600_72FPS_50MHz

parameter DUTY_CYCLE = 50;

parameter DIVIDE_DATA = 1;

parameter MULTIPLY_DATA = 1;

parameter H_DISP  = 11'd800;

parameter H_FRONT = 11'd56;

parameter H_SYNC  = 11'd120;

parameter H_BACK  = 11'd64;

parameter H_TOTAL = 11'd1040;

parameter V_DISP  = 10'd600;

parameter V_FRONT = 10'd37;

parameter V_SYNC  = 10'd6;

parameter V_BACK  = 10'd23;

parameter V_TOTAL = 10'd666;

`endif

`ifdef VGA_1024_768_60FPS_65MHz

parameter DUTY_CYCLE = 50;

parameter DIVIDE_DATA = 10;

parameter MULTIPLY_DATA = 13;

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;

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;

`endif

四、Display方案以及效果

1、彩條

(1)代碼

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

vga_data <= 16'h0;

else

begin

if (vga_xpos >= 0 && vga_xpos < (H_DISP>>3))

vga_data <= RED;

else if(vga_xpos >= (H_DISP>>3)*1 && vga_xpos < (H_DISP>>3)*2)

vga_data <= GREEN;

else if(vga_xpos >= (H_DISP>>3)*2 && vga_xpos < (H_DISP>>3)*3)

vga_data <= BLUE;

else if(vga_xpos >= (H_DISP>>3)*3 && vga_xpos < (H_DISP>>3)*4)

vga_data <= WHITE;

else if(vga_xpos >= (H_DISP>>3)*4 && vga_xpos < (H_DISP>>3)*5)

vga_data <= BLACK;

else if(vga_xpos >= (H_DISP>>3)*5 && vga_xpos < (H_DISP>>3)*6)

vga_data <= YELLOW;

else if(vga_xpos >= (H_DISP>>3)*6 && vga_xpos < (H_DISP>>3)*7)

vga_data <= CYAN;

else// if(vga_xpos >= (H_DISP<<3)*7 && vga_xpos < (H_DISP<<3)*8)

vga_data <= ROYAL;

end

end

通過簡單的對X坐標(biāo)地址的分割,來得到彩條。這是應(yīng)該是VGA初學(xué)者一開始最興奮的幾個界面吧。

(2)效果圖

2、花型矩陣

(1)代碼

wire [19:0] vga_result = vga_xpos * vga_ypos;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

vga_data <= 16'h0;

else

vga_data = vga_result[15:0];

end

通過x坐標(biāo)地址和y坐標(biāo)地址的乘積的值,取低16位,得到的數(shù)據(jù)有一定的規(guī)律。Bingo當(dāng)年也是不小心發(fā)現(xiàn)的,僅此獻(xiàn)給初學(xué)的孩子們,這個比彩條更帥氣。

(2)效果圖

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉