3.8VGA顯示顏色--明德?lián)P科教1(mdy-edu.com)
本文的文檔編號(hào):001700000020
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):001700000441
1、至簡原理與應(yīng)用配套的案例和PPT講解
2、本設(shè)計(jì)需要通過VGA線將顯示器和開發(fā)板進(jìn)行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時(shí)序,實(shí)現(xiàn)在屏幕上顯示紅色。步驟性教學(xué);
3、Altera和Xilinx入門學(xué)習(xí)例文檔
第三篇?FPGA至簡設(shè)計(jì)項(xiàng)目實(shí)踐? ?
? ?? ?第八章 VGA顯示顏色
第1節(jié)?項(xiàng)目背景
1.1 VGA介紹
Video Graphics Array(VGA)視頻圖形陣列是IBM公司在1987年隨著PS/2一起推出的使用模擬信號(hào)的一種視頻傳輸標(biāo)準(zhǔn)。其在當(dāng)時(shí)具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),因而在彩色顯示器領(lǐng)域得到了廣泛的應(yīng)用。雖然對(duì)于現(xiàn)今的個(gè)人電腦市場來說該標(biāo)準(zhǔn)已經(jīng)十分過時(shí),但VGA仍然是眾多制造商所共同支持的一個(gè)標(biāo)準(zhǔn)。在加載自己的獨(dú)特驅(qū)動(dòng)程序之前,個(gè)人電腦都必須支持VGA的標(biāo)準(zhǔn)。例如,微軟Windows系列產(chǎn)品的開機(jī)畫面仍然使用VGA顯示模式,這也說明該標(biāo)準(zhǔn)在顯示標(biāo)準(zhǔn)中的重要性和兼容性。
目前,VGA技術(shù)主要應(yīng)用于基于VGA顯示卡的計(jì)算機(jī)、筆記本電腦等設(shè)備,而少用于要求顯示彩色高分辨率圖像又沒有必要使用計(jì)算機(jī)的設(shè)備中。部分嵌入式的VGA顯示系統(tǒng)可以在不使用VGA顯示卡和計(jì)算機(jī)的情況下實(shí)現(xiàn)VGA圖像的顯示和控制,該系統(tǒng)具有成本低、結(jié)構(gòu)簡單、應(yīng)用靈活的優(yōu)點(diǎn),可廣泛應(yīng)用于超市、車站、飛機(jī)場等公共場所的廣告宣傳和提示信息顯示,也可應(yīng)用于工廠車間生產(chǎn)過程中的操作信息顯示,還能以多媒體形式應(yīng)用于日常的生活中。
1.2 VGA管腳
VGA接口是一種D型接口,采用非對(duì)稱分布的15pin?連接方式,如下圖所示,共有15針,分成3排,每排5個(gè)孔。這是顯卡中應(yīng)用最為廣泛的接口類型,絕大多數(shù)顯卡都帶有此種接口,可以傳輸紅、綠、藍(lán)模擬信號(hào)以及同步信號(hào)(水平和垂直信號(hào))。

在VGA接頭上一般會(huì)1,5,6,10,11,15等標(biāo)明每個(gè)接口的編號(hào)。如果沒有這一編號(hào)則按照下圖所示進(jìn)行編號(hào)。VGA接口共有15根針,其對(duì)應(yīng)接口定義如下:
1、紅基色?red
2、綠基色?green
3、藍(lán)基色?blue
4、地址碼?ID Bit(也有部分是RES,或者為ID2顯示器標(biāo)示位2)
5、自測試?(?各家定義不同?)(一般為GND)
6、紅地
7、綠地
8、藍(lán)地
9、保留?(?各家定義不同?)
10、數(shù)字地
11、地址碼(ID0顯示器標(biāo)示位0)
12、地址碼(ID1顯示器標(biāo)示位1)
13、行同步
14、場同步
15、地址碼?( ID3或顯示器標(biāo)示位3 )

在進(jìn)行FPGA邏輯設(shè)計(jì)時(shí)主要關(guān)注的信號(hào)是紅基色、綠基色、藍(lán)基色、行同步和場同步信號(hào),其他信號(hào)在進(jìn)行原理圖和PCB設(shè)計(jì)時(shí)才需要關(guān)注。FPGA通過控制紅基色、綠基色、藍(lán)基色、行同步和場同步信號(hào)這5個(gè)接口,就能讓顯示器顯示豐富的色彩和各種視頻圖像。
1.3 VGA色彩原理
在中學(xué)的物理課中同學(xué)們可能做過棱鏡的試驗(yàn),通過棱鏡后白光被分解成多種顏色逐漸過渡的色譜,依次為紅、橙、黃、綠、青、藍(lán)、紫,這就是可見光譜。而人的眼睛就像一個(gè)三色接收器的體系,在可見光譜中人眼對(duì)紅、綠、藍(lán)最為敏感,在視覺接收時(shí)大多數(shù)的顏色可以通過紅、綠、藍(lán)三色按照不同的比例合成產(chǎn)生。同樣地,絕大多數(shù)的單色光也可以分解成紅綠藍(lán)三種色光,這就是色度學(xué)最基本的原理,即三基色原理。三種基色相互獨(dú)立,任何一種基色都不能由其它兩種基色合成。紅綠藍(lán)就是三基色,這三種顏色合成的顏色范圍最為廣泛,而按照不同的比例的紅綠藍(lán)三基色相加合成的混色被稱為相加混色。
三基色的顏色編碼如下所示:
表3.8-1三基色顏色編碼

從上表可以看出RBG一共有8組合,即可以產(chǎn)生8種顏色。然而顯示器顯示的色彩非常豐富,要遠(yuǎn)遠(yuǎn)多于8種顏色,這又是如何做到的呢?
對(duì)于顯示器來說,RGB三個(gè)信號(hào)其實(shí)是模擬信號(hào),其電壓的高低可以表示出顏色的深淺。利用這一原理,就可以產(chǎn)生豐富的色彩。例如,如果R=3.3V,G=0V,B=0V,則顯示器會(huì)顯示非常鮮艷的紅色。如果G和B仍然是0V,而R改為1.8V,則顯示器會(huì)顯示比較淺的紅色。R、G、B的電壓范圍從0~3.3V,將其任意組合就可以表示出豐富的顏色了。
1.4?顯示器掃描方式
通過控制紅綠藍(lán)三基色可以確定一個(gè)像素的顏色,但眾所周知一幅圖像是由非常多的像素組成的。例如640*480分辨率的圖像則是由480行、每行640個(gè)像素組合起來顯示的圖像。如果顯示器想要顯示這樣一幅圖像,就需要控制顯示器的掃描槍將每一個(gè)像素對(duì)應(yīng)的顏色顯示出來,且需要控制像素快速變化,使人眼認(rèn)為所有像素同時(shí)顯示,從而達(dá)到顯示器顯示圖像的效果。
CRT?顯示器的控制框圖如下圖所示:

圖3.8-4顯示器掃描原理
顯示器采用光柵掃描方式,即轟擊熒光屏的電子束在CRT屏幕上從左到右(受水平同步信號(hào)HSYNC控制)、從上到下(受垂直同步信號(hào)VSYNC控制)做有規(guī)律的移動(dòng)。電子束采用光柵掃描方式,從屏幕左上角一點(diǎn)開始,向右逐點(diǎn)進(jìn)行掃描,形成一條水平線;在到達(dá)最右端后,回到下一條水平線的最左端重復(fù)上面的過程;當(dāng)電子束完成右下角一點(diǎn)的掃描后,完成一幀圖像掃描。隨后,電子束再次回到左上方起點(diǎn)開始下一幀的掃描。這種方法即為常說的逐行掃描顯示,通俗來講就是顯示器是從左上角的第一個(gè)像素模塊開始,從左到右,從上到下,一塊一塊的快速顯示,從而實(shí)現(xiàn)了一幅靜止畫面,這幅靜止畫面在視頻中稱之為一幀,連續(xù)的幀就會(huì)產(chǎn)成動(dòng)畫的效果。
1.5 VGA時(shí)序
行同步信號(hào)的時(shí)序如下圖所示??梢钥闯鲂型叫盘?hào)周期性地產(chǎn)生高低電平,可將其分為4個(gè)階段:同步脈沖a、顯示后沿b、顯示區(qū)域c和顯示前沿d。同步脈沖a代表新一行的掃描開始,同時(shí)也是上一行掃描的結(jié)束。顯示時(shí)序c是真正圖像的顯示區(qū)域,在此階段,像素逐個(gè)顯示出來,即在這一階段控制紅、綠、藍(lán)三基色信號(hào)輸出對(duì)應(yīng)像素的RGB值。顯示后沿b和顯示前沿d這兩個(gè)階段是消隱時(shí)刻,此時(shí)要求紅、綠、藍(lán)三基色信號(hào)都為0。

圖3.8-5 VGA行同步信號(hào)時(shí)序
通俗來講即行同步信號(hào)先產(chǎn)生一段低電平的同步脈沖表示“這一行要開始了”。此處可能存在疑慮:為什么要有這一段同步脈沖呢?從圖3.8- 4的顯示器掃描原理圖中可以看出,電子束的行進(jìn)路徑是從左上角開始,由左到右一個(gè)點(diǎn)一個(gè)點(diǎn)的移動(dòng)。當(dāng)一行掃描完畢后,電子束則需要從最右邊回到最左邊開始下一行的掃描,這一移動(dòng)的時(shí)間即為同步脈沖a。
在同步脈沖a結(jié)束后,信號(hào)由0變1迎來一個(gè)上升沿,進(jìn)入顯示信號(hào)。這段顯示信號(hào)包含顯示后沿b、顯示時(shí)序c和顯示前沿d三部分,其中只有顯示時(shí)序c是真正可以顯示像素的,即在這一段需要輸出有效的RGB的值,從而保證顯示效果。
場同步信號(hào)的時(shí)序與行同步信號(hào)相似,如下圖所示。

圖3.8-6VGA場同步信號(hào)時(shí)序
場同步信號(hào)也是周期性地產(chǎn)生高低電平,同樣可以分成4個(gè)階段:同步脈沖a、顯示后沿b、顯示區(qū)域c和顯示前沿d。但需要注意的是,場同步信號(hào)的變化單位是“一行”,即一個(gè)“場同步脈沖”時(shí)間內(nèi)包含多個(gè)“行脈沖周期”。
為了避免讀者錯(cuò)誤理解,這里再次強(qiáng)調(diào)一下VGA的時(shí)序。
1、場同步的變化是以“一行”為單位的。例如,假定一行時(shí)間是800個(gè)時(shí)鐘,場同步脈沖a的值為2,則場同步脈沖的時(shí)間是2*800=1600個(gè)時(shí)鐘。
2、真正的顯示區(qū)域是場同步信號(hào)處于顯示區(qū)域且行同步信號(hào)也處于顯示區(qū)域的部分,其他區(qū)域中紅、綠、藍(lán)基色都要給低電平。即場同步信號(hào)和行同步信號(hào)均處于顯示區(qū)域的時(shí)候,才是真正的顯示區(qū)域。
在進(jìn)行時(shí)序觀察時(shí),同學(xué)們不僅要關(guān)注其變化點(diǎn),還要關(guān)注持續(xù)的時(shí)間。那么行、場同步四個(gè)階段中的持續(xù)時(shí)間分別是多少呢?下面是常見分辨率的相應(yīng)參數(shù)。
表3.8-2常見分辨率參數(shù)

以640*480/60Hz為例,這一指標(biāo)代表刷新頻率為60Hz,分辨率為640X480。標(biāo)準(zhǔn)VGA顯示驅(qū)動(dòng)中刷新頻率60 Hz即為1秒顯示60幅圖像。
此外,從上表中可以看出,在該分辨率下行同步信號(hào)的同步脈沖是96個(gè)基準(zhǔn)時(shí)鐘,顯示后沿是48個(gè)基準(zhǔn)時(shí)鐘,顯示區(qū)域是640個(gè)基準(zhǔn)時(shí)鐘,顯示前沿是16個(gè)基準(zhǔn)時(shí)鐘,通過相加可以得出一行一共有800個(gè)基準(zhǔn)時(shí)鐘。該分辨率下的場同步信號(hào)的同步脈沖是2行(2*800個(gè)基準(zhǔn)時(shí)鐘),顯示后沿是33行(33*800個(gè)基準(zhǔn)時(shí)鐘),顯示區(qū)域?yàn)?80行(480*800個(gè)基準(zhǔn)時(shí)鐘),顯示前沿為10行(10*800個(gè)基準(zhǔn)時(shí)鐘),共計(jì)525行(525*800個(gè)基準(zhǔn)時(shí)鐘)。
那么基準(zhǔn)時(shí)鐘又是多少呢?由于1秒顯示60幅圖像,所以一幅圖像顯示的時(shí)間是1/60秒。由于一幅圖像占用了525*800個(gè)基準(zhǔn)時(shí)鐘,則基準(zhǔn)時(shí)鐘周期?=?(1/60)/(525*800)秒,約為39.6825ns。因此,基準(zhǔn)時(shí)鐘頻率約為25.175 MHz,在本設(shè)計(jì)中取25M。
有些讀者可能對(duì)于行同步信號(hào)與場同步信號(hào)還是不太理解,在這里將兩個(gè)信號(hào)融合在一起解釋一下。每一行的掃描需要行同步信號(hào),且每一行中都具有同步脈沖a,顯示后沿b,顯示時(shí)序c和顯示前沿d四個(gè)階段,完成一行掃描后再進(jìn)入到下一行再次重復(fù)同樣的四個(gè)階段,這一過程為行同步。將范圍擴(kuò)大,點(diǎn)動(dòng)成線即為行,線動(dòng)成面即為場。場同步中和行同步一樣依舊分為四個(gè)階段,同步脈沖a,顯示后沿b,顯示時(shí)序c和顯示前沿d。因此就有了如圖3.8- 6所示的時(shí)序圖,場同步的單位就為行同步。
這也是最終選取的顯示區(qū)域需要行同步和場同步都處于顯示時(shí)序c中的原因。試想一下,如果行同步處于顯示脈沖c的位置,但是場同步還處于同步脈沖a的位置,在這一狀態(tài)下無法完成圖像的顯示。同理,如果場同步處于顯示脈沖c的位置,但是行同步處于同步脈沖a的位置,也同樣無法顯示圖像。這是一個(gè)包含與被包含的關(guān)系,在場同步脈沖c位置的時(shí)候,包含了很多個(gè)時(shí)序四個(gè)脈沖的行同步,而只有在行同步中也處于同步脈沖c的位置時(shí)才可以真正顯示圖像。
1.6?至簡設(shè)計(jì)法VGA原理圖
FPGA是數(shù)字芯片,其管腳輸出的都是0和1的數(shù)字信號(hào),只有高電平和低電平。因此如果要控制RGB電壓的高低從而實(shí)現(xiàn)顯示器彩色畫面的顯示,則必須用到數(shù)轉(zhuǎn)換DA芯片,利用數(shù)字信號(hào)控制數(shù)模轉(zhuǎn)換芯片的輸入端,從而讓其輸出不同幅度的電壓值。
如下圖所示,F(xiàn)PGA產(chǎn)生RGB三種信號(hào),此時(shí)的RGB都是多位數(shù)字信號(hào),將RGB信號(hào)傳送給DA芯片,DA會(huì)根據(jù)這一數(shù)字信號(hào)產(chǎn)生不同電壓的模擬信號(hào)rgb。此時(shí)只要將模擬信號(hào)rgb連到顯示器上即可顯示豐富的顏色。
在這里,讀者只需了解FPGA通過數(shù)字信號(hào)控制DA芯片,DA芯片就可以產(chǎn)生不同電平即可。關(guān)有DA芯片的介紹可以參考至簡設(shè)計(jì)法中DA轉(zhuǎn)換的相關(guān)內(nèi)容。

圖3.8-7VGA數(shù)模轉(zhuǎn)換原理
至簡設(shè)計(jì)法教學(xué)板中VGA接口的原理圖如下圖所示。

圖3.8-8教學(xué)板VGA接口原理圖
其中,行同步管腳連接信號(hào)VGA_HSYNC,場同步信號(hào)連接信號(hào)VGA_VSYNC,紅基管腳連接VGA_RED,藍(lán)基管腳連接信號(hào)VGA_BLUE,綠基管腳連接信號(hào)VGA_GREEN。
VGA_HSYNC和VGA_VSYNC信號(hào)的另一端連接到FPGA的C20和D20管腳上。

圖3.8-9VGA信號(hào)與FPGA連接圖
綜上所述,F(xiàn)PGA控制管腳C20和D20的輸出,從而控制VGA接口的行、場同步。
再來看VGA_RED、VGA_BLUE和VGA_GREEN信號(hào),其原理圖如下圖所示。

圖3.8-10電阻實(shí)現(xiàn)數(shù)模轉(zhuǎn)換網(wǎng)絡(luò)
從圖中可以看出,VGA_RED是VGA_R0~VGA_R4與電阻并聯(lián)產(chǎn)生的,VGA_GREEN是VGA_G0~VGA_G5與電阻并聯(lián)產(chǎn)生,VGA_BLUE是VGA_B0~VGA_B4與電阻并聯(lián)產(chǎn)生。而VGA_R0~VGA_R4、VGA_G0~VGA_G5、VGA_B0~VGA_B4是連接到FPGA管腳的數(shù)字信號(hào),每個(gè)信號(hào)都只有0V和3.3V兩種可能。那么FPGA可以通過控制這些信號(hào)來控制VGA紅基、綠基和藍(lán)基管腳的電壓。
以利用VGA_R0~VGA_R4產(chǎn)生VGA_RED的電壓值為例。
VGA_RED電壓?= (VGA_R0/2 + VGA_R1/4 + VGA_R2/8 + VGA_R3/16 + VGA_R4/32)*3.3V。
VGA_GREEN電壓?= (VGA_G0/2 + VGA_G1/4 + VGA_G2/8 + VGA_G3/16 +VGA_G4/32+VGA_G5/64)*3.3V。
VGA_BLUE電壓?= (VGA_B0/2 + VGA_B1/4 + VGA_B2/8 + VGA_B3/16 + VGA_B4/32)*3.3V。
至簡設(shè)計(jì)法教學(xué)板利用電阻網(wǎng)絡(luò)代替DA芯片來產(chǎn)生不同幅度電壓。其信號(hào)與管腳的對(duì)應(yīng)關(guān)系及本設(shè)計(jì)所用顏色的對(duì)應(yīng)信號(hào)值如表3.8- 4所示。

圖3.8-11VGA信號(hào)與FPGA連接
表3.8-3信號(hào)與FPGA管腳對(duì)應(yīng)關(guān)系

表3.8-4本設(shè)計(jì)使用顏色的相應(yīng)信號(hào)值

第2節(jié)?設(shè)計(jì)目標(biāo)
了解了VGA的顯示原理后來進(jìn)行本次設(shè)計(jì):通過VGA進(jìn)行不同顏色顯示。按照至簡設(shè)計(jì)法的思路,在進(jìn)行設(shè)計(jì)之前首先應(yīng)明確設(shè)計(jì)目標(biāo)。明確了設(shè)計(jì)目標(biāo)后,后續(xù)的每一步操作都是圍繞設(shè)計(jì)目標(biāo)進(jìn)行展開。如果沒有牢記設(shè)計(jì)目標(biāo)就開始動(dòng)手進(jìn)行實(shí)踐操作,最終的作品也是東拼西湊的產(chǎn)物,一旦在設(shè)計(jì)過程中出現(xiàn)了問題就需要花費(fèi)大量的精力進(jìn)行尋找修復(fù)。建議初學(xué)者在開始學(xué)習(xí)時(shí)就養(yǎng)成良好的設(shè)計(jì)習(xí)慣,才能在后續(xù)的職業(yè)生涯中受益。
本設(shè)計(jì)需要通過VGA連接線將顯示器和開發(fā)板進(jìn)行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時(shí)序,使顯示器產(chǎn)生顯示一幅完整的紅色圖像。顯示器一般都具有分辨率自適應(yīng)功能,無須設(shè)置就能識(shí)別不同分辨率的圖像。本設(shè)計(jì)的相應(yīng)參數(shù)參見表3.8-5中的第一行,該表中常用分辨率的VGA對(duì)應(yīng)時(shí)序參數(shù)并不是隨意選定的,而是國際通用標(biāo)準(zhǔn),每個(gè)關(guān)于VGA的設(shè)計(jì)工程都需要遵守這一標(biāo)準(zhǔn)。這里需要注意的是:行的單位為“基準(zhǔn)時(shí)鐘”,即頻率為25MHz、周期為40ns的時(shí)鐘,列的單位則為“行”,請(qǐng)讀者朋友們一定要準(zhǔn)確區(qū)分。
表3.8-5常見分辨率參數(shù)

設(shè)計(jì)完成后,使用VGA線將開發(fā)板與顯示器相連,連接示意圖如下所示。

上板后顯示器展示效果圖如下圖所示,不同的顯示器會(huì)有一定的色差,需要以實(shí)際顯示情況為主。想要觀看連接后演示視頻效果的讀者朋友,可以登陸至簡設(shè)計(jì)法官網(wǎng)觀看學(xué)習(xí):www.mdy-edu.com/xxxx。

第3節(jié)?設(shè)計(jì)實(shí)現(xiàn)
確定了設(shè)計(jì)目標(biāo)后,本書會(huì)逐步分析講解工程的制作步驟。建議初學(xué)者認(rèn)真學(xué)習(xí)每一步,因?yàn)檫@里分享給同學(xué)們的不僅僅是案例,還有在操作過程中的一些設(shè)計(jì)理念及原理。當(dāng)然本書也會(huì)分享一些至簡設(shè)計(jì)法的設(shè)計(jì)技巧,希望每一位讀者都可以具備獨(dú)立設(shè)計(jì)工程的能力。當(dāng)然已經(jīng)擁有扎實(shí)的功底、只是想要根據(jù)步驟完成項(xiàng)目的讀者朋友們可以跳過此部分,直接進(jìn)入第五節(jié)中的簡略版操作步驟分享。
3.1?頂層信號(hào)
新建目錄:D:mdy_bookcolor_exec1,并該目錄中,新建一個(gè)名為color_exec1.v的文件。用GVIM打開后開始編寫代碼。這里建議初學(xué)者一定要按照本書提供的文件路徑以及文件名進(jìn)行設(shè)置,避免后面出現(xiàn)未知錯(cuò)誤。
第一步應(yīng)確定頂層信號(hào)。分析設(shè)計(jì)目標(biāo)可知:本設(shè)計(jì)中FPGA會(huì)產(chǎn)生VGA時(shí)序,即控制VGA_R4~R0、VGA_G5~G0、VGA_B4~B0、VGA_HSYNC和VGA_VSYNC,從而使顯示器顯示紅色。其中,F(xiàn)PGA可根據(jù)時(shí)序產(chǎn)生高低電平從而控制VGA_HSYNC和VGA_VSYNC。由于本設(shè)計(jì)需要的顯示的顏色數(shù)據(jù)是固定的紅色,因此通過FPGA自身產(chǎn)生而不需要外部輸入圖像的數(shù)據(jù)。在FPGA的設(shè)計(jì)中可以定義輸出信號(hào)hys表示行同步,定義輸出信號(hào)vys表示場同步,定義一個(gè)16位的信號(hào)lcd_rgb來進(jìn)行RGB輸出,其中l(wèi)cd_rgb[15:11]表示VGA_R4~0、lcd_rgb[10:5]表示VGA_G5~0、lcd_rgb[4:0]表示VGA_B4~0。當(dāng)然,本設(shè)計(jì)中還需要時(shí)鐘信號(hào)clk和復(fù)位信號(hào)rst_n來進(jìn)行工程控制。
綜上所述,此設(shè)計(jì)共需要五個(gè)信號(hào):時(shí)鐘信號(hào)clk、復(fù)位信號(hào)rst_n、場同步信號(hào)vys、行同步信號(hào)hys和16位的RGB輸出信號(hào)lcd_rgb。信號(hào)和硬件的對(duì)應(yīng)關(guān)系如下表所示。
表3.8-6信號(hào)和管腳關(guān)系

通過以上分析可以寫出頂層信號(hào)代碼:將module的名稱定義為color_exec1,已知該模塊有五個(gè)信號(hào):clk、rst_n、lcd_hs、lcd_vs和lcd_rgb,將與外部相連接的輸入/輸出信號(hào)列出,從而實(shí)現(xiàn)信號(hào)與管腳的連接。具體頂層代碼如下:

隨后聲明信號(hào)的輸入輸出屬性,模塊中需要聲明這一信號(hào)對(duì)于FPGA來說,屬于輸入信號(hào)還是輸出信號(hào)。信號(hào)若為輸入的話則聲明其為input,若為輸出則聲明其為ouput。在本設(shè)計(jì)中,由于clk是外部的晶振輸入給FPGA的,因此在FPGA中clk是輸入信號(hào)input;同樣地,rst_n是外部按鍵給FPGA的,在FPGA中同樣為輸入信號(hào)input;lcd_hs、lcd_vs和lcd_rgb是FPGA輸出給顯示器的,因此是輸出信號(hào)output。其中clk、rst_n、lcd_hs、lcd_vs的值都是0或者1,用一根線表示即可,即位寬為1,lcd_rgb信號(hào)的位寬為為16位。根據(jù)以上分析補(bǔ)充輸入輸出端口定義,其具體代碼如下:

.2?信號(hào)設(shè)計(jì)
分析設(shè)計(jì)目標(biāo)可知,首先需要設(shè)計(jì)行同步信號(hào)hys,其時(shí)序圖表示如下:

圖3.8-14VGA行同步時(shí)序
根據(jù)時(shí)序圖可以看出hys是一個(gè)周期性進(jìn)行高低變化的脈沖。根據(jù)設(shè)計(jì)目標(biāo)得知圖像分辨率選定為640*480,因此使用下表中的640*480分辨率的相應(yīng)參數(shù)。即同步脈沖a的時(shí)間是96個(gè)基準(zhǔn)時(shí)鐘,顯示后沿b的時(shí)間是48個(gè)基準(zhǔn)時(shí)鐘周期,顯示時(shí)序c的時(shí)間是640個(gè)基準(zhǔn)時(shí)鐘,顯示前沿的時(shí)間是16個(gè)基準(zhǔn)時(shí)鐘,共計(jì)800個(gè)基準(zhǔn)時(shí)鐘(800=96+48+640+16)。
表3.8-5常見分辨率參數(shù)

這里需要注意,一個(gè)基準(zhǔn)時(shí)鐘是40ns,而至簡設(shè)計(jì)法開發(fā)板的時(shí)鐘周期是20ns,因此基于至簡設(shè)計(jì)法開發(fā)板的VGA工程設(shè)計(jì)中,采用2個(gè)時(shí)鐘代表一個(gè)基準(zhǔn)時(shí)鐘。在圖中補(bǔ)充對(duì)應(yīng)的時(shí)間信號(hào),帶有時(shí)間信號(hào)的時(shí)序圖如下圖所示。

圖3.8-15帶時(shí)間信息的VGA行同步時(shí)序
根據(jù)至簡設(shè)計(jì)法的理論,分析波形圖和設(shè)計(jì)目標(biāo)后可以得到本設(shè)計(jì)的計(jì)數(shù)器架構(gòu):本設(shè)計(jì)需要使用2個(gè)計(jì)數(shù)器,一個(gè)計(jì)數(shù)器cnt0用來計(jì)數(shù)基準(zhǔn)時(shí)間,另一個(gè)計(jì)數(shù)器cnt1用來計(jì)數(shù)hys的行長度。
先來討論用于計(jì)數(shù)基準(zhǔn)時(shí)間的計(jì)數(shù)器cnt0。至簡設(shè)計(jì)法的計(jì)數(shù)器只考慮兩個(gè)因素:加1條件和計(jì)數(shù)數(shù)量,只要確定相應(yīng)邏輯,就能完成計(jì)數(shù)器代碼設(shè)計(jì)。
首先確定計(jì)數(shù)器cnt0的加1條件:由于該計(jì)數(shù)器在不停地計(jì)數(shù),是永遠(yuǎn)不停止的,因此可以認(rèn)為其加1條件始終有效,可寫成:assign add_cnt0==1。
此處可能有同學(xué)存在疑惑加1條件的概念是什么?這里以停車位來進(jìn)行比喻,一般情況下對(duì)每個(gè)停車位置會(huì)進(jìn)行對(duì)應(yīng)編號(hào),但是如果某個(gè)位置上放置了一塊石頭無法作為停車位時(shí),該位置就不能獲得對(duì)應(yīng)的編號(hào)。反之則可以認(rèn)為停車位編號(hào)的加1條件就是:對(duì)應(yīng)位置上沒有石頭,其可以繼續(xù)的進(jìn)行編號(hào),即assign add_cnt0 = “沒有石頭”。因此如果在設(shè)計(jì)中計(jì)數(shù)器一直沒有阻礙地進(jìn)行計(jì)數(shù)工作,就可以認(rèn)為加1條件是一直有效的。
接下來確定計(jì)數(shù)器cnt0的計(jì)數(shù)數(shù)量,前文分析中可知2個(gè)時(shí)鐘周期等于1個(gè)基準(zhǔn)時(shí)鐘,所以計(jì)數(shù)器cnt0的計(jì)數(shù)數(shù)量為2。
確定好了加1條件和計(jì)數(shù)數(shù)量后開始進(jìn)行代碼編寫。相信各位往常都是一行行輸入代碼,但是至簡設(shè)計(jì)法有一個(gè)小技巧,可以節(jié)省編寫代碼的時(shí)間,并且一定程度上降低了代碼的出錯(cuò)率。至簡設(shè)計(jì)法將日常代碼中常用到的固定部分做成了模板,進(jìn)行代碼編程時(shí)可以調(diào)用相應(yīng)模板后根據(jù)邏輯輸入對(duì)應(yīng)設(shè)計(jì)的變量將代碼補(bǔ)充完整。這里就可以用模板編寫計(jì)數(shù)器代碼,感受一下這個(gè)炫酷的功能。
打開GVIM,在命令模式下輸入“:Mdyjsq”,點(diǎn)擊回車,就調(diào)出了對(duì)應(yīng)模板,如下圖所示。之后再將本案例中的變量填到模板里面,就可以得到完整正確的計(jì)數(shù)器代碼。

補(bǔ)充完整后得到計(jì)數(shù)基準(zhǔn)時(shí)間的計(jì)數(shù)器cnt0代碼如下。

接著討論用于計(jì)數(shù)hys長度的計(jì)數(shù)器cnt1。根據(jù)設(shè)計(jì)目標(biāo)可知一行需要800個(gè)基準(zhǔn)時(shí)鐘,因此其計(jì)數(shù)數(shù)量為800。前文設(shè)計(jì)中已經(jīng)確定一個(gè)基準(zhǔn)時(shí)鐘可以用end_cnt0表示。因此計(jì)數(shù)器cnt1的加1條件為“end_cnt0”,可寫成:assign add_cnt1 = end_cnt0。繼續(xù)調(diào)用至簡設(shè)計(jì)法模板,在命令模式下輸入“:Mdyjsq”,點(diǎn)擊回車,就調(diào)出了對(duì)應(yīng)模板,將“add_cnt1”和“end_cnt1”補(bǔ)充完整,得到該計(jì)數(shù)器的代碼如下:

確定了計(jì)數(shù)器cnt0和cnt1,hys信號(hào)的設(shè)計(jì)則有了對(duì)齊的對(duì)象。從時(shí)序圖可以發(fā)現(xiàn),hys有兩個(gè)變化點(diǎn),一個(gè)是cnt1數(shù)到96個(gè)基準(zhǔn)時(shí)鐘時(shí),同步脈沖a結(jié)束,信號(hào)由0變1出現(xiàn)一個(gè)上升沿;另一個(gè)是當(dāng)cnt1數(shù)到800個(gè)基準(zhǔn)時(shí)鐘時(shí),信號(hào)由1變0出現(xiàn)下降沿。下面將其翻譯成代碼,在編輯模式下輸入“Shixu2”,調(diào)用至簡設(shè)計(jì)法模板,將模板補(bǔ)充完整得到場同步信號(hào)的代碼如下:

接下來討論vys信號(hào)的設(shè)計(jì),根據(jù)設(shè)計(jì)目標(biāo)可以得到VGA場同步信號(hào)的時(shí)序圖如下所示:

圖3.8-17VGA場同步時(shí)序
可以看出vys也是一個(gè)周期性地進(jìn)行高低變化的脈沖,本設(shè)計(jì)中圖像分辨率選定為640*480,因此使用表3.8- 5中的640*480分辨率的相應(yīng)參數(shù)。同步脈沖a的時(shí)間是2行,顯示后沿b的時(shí)間是33行,顯示時(shí)序c的時(shí)間是480行,顯示前沿的時(shí)間是10行,共計(jì)525行。這里需要注意,行的單位為“基準(zhǔn)時(shí)鐘”,前面的設(shè)計(jì)中使用計(jì)數(shù)器cnt0表示一個(gè)基準(zhǔn)時(shí)鐘,cnt1表示一行。由于場同步信號(hào)是的單位是“行”,因此可以使用cnt1來輔助完成場同步信號(hào)的表示;cnt1計(jì)數(shù)結(jié)束則代表一“行”結(jié)束。
在場同步信號(hào)中補(bǔ)充時(shí)間信號(hào),得到帶有時(shí)間信號(hào)的時(shí)序圖如下所示。

圖3.8-18帶時(shí)間信息的VGA場同步時(shí)序
分析時(shí)序圖發(fā)現(xiàn),若要產(chǎn)生這一時(shí)序還需要1個(gè)計(jì)數(shù)器,將產(chǎn)生這一時(shí)序的計(jì)數(shù)器命名為cnt2。前文強(qiáng)調(diào)過vys的單位是行,因此該計(jì)數(shù)器是用來計(jì)數(shù)行的數(shù)量。因此cnt2的加1條件是一行結(jié)束,前文定義了cnt1代表一行結(jié)束,因此計(jì)數(shù)器cnt2的加1條件即為“end_cnt1”,可寫成:assign add_cnt2 = end_cnt1。分析時(shí)序圖可以知道,該計(jì)數(shù)器的周期為525。將cnt2的設(shè)計(jì)翻譯為代碼表示,繼續(xù)調(diào)用至簡設(shè)計(jì)法模板,在命令模式下輸入“:Mdyjsq”,點(diǎn)擊回車,調(diào)出了對(duì)應(yīng)模板,將“add_cnt1”和“end_cnt1”補(bǔ)充完整,得到該計(jì)數(shù)器的代碼如下:

確定了計(jì)數(shù)器cnt2,則vys信號(hào)的設(shè)計(jì)就有了對(duì)齊的對(duì)象。從時(shí)序圖可以看出vys有兩個(gè)變化點(diǎn),一個(gè)是cnt2數(shù)到2個(gè)時(shí),信號(hào)值由0變1;另一個(gè)是當(dāng)cnt2數(shù)到525個(gè)時(shí),信號(hào)值由1變0。下面將vys信號(hào)翻譯成代碼,在編輯模式下輸入“Shixu2”,調(diào)用至簡設(shè)計(jì)法模板后將其補(bǔ)充完整,得到場同步信號(hào)的代碼如下:

最后還需要設(shè)計(jì)lcd_rgb信號(hào)。設(shè)計(jì)目標(biāo)中可知顯示器需要顯示的顏色為紅色,即lcd_rgb輸出的值為“16’b11111_000000_00000”。這里一定要注意,設(shè)計(jì)目標(biāo)需要在“顯示區(qū)域”才能將該值賦給lcd_rgb,在其他區(qū)域要將lcd_rgb的值設(shè)定為0。
前文確定VGA背景的時(shí)候有說明過顯示區(qū)域如何確定,場同步信號(hào)處于顯示區(qū)域且行同步信號(hào)也處于顯示區(qū)域時(shí)才是真正的顯示區(qū)域,而其他區(qū)域中紅、綠、藍(lán)基色都應(yīng)賦值為低電平時(shí),從而實(shí)現(xiàn)VGA顏色顯示。
因此本設(shè)計(jì)中的顯示區(qū)域即為場同步信號(hào)vys和行同步信號(hào)hys都處于“顯示區(qū)域c”階段。結(jié)合時(shí)序圖可知,當(dāng)cnt1大于(96+48)并且小于(96+48+640),cnt2大于(2+33)并且小于(2+33+480)時(shí),兩個(gè)信號(hào)都處于“顯示區(qū)域”。
綜上所述,lcd_rgb的信號(hào)輸出為,當(dāng)在顯示區(qū)域時(shí)輸出“16’b11111_000000_00000”,否則輸出0,將其翻譯成代碼如下所示:

至此,主體程序已經(jīng)完成,接下來帶領(lǐng)同學(xué)們將module補(bǔ)充完整。如果充分理解了VGA的工作原理,就會(huì)發(fā)現(xiàn)利用FPGA完成VGA圖像顯示還是非常容易的。截止到這里如果有讀者還存在不能完全理解的部分,建議可以認(rèn)真學(xué)習(xí)本設(shè)計(jì)的項(xiàng)目背景章節(jié),更加透徹的學(xué)習(xí)一下VGA的原理。將原理理解透徹后,在進(jìn)行后續(xù)幾個(gè)案例的設(shè)計(jì)時(shí)也會(huì)覺得更加輕松。
3.3?信號(hào)定義
接下來將module補(bǔ)充完整,首先來定義信號(hào)類型。再次強(qiáng)調(diào),在進(jìn)行reg和wire的判斷的時(shí)候,總?cè)菀状嬖诙嘤嗟穆?lián)想,比如認(rèn)為reg就是寄存器,wire是線;或者認(rèn)為reg的會(huì)綜合成寄存器,wire不會(huì)綜合成寄存器。但是這些其實(shí)和reg型還是wire型都是并無關(guān)系,在信號(hào)類型的判斷時(shí)不需要做任何的聯(lián)想,只要記住一個(gè)規(guī)則“用always實(shí)現(xiàn)的是reg型,其他都是wire型”就可以了。
cnt0是用always產(chǎn)生的信號(hào),因此類型為reg。cnt0計(jì)數(shù)的最大值為1,需要用1根線表示,即位寬是1位。
add_cnt0和end_cnt0都是用assign方式設(shè)計(jì)的,因此類型為wire。其值是0或者1,用1根線表示即可。
編輯模式下輸入“Reg1”“Wire1”可調(diào)用至簡設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼如下:

cnt1是用always產(chǎn)生的信號(hào),因此類型為reg。cnt1計(jì)數(shù)的最大值為800,那如何確定該值對(duì)應(yīng)的位寬是多少呢?至簡設(shè)計(jì)法在這里分享一個(gè)非常實(shí)用的技巧,打開計(jì)算器,點(diǎn)擊“查看”,選擇“程序員”模式,在“十進(jìn)制”下將信號(hào)值輸入進(jìn)去,就會(huì)獲得對(duì)應(yīng)的信號(hào)位寬。利用這一方法將cnt1的最大計(jì)數(shù)器800輸入到計(jì)算器中,如下圖所示,可以看出其位寬為10。本設(shè)計(jì)的數(shù)位比較小,這種方法在后續(xù)遇到比較大的數(shù)字時(shí)會(huì)方便很多,也不容易出錯(cuò)。

圖3.8-19通過計(jì)算器獲取信號(hào)位寬
add_cnt1和end_cnt1都是用assign方式設(shè)計(jì)的,因此類型為wire,其值是0或者1,1個(gè)線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼如下:

cnt2是用always產(chǎn)生的信號(hào),因此類型為reg。cnt2計(jì)數(shù)的最大值為525,需要用10根線表示,即位寬是10位。
add_cnt2和end_cnt2都是用assign方式設(shè)計(jì)的,因此類型為wire,并且其值是0或者1,用1根線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼如下:

lcd_rgb是用always方式設(shè)計(jì)的,因此類型為reg,其位寬是16位,16根線表示即可。編輯模式下輸入“Reg16”調(diào)用至簡設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼如下:

hys和vys是用always方式設(shè)計(jì)的,因此類型為reg,其值是0或1,需要1根線表示。編輯模式下輸入“Reg1”調(diào)用至簡設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼如下:

至此,整個(gè)代碼的設(shè)計(jì)工作已經(jīng)完成?;仡櫼幌卤竟こ痰恼麄€(gè)代碼設(shè)計(jì),可以發(fā)現(xiàn)一共需要3個(gè)計(jì)數(shù)器,這里同樣分享一個(gè)至簡設(shè)計(jì)法代碼模板,在“GVIM”中使用快捷命令“Jsq3”可以調(diào)出3個(gè)計(jì)數(shù)器的模板,調(diào)出的“Jsq3”模板如下圖所示,補(bǔ)充完整后可以得到完整的計(jì)數(shù)器代碼。

最終得到整個(gè)工程的代碼如下:





下一步是新建工程和上板查看現(xiàn)象。
第4節(jié)?綜合與上板
4.1?新建工程
打開軟件Quartus?Ⅱ,點(diǎn)擊“File”下拉列表中的New ProjectWzard...新建工程選項(xiàng),如下圖所示。

圖3.8-21Quartus新建工程
隨后會(huì)出現(xiàn)Quartus新建工程介紹,如下圖所示,直接點(diǎn)擊“Next”。

圖3.8-22Quartus新建工程介紹
此時(shí)會(huì)出現(xiàn)工程文件夾、工程名、頂層模塊名設(shè)置界面,如圖3.8- 23所示。設(shè)置目錄為:D:/mdy_book/color_exec1,工程名和頂層名為color_exec1。再次強(qiáng)調(diào),為了避免初學(xué)者在后續(xù)操作中發(fā)生程序跳出未知錯(cuò)誤的問題,強(qiáng)烈建議設(shè)置的文件目錄和工程名稱與本書保持一致。設(shè)置完成后點(diǎn)擊“Next”。

圖3.8-23QUARTUS新建工程設(shè)置名稱
新建工程類型設(shè)置如下圖所示,選擇“Emptyproject”,然后點(diǎn)擊“Next”。

圖3.8-24QUARTUS新建工程類型
接下來進(jìn)行文件添加,其界面如下圖所示。點(diǎn)擊右側(cè)的“Add”按鈕,選擇之前寫好的“color_exec1.v”文件,可以看到界面下方會(huì)顯示出文件,之后點(diǎn)擊“Next”。

圖3.8-25QUARTUS添加文件
圖3.8- 26為芯片選擇頁面,選擇“Cyclone?ⅣE”,在芯片型號(hào)選擇處選擇“EP4CE15F23C8”,之后點(diǎn)擊“Next”。

圖3.8-26QUARTUS選擇芯片型號(hào)
圖3.8- 27為QUARTUS設(shè)置工具界面,,不必做任何修改,直接點(diǎn)擊“Next”。

圖3.8-27QUARTUS設(shè)置工具界面
下圖為QUARTUS新建工程匯總界面,可以看到新建工程的匯總情況,點(diǎn)擊“Finish”完成新建工程。

圖3.8-28QUARTUS新建工程匯總界面
4.2?綜合
新建工程步驟完成后,就會(huì)出現(xiàn)如下圖所示的?QUARTUS新建工程后界面。

圖3.8-29QUARTUS新建工程后界面
點(diǎn)擊編譯按鈕,可以對(duì)整個(gè)工程進(jìn)行編譯。編譯成功的界面如下圖所示。

圖3.8-30QUARTUS編譯后界面
4.3?配置管腳
下面需要對(duì)相應(yīng)管腳進(jìn)行配置。如下圖所示,在菜單欄中選中“Assignments”,然后選擇“Pin Planner”,隨后會(huì)彈出配置管腳的窗口。

圖3.8-31QUARTUS配置管腳選項(xiàng)
在配置窗口最下方中的“l(fā)ocation”一列,參考信號(hào)和管腳關(guān)系,按照表3.8- 6中最右兩列配置好FPGA管腳,配置管理來源參見管腳配置環(huán)節(jié),最終配置的結(jié)果如圖3.8-32。配置完成后,關(guān)閉Pin Planner,軟件自動(dòng)會(huì)保存管腳配置信息。
表3.8 - 6信號(hào)和管腳關(guān)系


4.4?再次綜合
再次打開“QUARTUS”軟件,在菜單欄中選中“Processing”,然后選擇“StartCompilation”,再次對(duì)整個(gè)工程進(jìn)行編譯和綜合,如圖3.8- 33所示。

圖3.8-33QUARTUS編譯選項(xiàng)
當(dāng)出現(xiàn)如下圖所示的QUARTUS編譯成功標(biāo)志,則說明編譯綜合成功。

圖3.8-34QUARTUS編譯成功標(biāo)志
4.5?連接開發(fā)板
完成編譯后開始進(jìn)行上板調(diào)試操作,按照下圖的方式將下載器接入電腦USB接口,接上開發(fā)板電源,將開發(fā)板的VGA口連接到一臺(tái)顯示器上,然后按下下方藍(lán)色開關(guān),硬件連接完畢。

4.6?上板
打開QUARTUS界面,單擊界面中的“?

?”則會(huì)彈出配置界面。在界面中點(diǎn)擊“add file”添加“.sof”文件后點(diǎn)擊“Start”,會(huì)在“Progress”出現(xiàn)顯示進(jìn)度。

圖3.8-36QUARTUS界面
QUARTUS下載程序界面如下圖所示,當(dāng)進(jìn)度條到100%提示成功后,即可在顯示器上觀察到相應(yīng)的現(xiàn)象。

圖3.8-37QUARTUS下載程序界面
進(jìn)度條提示成功后,如果操作無誤此時(shí)可以在顯示器上看到640*480像素的紅色顯示區(qū)域。如果沒有顯示成功,就需要返回檢查一下連接是否到位,代碼是否編寫正確。如果無法自己完成錯(cuò)誤排查的話,可以重新按照步驟操作一遍,相信一定會(huì)達(dá)到想要的效果。
未完請(qǐng)看3.8VGA顯示顏色--明德?lián)P科教2(mdy-edu.com)