2.9 VGA顯示顏色-明德?lián)P至簡設(shè)計(jì)法原理與應(yīng)用
本節(jié)的文檔編號(hào):001700000020
需要看對應(yī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í)例文檔
1項(xiàng)目背景
1.1VGA介紹
VGA(Video Graphics Array)即視頻圖形陣列,是IBM在1987年隨PS/2(PS/2原是“Personal System 2”的意思,“個(gè)人系統(tǒng)2”,是IBM公司在1987年推出的一種個(gè)人電腦。PS/2電腦上使用的鍵盤鼠標(biāo)接口就是現(xiàn)在的PS/2接口。因?yàn)闃?biāo)準(zhǔn)不開放,PS/2電腦在市場中失敗了。只有PS/2接口一直沿用到今天)一起推出的使用模擬信號(hào)的一種視頻傳輸標(biāo)準(zhǔn),在當(dāng)時(shí)具有分辨率高、顯示速率快、顏色豐富等優(yōu)點(diǎn),在彩色顯示器領(lǐng)域得到了廣泛的應(yīng)用。這個(gè)標(biāo)準(zhǔn)對于現(xiàn)今的個(gè)人電腦市場已經(jīng)十分過時(shí)。即使如此,VGA仍然是最多制造商所共同支持的一個(gè)標(biāo)準(zhǔn),個(gè)人電腦在加載自己的獨(dú)特驅(qū)動(dòng)程序之前,都必須支持VGA的標(biāo)準(zhǔn)。例如,微軟Windows系列產(chǎn)品的開機(jī)畫面仍然使用VGA顯示模式,這也說明其在顯示標(biāo)準(zhǔn)中的重要性和兼容性。
VGA技術(shù)的應(yīng)用還主要基于VGA顯示卡的計(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.2VGA管腳

圖319

圖320

圖321
VGA接口是一種D型接口,采用非對稱分布的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)。
VGA接口15根針,其對應(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 )
對于FPGA邏輯設(shè)計(jì)來說,我們關(guān)注的信號(hào)是紅基色、綠基色、藍(lán)基色、行同步和場同步信號(hào)。其他信號(hào)都是原理圖和PCB設(shè)計(jì)時(shí)關(guān)注。

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

圖323
三基色顏色編碼:

以上RBG一共有8組合,也就是可以產(chǎn)生8種顏色。但顯示器顯示的色彩卻是非常豐富,遠(yuǎn)遠(yuǎn)多于8種顏色,這是如何做到的呢?
原因就是對于顯示器來說,RGB三個(gè)信號(hào)其實(shí)是模擬信號(hào),其電壓的高低,可以表示顏色的深淺。利用這個(gè)原理,我們就可以產(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)三基色,就可以控制1個(gè)像素的顏色。一幅圖像是由非常多的像素組成的。例如640*480分辨率的圖像,是由一行640個(gè)、一共480行,這么多像素組合起來顯示的圖像。為了讓顯示器顯示這么一幅圖像,那么就要控制顯示器的掃描槍一個(gè)一個(gè)像素地將顏色顯示起來。像素變化的時(shí)間非???,從而使人眼誤認(rèn)為所有像素是一起顯示的。
下面是CRT顯示器的控制框圖:

圖324
顯示器采用光柵掃描方式,即轟擊熒光屏的電子束在CRT屏幕上從左到右(受水平同步信號(hào)HSYNC控制)、從上到下(受垂直同步信號(hào)VSYNC控制)做有規(guī)律的移動(dòng)。電子束采用光柵掃描方式,從屏幕左上角一點(diǎn)開始,向右逐點(diǎn)進(jìn)行掃描,形成一條水平線;到達(dá)最右端后,又回到下一條水平線的左端,重復(fù)上面的過程;當(dāng)電子束完成右下角一點(diǎn)的掃描后,形成一幀。此后,電子束又回到左上方起點(diǎn),開始下一幀的掃描。這種方法也就是常說的逐行掃描顯示。
1.5VGA時(shí)序

圖325
行同步信號(hào)的時(shí)序如上圖。行同步信號(hào)周期性地產(chǎn)生高低電平,其一共可分成4個(gè)階段:同步脈沖a、顯示后沿b、顯示區(qū)域c和顯示前沿d。同步脈沖a表示著一行的結(jié)束,同時(shí)也是下一行的開始。顯示時(shí)序c是真正圖像顯示的區(qū)域,在此階段,像素逐個(gè)顯示出來,也就是說在此階段,我們要控制紅、綠、藍(lán)三基色信號(hào),輸出對應(yīng)像素的RGB值。在顯示后沿b和顯示前沿d這兩個(gè)階段,是消隱時(shí)刻,此時(shí)紅、綠、藍(lán)三基色信號(hào)都要求為0。
場同步信號(hào)的時(shí)序與行同步信號(hào)相似,如下圖。

圖326
場同步信號(hào)也是周期性地產(chǎn)生高低電平,其一共可分成4個(gè)階段:同步脈沖a、顯示后沿b、顯示區(qū)域c和顯示前沿d。但注意的是,場同步信號(hào)的變化單位是“一行”。例如,一個(gè)“場同步脈沖”時(shí)間包含多個(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)基色都要給低電平。
看時(shí)序的時(shí)候,不僅要關(guān)注其變化點(diǎn),還要關(guān)注持續(xù)的時(shí)間。在行場同步的四個(gè)階段,其時(shí)間分別是多少呢?下面是常見分辨率的參數(shù)。

以640*480/60Hz為例,640*480/60Hz是指刷新頻率為60Hz,分辨率為640X480。這個(gè)是標(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í)鐘),一共有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í)驗(yàn)中我們?nèi)?5M。
1.6明德?lián)PVGA原理圖
FPGA是數(shù)字芯片,管腳輸出的都是0和1的數(shù)字信號(hào),只有高電平和低電平。為了控制RGB電壓的高低,我們就必須用到數(shù)轉(zhuǎn)換DA芯片??梢杂脭?shù)字信號(hào)控制數(shù)模轉(zhuǎn)換芯片的輸入端,從而讓其輸出不同幅度的電壓值。
例如下圖中,F(xiàn)PGA產(chǎn)生RGB三種信號(hào),這時(shí)RGB都是多位的數(shù)字信號(hào),這些信號(hào)將給DA芯片,DA會(huì)根據(jù)這個(gè)數(shù)字信號(hào)產(chǎn)生不同電壓的模擬信號(hào)rgb。模擬信號(hào)rgb再連到顯示器上,就可以顯示豐富的顏色了。
在這里,讀者只要記住,F(xiàn)PGA可以通過數(shù)字信號(hào)控制DA芯片,DA芯片就可以產(chǎn)生不同電平。關(guān)于DA芯片的介紹,可以參考本書的DA轉(zhuǎn)換一章內(nèi)容。

圖327
明德?lián)P的教學(xué)板,VGA接口的原理圖如下。

圖328
行同步管腳連到信號(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管腳上。

圖329
換句話說,就是FPGA控制管腳C20和D20的輸出,就能控制VGA接口的行場同步了。
再來看VGA_RED、VGA_BLUE和VGA_GREEN信號(hào),其原理圖

圖330
由圖可見,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)基管腳的電壓。教學(xué)板使用了電阻網(wǎng)絡(luò)代替了DA芯片。

圖331
以VGA_RED的電壓受VGA_R0~VGA_R4的值產(chǎn)生為例
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。


2設(shè)計(jì)目標(biāo)
通過VGA連接線,將顯示器和教學(xué)板的VGA接口相連。連接示意圖如下。

圖332
然后FPGA產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時(shí)序,讓顯示器產(chǎn)生顯示一幅完整的紅色圖像,即下表中的第一種參數(shù)。提示:顯示器一般都會(huì)自適應(yīng)功能,無須設(shè)置就能識(shí)別不同分辨率的圖像。

其中,行的單位為“基準(zhǔn)時(shí)鐘”,即頻率為25MHz、周期為40ns的時(shí)鐘,注意列的單位為“行”。
上板效果圖如下圖所示,注意,不同顯示器會(huì)有差別。

圖333
3 設(shè)計(jì)實(shí)現(xiàn)
3.1頂層信號(hào)
新建目錄:D:mdy_bookcolor_exec1。在該目錄中,新建一個(gè)名為color_exec1.v的文件,并用GVIM打開,開始編寫代碼。
我們要實(shí)現(xiàn)的功能,概括起來就是FPGA產(chǎn)生VGA時(shí)序,即控制VGA_R4~R0、VGA_G5~G0、VGA_B4~B0、VGA_HSYNC和VGA_VSYNC,讓顯示器顯示紅色。其中,VGA_HSYNC和VGA_VSYNC,F(xiàn)PGA可根據(jù)時(shí)序產(chǎn)生高低電平。而顏色數(shù)據(jù),由于是固定的紅色,F(xiàn)PGA也能自己產(chǎn)生,不需要外部輸入圖像的數(shù)據(jù)。那么我們的FPGA工程,可以定義輸出信號(hào)hys表示行同步,用輸出信號(hào)vys表示場同步,定義一個(gè)16位的信號(hào)lcd_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。
我們還需要時(shí)鐘信號(hào)和復(fù)位信號(hào)來進(jìn)行工程控制。
綜上所述,我們這個(gè)工程需要五個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,場同步信號(hào)vys、行同步信號(hào)hys和RGB輸出信號(hào)lcd_rgb。

將module的名稱定義為color_exec1。并且我們已經(jīng)知道該模塊有五個(gè)信號(hào):clk、rst_n、lcd_hs、lcd_vs和lcd_rgb。為此,代碼如下:

其中clk、rst_n是輸入信號(hào),lcd_hs、lcd_vs和lcd_rgb是輸出信號(hào),其中clk、rst_n、lcd_hs、lcd_vs的值是0或者1,一根線即可,lcd_rgb為16位位寬的,根據(jù)這些信息,我們補(bǔ)充輸入輸出端口定義。代碼如下:

3.2架構(gòu)設(shè)計(jì)
需要注意的是,輸入進(jìn)來的時(shí)鐘clk是50MHz,而從分辨率參數(shù)表可知道,行單位的基準(zhǔn)時(shí)鐘是25 MHz。為此我們需要根據(jù)50MHz來產(chǎn)生一個(gè)25 MHz的時(shí)鐘,然后再用于產(chǎn)生VGA時(shí)序。
為了得到這個(gè)25M時(shí)鐘,我們需要一個(gè)PLL。PLL可以認(rèn)為是FPGA內(nèi)的一個(gè)硬核,它的功能是根據(jù)輸入的時(shí)鐘,產(chǎn)生一個(gè)或多個(gè)倍頻和分頻后的輸出時(shí)鐘,同時(shí)可以調(diào)整這些輸出時(shí)鐘的相位、占空比等。
例如,輸入進(jìn)來是50M時(shí)鐘,如果我需要一個(gè)100M時(shí)鐘,那么從邏輯上、代碼上是不可能產(chǎn)生的,我們就必須用到PLL來產(chǎn)生了。
整個(gè)工程的結(jié)構(gòu)圖如下。

圖334
PLL的生成方式過程,請看本案例的綜合工程和上板一節(jié)的內(nèi)容。
3.3VGA驅(qū)動(dòng)模塊設(shè)計(jì)
3.3.1模塊接口
在目錄:D:mdy_bookcolor_exec1中,建立一個(gè)color.v文件,并用GVIM打開,開始編寫代碼。
我們先分析功能。要控制顯示器,讓其產(chǎn)生紅色,也就是讓FPGA控制VGA_R0~4、VGA_G0~5、VGA_B0~4、VGA_VSYNC和VGA_HSYNC信號(hào)。那么VGA驅(qū)動(dòng)模塊,可以定義輸出信號(hào)hys表示行同步,用輸出信號(hào)vys表示場同步,定義一個(gè)16位的信號(hào)lcd_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。
同時(shí)該模塊的工作時(shí)鐘為25M,同時(shí)需要一個(gè)復(fù)位信號(hào)。
綜上所述,我們這個(gè)模塊需要五個(gè)信號(hào),25M時(shí)鐘clk,復(fù)位rst_n,場同步信號(hào)vys、行同步信號(hào)hys和RGB輸出信號(hào)lcd_rgb。
將module的名稱定義為color。并且我們已經(jīng)知道該模塊有五個(gè)信號(hào):clk、rst_n、hys、vys和lcd_rgb。為此,代碼如下:

其中clk、rst_n是輸入信號(hào),hys、vys和lcd_rgb是輸出信號(hào),其中clk、rst_n、hys、vys的值是0或者1,一根線即可,lcd_rgb為16位位寬的,根據(jù)這些信息,我們補(bǔ)充輸入輸出端口定義。代碼如下:

3.3.2信號(hào)設(shè)計(jì)
我們先設(shè)計(jì)場同步信號(hào)hys,VGA時(shí)序中的場同步信號(hào),其時(shí)序圖如下:

圖335
hys就是一個(gè)周期性地高低變化的脈沖。我們使用的是下表中的第一種分辨率,也就是同步脈沖a的時(shí)間是96個(gè)時(shí)鐘周期,而顯示后沿b是48個(gè)時(shí)鐘周期,顯示時(shí)序c是640個(gè)時(shí)鐘周期,顯示前沿是16個(gè)時(shí)鐘周期,一共是800個(gè)時(shí)鐘周期。

將時(shí)間信號(hào)填入圖中,更新后的時(shí)序圖如下:

圖336
很顯然,我們需要1個(gè)計(jì)數(shù)器來產(chǎn)生這個(gè)時(shí)序,我們將該計(jì)數(shù)器命名為h_cnt。由于hys是不停地產(chǎn)生的,那么h_cnt就是不停地計(jì)數(shù),每個(gè)時(shí)鐘都要計(jì)數(shù)器,所以認(rèn)為該計(jì)數(shù)器的加1條件為“1”,可寫成:assign add_h_cnt = 1。從上圖可知,該計(jì)數(shù)器的周期是800。綜上所述,該計(jì)數(shù)器的代碼如下:

有了計(jì)數(shù)器h_cnt,那么hys信號(hào)就有了對齊的對象。從時(shí)序圖可以發(fā)現(xiàn),hys有兩個(gè)變化點(diǎn),一個(gè)是h_cnt數(shù)到96個(gè)時(shí),由0變1;另一個(gè)是當(dāng)h_cnt數(shù)到800個(gè)時(shí),由1變0。所以,場同步信號(hào)的代碼如下:

接下來設(shè)計(jì)vys信號(hào)。該信號(hào)的時(shí)序圖如下所示。

圖337
vys就是一個(gè)周期性地高低變化的脈沖。我們使用的是表中的第一種分辨率,查詢表可知,同步脈沖a的時(shí)間是2行的時(shí)間,而顯示后沿b是33行,顯示時(shí)序c是480行,顯示前沿是10行,一共是525行。其中,一“行”結(jié)束,也就是h_cnt數(shù)完了。
將時(shí)間信號(hào)填入圖中,更新后的時(shí)序圖如下:

圖338
很顯然,我們還需要1個(gè)計(jì)數(shù)器來產(chǎn)生這個(gè)時(shí)序,我們將該計(jì)數(shù)器命名為v_cnt。該計(jì)數(shù)器是用來數(shù)有多少行的,所以加1條件就是一行結(jié)束,即end_h_cnt,可寫成:assign add_v_cnt = end_h_cnt。從上圖可知,該計(jì)數(shù)器的周期是525。綜上所述,該計(jì)數(shù)器的代碼如下:

有了計(jì)數(shù)器v_cnt,那么vys信號(hào)就有了對齊的對象。從時(shí)序圖可以發(fā)現(xiàn),vys有兩個(gè)變化點(diǎn),一個(gè)是v_cnt數(shù)到2個(gè)時(shí),由0變1;另一個(gè)是當(dāng)h_cnt數(shù)到525個(gè)時(shí),由1變0。所以,場同步信號(hào)的代碼如下:

最后我們還有一個(gè)信號(hào)需要設(shè)計(jì),那就是lcd_rgb信號(hào)。我們要顯示紅色,即lcd_rgb輸出的值為“16’b11111_000000_00000”。但注意的是,要在“顯示區(qū)域”才能賦給這個(gè)值,在其他區(qū)域要將lcd_rgb的值賦值為0?!帮@示區(qū)域”是什么時(shí)候?就是場同步信號(hào)vys和行同步信號(hào)都處于“顯示區(qū)域c”階段。結(jié)合時(shí)序圖可知,就是h_cnt大于(96+48)并且小于(96+48+640),v_cnt大于(2+33)并且小于(2+33+480)。為了設(shè)計(jì)方便,添加一個(gè)信號(hào)red_area,當(dāng)red_area=1就表示為此區(qū)域。

有了red_area,設(shè)計(jì)lcd_rgb就好辦了。當(dāng)red_area=1時(shí),lcd_rgb輸出“16’b11111_000000_00000”,否則輸出0。

此次,主體程序已經(jīng)完成。接下來是將module補(bǔ)充完整。
3.3.3信號(hào)定義
接下來定義信號(hào)類型。
h_cnt是用always產(chǎn)生的信號(hào),因此類型為reg。h_cnt計(jì)數(shù)的最大值為800,需要用10根線表示,即位寬是10位。因此代碼如下:

add_h_cnt和end_h_cnt都是用assign方式設(shè)計(jì)的,因此類型為wire。并且其值是0或者1,1個(gè)線表示即可。因此代碼如下:

v_cnt是用always產(chǎn)生的信號(hào),因此類型為reg。v_cnt計(jì)數(shù)的最大值為525,需要用10根線表示,即位寬是10位。因此代碼如下:

add_v_cnt和end_v_cnt都是用assign方式設(shè)計(jì)的,因此類型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:

lcd_rgb是用always方式設(shè)計(jì)的,因此類型為reg。并且它的位寬是16位,16根線表示即可。因此代碼如下:

hys和vys是用always方式設(shè)計(jì)的,因此類型為reg。并且其值是0或1,需要1根線表示即可。因此代碼如下:

red_area是用always方式設(shè)計(jì)的,因此類型為reg。并且其值是0或1,用一根線表示即可,因此代碼如下:

3.4頂層模塊設(shè)計(jì)
3.4.1例化子模塊
例化PLL IP核的代碼

例化驅(qū)動(dòng)模塊的代碼

3.4.2信號(hào)定義
clk_0是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:

lcd_sh和lcd_vs是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:

lcd_rgb是在例化文件中,因此類型為wire。它的位寬是16位的,用16根線表示即可。因此代碼如下:

lcd_xpos和lcd_ypos是在例化文件中,因此類型為wire。并且其值是0或1,用一根線表示即可。因此代碼如下:

至此,整個(gè)代碼的設(shè)計(jì)工作已經(jīng)完成。下一步是新建工程和上板查看現(xiàn)象。
4綜合與上板
4.1新建工程
1.首先在d盤中創(chuàng)建名為“color_exec1”的工程文件夾,將寫的代碼命名為“color_exec1.v”,頂層模塊名為“color_exec1”,VGA驅(qū)動(dòng)模塊命名為“color.v”。

圖339

圖340

圖341
2.然后打開QuartusⅡ,點(diǎn)擊File下拉列表中的New Project Wzard...新建工程選項(xiàng)。

圖342
3.在出現(xiàn)的界面中直接點(diǎn)擊最下方的“Next”。

圖343
4.之后出現(xiàn)的是工程文件夾、工程名、頂層模塊名設(shè)置界面。按照之前的命名進(jìn)行填寫,第一欄選擇工程文件夾“color_exec1”,第二欄選擇工程文件“color_exec1.v”,最后一欄選擇頂層模塊名“color_exec1”,然后點(diǎn)擊”Next”,在出現(xiàn)的界面選擇empty project。

圖344

圖345
5.之后是文件添加界面。在上方一欄中添加之前寫的”color.v和color_exec1.v”文件和生成的“my_pll”,點(diǎn)擊右側(cè)的“Add”按鈕,之后文件還會(huì)出現(xiàn)在大方框中,之后點(diǎn)擊“Next”。

圖346
6.器件型號(hào)選擇界面。在“Device family”處選擇CycloneⅣE,在“Available devices”處選擇EP4CE15F23C8,然后點(diǎn)擊“Next”。

圖347
7.EDA工具界面。該頁面用默認(rèn)的就行,直接點(diǎn)擊最下方“Next”。

圖348
8.之后出現(xiàn)的界面是我們前面的設(shè)置的總結(jié),確認(rèn)沒有錯(cuò)誤后點(diǎn)擊“Finish”。

圖349
4.2PLL
PLL是FPGA芯片的一個(gè)硬核,在QUARTUS中,我們無須編寫代碼,而是用IP核生成工具產(chǎn)生PLL模塊,然后在頂層模塊中例化就可以使用了。下面步驟詳細(xì)說明了PLL IP核的生成過程和使用方面。
1.打開IP核管理工具
打開quartus軟件,然后選擇Tools ->IPcatalog,在右側(cè)彈出如下界面

圖350
在搜索框中,填下ALTPLL,就會(huì)出現(xiàn)如下界面。

圖351
ALTPLL就是我們需要使用的PLL IP核。雙擊ALTPLL,在彈出的對話框中起個(gè)文件名,如vga_pll,記得選擇verilog。然后點(diǎn)OK就可以開始設(shè)置參數(shù)了。

圖352
2.設(shè)置IP參數(shù)

圖353
上圖中,主要是設(shè)置輸入的時(shí)鐘頻率,明德?lián)P開發(fā)板輸入時(shí)鐘是固定的50MHz,因此可填寫50,注意旁邊的單位是選擇MHz。其他默認(rèn),按next。

圖354
上圖的option inputs中,全部取消勾選,不需要產(chǎn)生復(fù)位信號(hào)。上圖中的lock output,全部取消勾選,不需要產(chǎn)生locked指示信號(hào)。然后選Next。

圖355
不用做任何更改,直接Next。

圖356
不用做任何更改,直接Next。

圖357
增加輸入時(shí)鐘,由于我們只有一個(gè)輸入時(shí)鐘,所以只用inclk0即可,無需增加。直接Next。

圖358
不用做任何更改,直接Next。

圖359
設(shè)置c0的輸出頻率。我們選擇Enter output clock frequest中,直接填入25,單位選擇MHz,就是表示要產(chǎn)生25MHz的時(shí)鐘。然后點(diǎn)擊Finish,彈出如下窗口。

圖360
取消my_pll_bb.v的勾選,然后選擇Finish。QUARTUS就會(huì)產(chǎn)生PLL IP的代碼了。
稍等片刻,到工程目錄D:/color_exec1,可以看到生成一個(gè)vga_pll.v文件,用GVIM打開后,可以看到PLL模塊的模塊輸入輸出接口。其中inclk0是50MHz輸入時(shí)鐘,c0是25MHz的輸出時(shí)鐘。頂層模塊直接例化就可以使用了。

圖361
4.3綜合
1.新建工程步驟完成后,就會(huì)出現(xiàn)以下界面。在“Project Navigator”下選中要編譯的文件,點(diǎn)擊上方工具欄中“Start Compilation”編譯按鈕(藍(lán)色三角形)。

圖362
2.編譯成功后會(huì)出現(xiàn)以下界面。

圖363
4.4配置管腳

圖364
在菜單欄中,選中Assignments,然后選擇Pin Planner,就會(huì)彈出配置管腳的窗口。

圖365
在配置窗口最下方中的location一列,參考下表中最右兩列配置好FPGA管腳。

注意注意:與其他案例不同的是,VGA案例中所有管腳的電平必須選用為LVCMOS3.3,而不能是default。如下圖所示。
配置完成后,關(guān)閉Pin Planner,軟件自動(dòng)會(huì)保存管腳配置信息。
4.5再次綜合

圖366
在菜單欄中,選中Processing,然后選擇Start Compilation,再次對整個(gè)工程進(jìn)行編譯和綜合。

圖367
出現(xiàn)上面的界面,就說明編譯綜合成功。
4.6連接開發(fā)板
圖中,下載器接入電腦USB接口,電源接入電源,vga線連接顯示器,然后摁下電源開關(guān),看到開發(fā)板燈亮。

圖368
4.7上板
1.雙擊Tasks一欄中”Program Device”。

圖369
2.會(huì)出現(xiàn)如下界面,點(diǎn)擊add file添加.sof文件,在右側(cè)點(diǎn)擊“Start”,會(huì)在上方的“Progress”處顯示進(jìn)度。

圖370
3.進(jìn)度條中提示成功后,即可在顯示器上觀察到相應(yīng)的現(xiàn)象。