3.10VGA顯示圓-明德?lián)P至簡設(shè)計法原理與應(yīng)用
本文文檔編號:001700000022
需要看對應(yīng)的視頻,請點擊視頻編號:001700000444
1、至簡原理與應(yīng)用配套的案例和PPT講解
2、本設(shè)計需要通過VGA連接線將顯示器和開發(fā)板進行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時序,使得顯示器產(chǎn)生圖像其中圖像中間有一個直徑為100像素的圓。圓內(nèi)顯示顏色為綠色,圓外顯示顏色是白色。步驟性教學(xué);
3、Altera和Xilinx入門學(xué)習(xí)案例文檔
第十章?VGA顯示圓
第1節(jié)?項目背景
? ?在一個平面內(nèi),一動點以一定點為中心,以一定長度為距離旋轉(zhuǎn)一周所形成的封閉曲線叫做圓,如下圖所示,同時其也可以理解為在同一平面內(nèi)到定點距離為定長的點的集合。圓有無數(shù)個點,可以表示為集合{M||MO|=r}。

圖3.10-1圓的定義
在平面直角坐標(biāo)系中,以點O(a,b)為圓心,以r為半徑的圓的標(biāo)準(zhǔn)方程是?

?。同理,以原點為圓心,半徑為r(r>0)的圓的標(biāo)準(zhǔn)方程為?

?。
舉個例子,在平面直角坐標(biāo)系中以坐標(biāo)(4,4)為圓心畫一個半徑為2的圓,如下圖所示。由于圓的定義即到圓心的距離相等點的集合,因此該坐標(biāo)系中點到圓心的距離公式為?

?。如果想要判斷一點是否在圓內(nèi),可以將該點到圓心的距離與圓的半徑進行比較,這一距離如果大于半徑該點即在圓外,如果小于半徑該點即在圓內(nèi)。
如下圖中的紅色點所示,其坐標(biāo)為(3,5),已知圓心坐標(biāo)為(4,4),因此紅點到圓心的距離則為?

?。可知?

?,半徑?

?,由于2<4,即紅點到圓心的距離小于半徑,因此可以判斷紅點為圓內(nèi)一點。同理可得藍點(7,2)到圓心的距離為?

?,可知?

?,半徑r2=22=4,由于13>4,即藍點到圓心的距離大于半徑,因此可以判斷藍點為圓外一點。
可以看出:不論是紅點還是藍點到圓心的距離均需要進行開根號這一步驟,這樣會大大增加對比數(shù)字大小的難度,因此在實際使用中,可以將距離的平方與半徑的平方進行對比。即?

?時點在圓上,?

?時,點在圓外。本次工程將利用這一公式完成設(shè)計。

圖3.10-2圓內(nèi)點和圓外點的判斷
第2節(jié)?設(shè)計目標(biāo)
? 掌握了圓的產(chǎn)生條件后來進行本次工程的設(shè)計。上一章中本書學(xué)習(xí)了通過VGA顯示矩陣圖像,這一章將在上一章的基礎(chǔ)上進行難度提升,學(xué)習(xí)通過VGA顯示顏色的設(shè)計。按照至簡設(shè)計法的思路,在進行設(shè)計之前首先應(yīng)明確設(shè)計目標(biāo)。明確了設(shè)計目標(biāo)后,后續(xù)的每一步操作就是圍繞設(shè)計目標(biāo)進行展開的。如果沒有牢記設(shè)計目標(biāo)就開始動手進行實踐操作,最終的作品也是東拼西湊的產(chǎn)物,一旦在設(shè)計過程中出現(xiàn)了問題就需要花費大量的精力進行尋找修復(fù)。只有在開始學(xué)習(xí)時就養(yǎng)成良好的設(shè)計習(xí)慣,才能在后續(xù)的職業(yè)生涯中受益。因此建議一定要弄懂設(shè)計目標(biāo)再進行后面部分的學(xué)習(xí)。
本設(shè)計需要通過VGA連接線將顯示器和開發(fā)板進行連接,F(xiàn)PGA在連接成功后產(chǎn)生640*480分辨率,刷新頻率為60Hz的VGA時序,使得顯示器產(chǎn)生圖像其中圖像中間有一個直徑為100像素的圓。圓內(nèi)顯示顏色為綠色,圓外顯示顏色是白色,其效果圖如圖3.10-3所示。
圖3.10-3 VGA顯示圓效果圖
顯示器一般都具有分辨率自適應(yīng)功能,無須設(shè)置就能識別不同分辨率的圖像。本設(shè)計的相應(yīng)參數(shù)參見表3.10-1中的第一行,這里VGA常用分辨率的對應(yīng)時序參數(shù)并不是隨意設(shè)定的,而是國際通用標(biāo)準(zhǔn),每個關(guān)于VGA的設(shè)計工程都需要遵守這一標(biāo)準(zhǔn)。其中,行的單位為“基準(zhǔn)時鐘”,即頻率為25MHz、周期為40ns的時鐘,列的單位則為“行”,請讀者朋友們一定區(qū)分好。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表3.10-1VGA常用分辨率

設(shè)計完成后,通過VGA連接線將顯示器和教學(xué)板的VGA接口相連,連接示意圖如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖3.10-4教學(xué)板連接示意圖
上板后顯示器展示效果圖如下圖所示,不同的顯示器會有一定的色差,需要以實際顯示情況為主??梢钥吹斤@示器中央顯示圓的直徑為100像素,圓內(nèi)顯示顏色為綠色,圓外顯示顏色是白色。想要觀看連接后的演示視頻效果的讀者朋友可以登陸至簡設(shè)計法官網(wǎng)學(xué)習(xí):www.mdy-edu.com/xxxx。

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

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

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

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

圖3.10-6VGA行同步時序
根據(jù)時序圖可以看到,hys是一個周期性地高低變化的脈沖。根據(jù)設(shè)計目標(biāo)可知圖像分辨率選定為640*480,因此使用下表中的640*480分辨率的相關(guān)參數(shù)。即同步脈沖a的時間是96個基準(zhǔn)時鐘,顯示后沿b的時間是48個基準(zhǔn)時鐘周期,顯示時序c的時間是640個基準(zhǔn)時鐘,顯示前沿的時間是16個基準(zhǔn)時鐘,共計800個基準(zhǔn)時鐘(800=96+48+640+16)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表3.10-1 VGA常用分辨率

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

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

圖3.10-8至簡設(shè)計法調(diào)用計數(shù)器代碼模板
補充完整后得到計數(shù)基準(zhǔn)時間的計數(shù)器cnt0代碼如下。

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

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

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

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

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

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

最后進行l(wèi)cd_rgb信號的設(shè)計。從設(shè)計目標(biāo)可知在顯示器中一共要顯示兩種顏色:綠色和白色。前面章節(jié)中列出了設(shè)計使用顏色的相應(yīng)信號值,當(dāng)lcd_rgb等于16’b00000_111111_00000時表示綠色;lcd_rgb等于16’b11111_111111_11111時表示白色。這里一定要注意,設(shè)計目標(biāo)需要在“顯示區(qū)域”才能進行顏色賦值,在非顯示區(qū)域,lcd_rgb的值要為0,才能正確實現(xiàn)效果顯示。
在本設(shè)計中可以看到圖像分為兩部分:圓內(nèi)和圓外,如下圖所示。圓內(nèi)和圓外的顏色不同,圓外顯示白色,圓內(nèi)顯示綠色。因此需要仔細區(qū)分,在什么時候輸出上面對應(yīng)的顏色賦值。
圖3.10-11 VGA顯示圓效果圖
那么如何區(qū)分圓內(nèi)和圓外呢?在項目背景時講過圓的概念,回想一下圓的定義公式:file:///C:UsersxkdnAppDataLocalTempksohtml10836wps19.jpg,分析一下file:///C:UsersxkdnAppDataLocalTempksohtml10836wps20.jpg得到的是點到圓心的距離。當(dāng)這個距離小于file:///C:UsersxkdnAppDataLocalTempksohtml10836wps21.jpg的時候,點在圓內(nèi);反之當(dāng)點到圓心的距離大于file:///C:UsersxkdnAppDataLocalTempksohtml10836wps22.jpg的時候,點在圓外。那么就可以理解為,圓內(nèi)的區(qū)域為file:///C:UsersxkdnAppDataLocalTempksohtml10836wps23.jpg,圓外的區(qū)域為file:///C:UsersxkdnAppDataLocalTempksohtml10836wps24.jpg。
圓的原理和公式是大家在初中學(xué)到的知識,對于FPGA工程師來說圓的基本原理是非常簡單的。在這里可以把公式看做一個算法,而本設(shè)計的關(guān)鍵則就是如何利用FPGA來實現(xiàn)圓的算法。有很多讀者會誤認為學(xué)習(xí)FPGA中工具的使用很簡單,而每個工程的算法設(shè)計才是最重要的。針對此觀點,有時候讀者過度的把復(fù)雜的東西簡單化,簡單的東西復(fù)雜化。有些讀者一聽到算法,就覺得很高大上。但是如果真正的掌握了至簡設(shè)計法的核心思想,用心剖析每一個工程就可以發(fā)現(xiàn)算法其實就是一些數(shù)學(xué)公式,利用簡單的有加法運算如求和、求平均數(shù)等,或是再復(fù)雜一些FFT等公式來解決某個問題。目前能接觸到的設(shè)計幾乎都是在簡單公式的基礎(chǔ)上,進行組合或者重復(fù)使用。根據(jù)多年的從業(yè)經(jīng)驗以及自身的設(shè)計能力,想要創(chuàng)造、發(fā)明、改進一套算法很難,只有具有良好數(shù)學(xué)功底的高材生才可以很好的完成這些具有研究性、創(chuàng)造性的算法,這些算法的開發(fā)更多的時候需要的是天賦,并不是單單通過學(xué)習(xí)訓(xùn)練可以完成的。對于普通設(shè)計師來說,應(yīng)該更多地將精力用于找到算法、讀懂算法、實現(xiàn)算法、解決問題。同學(xué)們學(xué)習(xí)FPGA,即是學(xué)習(xí)如何將各種已經(jīng)存在的算法利用FPGA進行實現(xiàn),這也是比較現(xiàn)實且具有可行性的目標(biāo)。當(dāng)然,這并不是說要求讀者不去創(chuàng)造,不去思考,而是建議同學(xué)們靈活運用現(xiàn)有算法,當(dāng)大家真正扎實的掌握了FPGA后再不斷地鉆研創(chuàng)造。學(xué)習(xí)的過程中既要腳踏實地也要仰望星空,哪怕創(chuàng)造這條道路比較艱辛,也要懷揣著崇高的理想堅定不疑地走下去。
回到正題,接下來要討論如何使用FPGA實現(xiàn)算法file:///C:UsersxkdnAppDataLocalTempksohtml10836wps25.jpg。首先需要搞清楚公式里面的每個元素代表了什么,并且在FPGA中將它們表示出來。
圖3.10-12顯示點與圓心的關(guān)系
上圖是在顯示器中表示點與圓心關(guān)系的表示圖。
回顧一下工程背景可以知道點到圓心的距離公式可以用坐標(biāo)軸表示,這里同樣將顯示器當(dāng)做坐標(biāo)軸,橫軸x軸為最上面一條線,豎軸y軸為最左邊一條線,坐標(biāo)軸方向與圖像顯示行進方向一致,單位為像素,x軸以向右為正,y軸以向下為正,第一個像素點即左上角的點為(0,0)。
下面將現(xiàn)有的值通過坐標(biāo)軸表示出來。
首先確定圖像的顯示范圍,根據(jù)設(shè)計目標(biāo)可以知道圖像顯示分辨率為640*480,因此可以得出顯示圖像區(qū)域的坐標(biāo)范圍,在屏幕中x的范圍是0~639,y的范圍是0~479,最右下角的坐標(biāo)是(639,479)。有些讀者會表示疑問:分辨率命名是640*480,為什么其范圍是639*479呢?這是因為每一個像素點是從0開始數(shù)的,比如當(dāng)坐標(biāo)軸為8時其實數(shù)了9個像素點,因此這里的坐標(biāo)范圍需要減1。
在用FPGA進行設(shè)計時,可以用cnt1和cnt2來表示x和y。在這里要注意一下,VGA時序中并不是只有顯示區(qū)域,還存在同步脈沖和顯示前沿這一部分,cnt1和cnt2表示的是整個VGA時序。因此,x=0和y=0的點應(yīng)該是顯示區(qū)域的第一個像素點,即當(dāng)cnt1=96+48,cnt2=2+33時,x=0和y=0。綜上所述用cnt1和cnt2來表示x和y,則有x = cnt1-96-48,y=cnt2-2-33。
接下來確定圓心的值,圓心的坐標(biāo)為(a,b)。根據(jù)設(shè)計目標(biāo)可知需要在屏幕正中心顯示一個圓,因此中間位置就是行和列的中間值即a=640/2=320,b=480/2=240,即圓心坐標(biāo)為(320,240)。
前面分析過判斷任意點在圓內(nèi)還是圓外的依據(jù)是點到圓心的距離,該距離小于圓的半徑即在圓內(nèi),距離大于圓的半徑即在圓外。那么此時還需要知道一個條件,即圓半徑r的值。根據(jù)設(shè)計目標(biāo),需要顯示的圓直徑為100個像素,半徑r=100/2=50,即r為50。
至此,可將算法file:///C:UsersxkdnAppDataLocalTempksohtml10836wps26.jpg中的所有值都利用FPGA表示出來。用distance表示距離的平方,可以得出distance = (x-a)*(x-a) + (y-b)*(y-b) = (cnt1-96-48 -320) *(cnt1-96-48 -320) +(cnt2-2-33 -240) *(cnt2-2-33 -240),其代碼表示如下:

根據(jù)目標(biāo)可知如果distance小于r2=(50)2=2500?,表示點在圓內(nèi),否則點在圓外。
確定VGA背景的講解部分有說明過顯示區(qū)域如何確定,場同步信號處于顯示區(qū)域且行同步信號也處于顯示區(qū)域時才是真正的顯示區(qū)域,而其他區(qū)域中紅、綠、藍基色都應(yīng)賦值為低電平時,從而實現(xiàn)VGA顏色顯示。根據(jù)本工程的設(shè)計目標(biāo)可以得出:
顯示區(qū)域:(cnt1>=(96+48)&&cnt1<(96+48+640))并且(cnt2>=(2+33) &&cnt2<(2+33+480))。其中顯示區(qū)域又可分成綠色區(qū)域和白色區(qū)域;
綠色區(qū)域:點在圓內(nèi)即distance < 2500時為綠色區(qū)域,此時lcd_rgb輸出“16’b00000_111111_00000”;
白色區(qū)域:在顯示區(qū)域中非綠色區(qū)域的即為白色區(qū)域,此時lcd_rgb輸出“16’b11111_111111_11111”;
非顯示區(qū)域:顯示區(qū)域之外的就是非顯示區(qū)域,非顯示區(qū)域lcd_rgb要給低電平,即輸出“16’b0”。
其具體代碼表示如下:

至此,主體程序已經(jīng)完成。
3.3?信號定義
接下來將module補充完整,首先來定義信號類型。再次強調(diào),在進行reg和wire的判斷的時候,總?cè)菀状嬖诙嘤嗟穆?lián)想,比如認為reg就是寄存器,wire是線;或者認為reg會綜合成寄存器,wire不會綜合成寄存器。但是這些其實和reg型還是wire型都并無關(guān)系,在進行信號類型的判斷時不需要做任何的聯(lián)想,只要記住一個規(guī)則“用always實現(xiàn)的是reg型,其他都是wire型”就可以了。
cnt0是用always產(chǎn)生的信號,因此類型為reg。cnt0計數(shù)的最大值為1,需要用1根線表示,即位寬是1位。
add_cnt0和end_cnt0都是用assign方式設(shè)計的,因此類型為wire。其值是0或者1,用1根線表示即可,即位寬為1。
打開GVIM,在編輯模式下輸入“Reg1”“Wire1”可調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:

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

圖3.10-13通過計算器獲取信號位寬
因此可得cnt1定義代碼如下:

add_cnt1和end_cnt1都是用assign方式設(shè)計的,因此類型為wire,并且其值是0或者1,用1個線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:

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

add_cnt2和end_cnt2都是用assign方式設(shè)計的,因此類型為wire,并且其值是0或者1,用1根線表示即可。編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:

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

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

distance是用always方式設(shè)計的,因此類型為reg。其位寬為20位,需要20根線表示。其具體代碼如下:

valid_area和green_area是用always方式設(shè)計的,因此類型為reg,并且其值是0或1,用一根線表示即可。編輯模式下輸入“Reg1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼如下:

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3.10-14至簡設(shè)計法調(diào)用3個計數(shù)器模板
最終得到整個工程的代碼如下:

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

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

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

圖3.10-17QUARTUS新建工程設(shè)置名稱
新建工程類型設(shè)置如下圖所示,選擇“Empty project”,然后點擊“Next”。

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

圖3.10-19QUARTUS添加文件
圖3.10- 20為芯片選擇頁面,選擇“Cyclone ⅣE”,在芯片型號選擇處選擇“EP4CE15F23C8”,之后點擊“Next”。

圖3.10-20QUARTUS選擇芯片型號
圖3.10- 21為QUARTUS設(shè)置工具界面,不必做任何修改,直接點擊“Next”。

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

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

圖3.10-23QUARTUS新建工程后界面
點擊編譯按鈕,可以對整個工程進行編譯。編譯成功的界面,如下圖所示。

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

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


圖3.10-26 QUARTUS配置管腳
4.4?再次綜合
再次打開“QUARTUS”軟件,在菜單欄中,選中“Processing”,然后選擇“Start Compilation”,再次對整個工程進行編譯和綜合,如圖3.10-?27所示。

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

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

圖3.10-29開發(fā)板連接圖
4.6?上板
打開QUARTUS界面,單擊界面中的“file:///C:UsersxkdnAppDataLocalTempksohtml10836wps44.jpg”,則會彈出配置界面。在界面中點擊“add file”添加“.sof”文件后點擊“Start”,會在“Progress”出現(xiàn)顯示進度。

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

圖3.10-31QUARTUS下載程序界面
進度條提示成功后,如果操作無誤此時可以在顯示器上看到一個綠色的圓,顯示器的其余地方為白色。如果沒有顯示成功,就需要返回檢查一下連接是否到位,代碼是否編寫正確。如果無法自己完成錯誤排查的話,可以重新按照步驟操作一遍,相信一定會達到想要的效果。
第5節(jié)?簡化版步驟分享
這里依舊會分享簡化版的步驟,方便掌握基礎(chǔ)原理后進行反復(fù)操作復(fù)習(xí)。
5.1?設(shè)計實現(xiàn)5.1.1?頂層接口
新建目錄:D:mdy_bookga_exec1。在該目錄中新建一個名為vga_exec1.v的文件,用GVIM打開后開始編寫代碼。
確定頂層信號,信號和管腳的對應(yīng)關(guān)系見表3.10- 2。
表3.10 - 2信號和管腳關(guān)系

寫出頂層信號代碼:

聲明輸入輸出屬性:

信號設(shè)計
首先進行架構(gòu)設(shè)計。設(shè)計目標(biāo)中確定顯示器中需要顯示640*480分辨率的圖像,因此使用下表中的第一種分辨率。
表3.10-1 VGA常用分辨率

分析設(shè)計目標(biāo)可得VGA行同步信號,其時序圖如下所示。

圖3.10-7帶時間信息的VGA行同步時序
設(shè)計計數(shù)器架構(gòu),表示計數(shù)基準(zhǔn)時間的計數(shù)器cnt0代碼如下:

設(shè)計計數(shù)hys長度的計數(shù)器cnt1代碼如下:

設(shè)計行同步信號的代碼如下:

設(shè)計VGA場同步時序計數(shù)器cnt2代碼如下:

設(shè)計場同步信號的代碼如下:

設(shè)計lcd_rgb信號的代碼如下:

至此,主體程序已經(jīng)完成。接下來將module補充完整。
5.1.3?信號定義
首先定義信號類型,cnt0、add_cnt0 和 end_cnt0的信號定義如下:

cnt1的信號定義如下:

add_cnt1和end_cnt1的信號定義如下:

cnt2的信號定義如下:

add_cnt2和end_cnt2的信號定義如下:

lcd_rgb的信號定義如下:

hys和vys的信號定義如下:

distance的信號定義如下:

valid_area和green_area的信號定義如下:

至此,整個代碼的設(shè)計工作已經(jīng)完成。最終得到完整的設(shè)計代碼如下:

下一步是新建工程和上板查看現(xiàn)象。
5.2?綜合與上板5.2.1?新建工程
打開軟件Quartus Ⅱ,點擊“File”下拉列表中的New Project Wzard...新建工程選項。

圖3.10-15Quartus新建工程
直接點擊“Next”。

圖3.10-16 Quartus新建工程介紹
此時會出現(xiàn)的是工程文件夾、工程名、頂層模塊名設(shè)置界面(目錄為:D:/mdy_book/vga_exec1,工程名和頂層名為vga_exec1),完成設(shè)置后點擊“Next”。

圖3.10-17 QUARTUS新建工程設(shè)置名稱
選擇“Empty project”后點擊“Next”。

圖3.10-18 QUARTUS新建工程類型
點擊右側(cè)的“Add”按鈕,選擇“vga_exec1.v”文件后點擊“Next”,完成文件添加。

圖3.10-19 QUARTUS添加文件
對芯片型號進行選擇,在“Device family”選項中選擇“Cyclone ⅣE”,“Available devices”選項中選擇“EP4CE15F23C8”,隨后點擊“Next”。

圖3.10-20 QUARTUS選擇芯片型號
直接點擊“Next”。

圖3.10-21 QUARTUS設(shè)置工具界面
點擊“Finish”,完成新建工程。

圖3.10-22 QUARTUS新建工程匯總界面
5.2.2?綜合
新建工程后界面如下圖所示,點擊“編譯”。

圖3.10-23 QUARTUS新建工程后界面
編譯成功如下圖所示。

圖3.10-24 QUARTUS編譯后界面
5.2.3?配置管腳
進行管腳配置,在菜單欄中點擊“Assignments”后點擊“Pin Planner”,此時會彈出配置管腳的窗口。

圖3.10-25 QUARTUS配置管腳選項
在配置窗口“l(fā)ocation”根據(jù)信號和管腳關(guān)系配置管腳,配置完成關(guān)閉“Pin Planner”即可自動保存配置信息。

圖3.10-26 QUARTUS配置管腳
再次“QUARTUS”軟件,在菜單欄中選擇“Processing”,隨后點擊“Start Compilation”再次進行綜合。

圖3.10-27QUARTUS編譯選項
出現(xiàn) QUARTUS 編譯成功標(biāo)志時表示此次編譯成功。

圖3.10-28 QUARTUS編譯成功標(biāo)志
5.2.5?連接開發(fā)板
下載器接入電腦 USB?接口,將開發(fā)板接上電源,開發(fā)板的VGA口連接到一臺顯示器上后按下藍色開關(guān)。

圖3.10-29開發(fā)板連接圖
5.2.6?上板
打開 QUARTUS?界面后單擊“?
?”圖標(biāo):

圖3.10-30 QUARTUS界面
點擊“add file”,添加.sof文件,完成添加后點擊“Start”,在“Progress”中顯示進度,當(dāng)進度條顯示“100%”為成功,可觀察顯示器現(xiàn)象。如果此時開發(fā)板連接的顯示器顯示出了設(shè)計目標(biāo)中需要的畫面則代表設(shè)計成功。

圖3.10-31 QUARTUS下載程序界面
第6節(jié)?擴展練習(xí)
至此,VGA顯示圓設(shè)計已經(jīng)完成,相信同學(xué)們已經(jīng)可以完全掌握這一設(shè)計。那么在掌握這項工程后可以多做一些思考,嘗試在工程原理不變的基礎(chǔ)上進行一定的數(shù)據(jù)調(diào)整,試著改變圓的大小和顯示區(qū)域或者改變顯示顏色等參數(shù),挑戰(zhàn)一下獨立完成多個設(shè)計。也歡迎有更多思路和想法的同學(xué)前往至簡設(shè)計法論壇上進行交流討論。