2.10 VGA顯示矩陣-明德?lián)P至簡(jiǎn)設(shè)計(jì)法原理與應(yīng)用
本節(jié)的文檔編號(hào):001700000021
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):001700000442
1、至間原理與應(yīng)用配套的案例和PPT講解
2、本設(shè)計(jì)需要通過(guò)VGA線將顯示器和開發(fā)板進(jìn)行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時(shí)序,使得顯示器產(chǎn)生顯示一幅完整的矩陣圖像。這幅矩陣圖像即為顯示屏邊緣上顯示一個(gè)寬為20像素的紅色邊框,在屏幕的中央顯示一個(gè)長(zhǎng)為150像素、高為100像素的綠色矩形。步驟性教學(xué);
3、Altera和Xilinx入門學(xué)習(xí)案例文檔
1項(xiàng)目背景
請(qǐng)參考“VGA顯示顏色”案例中的項(xiàng)目背景內(nèi)容。
2設(shè)計(jì)目標(biāo)
通過(guò)VGA連接線,將顯示器和教學(xué)板的VGA接口相連。連接示意圖如下。

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

其中,行的單位為“基準(zhǔn)時(shí)鐘”,即頻率為25MHz、周期為40ns的時(shí)鐘,注意列的單位為“行”。
矩陣圖像是在顯示屏邊緣上顯示一個(gè)紅色邊框(邊框?qū)挒?0像素),在屏幕的中央顯示一個(gè)綠色矩形(矩形長(zhǎng)為150像素,高為100像素)。

圖372
注意,不同顯示器會(huì)有差別。
3設(shè)計(jì)實(shí)現(xiàn)
3.1頂層接口
新建目錄:D:mdy_book ec_exec1。在該目錄中,新建一個(gè)名為rec_exec1.v的文件,并用GVIM打開,開始編寫代碼。
我們要實(shí)現(xiàn)的功能,概括起來(lái)就是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表示場(chǎng)同步,定義一個(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)來(lái)進(jìn)行工程控制。
綜上所述,我們這個(gè)工程需要五個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,場(chǎng)同步信號(hào)vys、行同步信號(hào)hys和RGB輸出信號(hào)lcd_rgb。

將module的名稱定義為rec_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)來(lái)的時(shí)鐘clk是50MHz,而從分辨率參數(shù)表可知道,行單位的基準(zhǔn)時(shí)鐘是25 MHz。為此我們需要根據(jù)50MHz來(lái)產(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)來(lái)是50M時(shí)鐘,如果我需要一個(gè)100M時(shí)鐘,那么從邏輯上、代碼上是不可能產(chǎn)生的,我們就必須用到PLL來(lái)產(chǎn)生了。
整個(gè)工程的結(jié)構(gòu)圖如下。

圖373
PLL的生成方式過(guò)程,請(qǐng)看本案例的綜合工程和上板一節(jié)的內(nèi)容。
3.3VGA驅(qū)動(dòng)模塊設(shè)計(jì)
3.3.1接口信號(hào)
在目錄:D:mdy_book ec_exec1中,建立一個(gè)rectangle.v文件,并用GVIM打開,開始編寫代碼。
將module的名稱定義為rectangle。并且我們已經(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ǔ)充輸入輸出端口定義。代碼如下:

我們先分析功能。要控制顯示器,讓其產(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表示場(chǎng)同步,定義一個(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,場(chǎng)同步信號(hào)vys、行同步信號(hào)hys和RGB輸出信號(hào)lcd_rgb。
3.3.2信號(hào)設(shè)計(jì)
我們先設(shè)計(jì)場(chǎng)同步信號(hào)hys,VGA時(shí)序中的場(chǎng)同步信號(hào),其時(shí)序圖如下:

圖374
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í)序圖如下:

圖375
很顯然,我們需要1個(gè)計(jì)數(shù)器來(lái)產(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)就有了對(duì)齊的對(duì)象。從時(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。所以,場(chǎng)同步信號(hào)的代碼如下:

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

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

圖377
很顯然,我們還需要1個(gè)計(jì)數(shù)器來(lái)產(chǎn)生這個(gè)時(shí)序,我們將該計(jì)數(shù)器命名為v_cnt。該計(jì)數(shù)器是用來(lái)數(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)就有了對(duì)齊的對(duì)象。從時(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。所以,場(chǎng)同步信號(hào)的代碼如下:

最后我們還有一個(gè)信號(hào)需要設(shè)計(jì),那就是lcd_rgb信號(hào)。

圖378
我們?cè)陲@示器中一共要顯示三種顏色:紅色、綠色和白色。lcd_rgb等于16’b11111_000000_00000時(shí)表示紅色;lcd_rgb等于16’b00000_111111_00000時(shí)表示綠色;lcd_rgb等于16’b11111_111111_11111時(shí)表示白色。還要注意的是,在非顯示區(qū)域,lcd_rgb的值要為0,才能正確顯示。我們現(xiàn)在要仔細(xì)區(qū)分,在什么時(shí)候分別輸出上面的值。結(jié)合VGA時(shí)序,h_cnt和v_cnt,可以得到下面結(jié)論。
顯示區(qū)域:(h_cnt >=(96+48)&& h_cnt <(96+48+640)),并且(v_cnt>=(2+33) && v_cnt<(2+33+480))
紅色區(qū)域:(h_cnt >=(96+48)&& h_cnt <(96+48+20))或者
(h_cnt >=(96+48+620)&& h_cnt <(96+48+640))或者
(v_cnt >= (2+33) && v_cnt<(2+33+20))或者
(v_cnt >= (2+33+460) && v_cnt<(2+33+480))
綠色區(qū)域:(h_cnt >=(96+48+320-75)&& h_cnt <(96+48+320+75))并且
(v_cnt >= (2+33+240-50) && v_cnt<(2+33+240+50))
白色區(qū)域:在顯示區(qū)域中,非紅色區(qū)域并且非綠色區(qū)域的,就是白色區(qū)域。
非顯示區(qū)域:顯示區(qū)域之外的,就是非顯示區(qū)域。
我們可以設(shè)計(jì)幾個(gè)信號(hào)來(lái)表示這些區(qū)域。顯示區(qū)域用valid_area=1表示,紅色區(qū)域用red_area=1表示,綠色區(qū)域用green_area=1表示??傻玫酱a如下:

有了red_area、green_area和valid_area后,設(shè)計(jì)lcd_rgb就好辦了。
非顯示區(qū)域(valid_area=0),lcd_rgb輸出“16’b0”;
顯示區(qū)域(valid_area)中的紅色區(qū)域(red_area=1),lcd_rgb輸出“16’b11111_000000_00000”;
顯示區(qū)域(valid_area)中的綠色區(qū)域(green_area=1),lcd_rgb輸出“16’b00000_111111_00000”;
顯示區(qū)域(valid_area)中的非紅色區(qū)域(red_area=0)且非綠色區(qū)域(green_area=0),lcd_rgb輸出“16’b11111_111111_11111”。
則可以寫出代碼如下:

此次,主體程序已經(jīng)完成。接下來(lái)是將module補(bǔ)充完整。
3.3.3信號(hào)定義
接下來(lái)定義信號(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、green_area和valid_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根線表示即可。因此代碼如下:

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

圖379

圖380

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

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

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

圖384

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

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

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

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

圖389
4.2PLL
新建工程后,就要生成PLL IP核。本節(jié)的PLL生成過(guò)程,與案例“VGA顯示顏色”第四點(diǎn)綜合工程和上板中的PLL內(nèi)容一致,注意其中的地址有不同。
4.3綜合
1.新建工程步驟完成后,就會(huì)出現(xiàn)以下界面。在“Project Navigator”下選中要編譯的文件,點(diǎn)擊上方工具欄中“Start Compilation”編譯按鈕(藍(lán)色三角形)。

圖390
2.編譯成功后會(huì)出現(xiàn)以下界面,點(diǎn)擊“OK”。

圖391
4.4配置管腳

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

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

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

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

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

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

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

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