3.1至簡(jiǎn)設(shè)計(jì)項(xiàng)目實(shí)踐1位閃爍燈設(shè)計(jì)
本文的文檔編號(hào):000800000013
需要看對(duì)應(yīng)的視頻,請(qǐng)點(diǎn)擊視頻編號(hào):000800000162
1、講解了如何使用至簡(jiǎn)設(shè)計(jì)法來(lái)時(shí)序1位LED燈間隔1秒,亮N秒(其中N=1 .2. …. 9)的功能
第三篇?FPGA至簡(jiǎn)設(shè)計(jì)項(xiàng)目實(shí)踐
第一章??1位閃爍燈設(shè)計(jì)
第1節(jié)?項(xiàng)目背景
發(fā)光二極管(Light EmittingDiode,LED)是一種能夠?qū)㈦娔苻D(zhuǎn)化為可見光的固態(tài)半導(dǎo)體器件,其核心是一個(gè)整個(gè)被環(huán)氧樹脂封裝起來(lái)的半導(dǎo)體晶片。晶片的一端附在一個(gè)支架上為負(fù)極,另一端連接電源為正極。
半導(dǎo)體晶片由P型半導(dǎo)體和N型半導(dǎo)體兩部分組成,其中P型半導(dǎo)體中空穴占主導(dǎo)地位,而N型半導(dǎo)體的主要部分是電子。當(dāng)這兩種半導(dǎo)體連接起來(lái)時(shí),兩者之間形成了一個(gè)P-N結(jié)。當(dāng)電流經(jīng)由導(dǎo)線作用于該半導(dǎo)體晶片時(shí),自由電子從N型區(qū)擴(kuò)散到P型區(qū)跟空穴復(fù)合,其會(huì)以光子的形式發(fā)出能量,這就是LED燈產(chǎn)生光源的原因。光的波長(zhǎng)即為L(zhǎng)ED的燈光顏色,其由形成P-N結(jié)的材料決定,不同的材料可以使LED可以發(fā)出不同顏色的光。隨著研究的深入,如今LED已經(jīng)可以直接發(fā)出紅、黃、藍(lán)、綠、青、橙、紫、白色等多種顏色的光。
LED起初被用作儀器儀表的指示光源,后來(lái)各種光色的LED在交通信號(hào)燈和大面積顯示屏中得到了廣泛應(yīng)用并產(chǎn)生了很好的經(jīng)濟(jì)效益和社會(huì)效益。以12英寸的紅色交通信號(hào)燈為例,美國(guó)原本使用的光源是長(zhǎng)壽命、低光視效能的140瓦白熾燈,可產(chǎn)生2000流明的白光。但是經(jīng)紅色濾光片后,光損失率高達(dá)90%,只剩下200流明的紅光。而Lumileds公司采用18個(gè)紅色LED光源后發(fā)現(xiàn):在產(chǎn)生同樣光效的前提下,該類光源包括電路損失在內(nèi)共耗電14瓦,與傳統(tǒng)白熾光光源相比耗能減少了十倍,這一光源的使用為社會(huì)做出了巨大貢獻(xiàn)。除此之外汽車信號(hào)燈也是LED光源的重要應(yīng)用領(lǐng)域之一。
而在日常生活中人們往往更需要白色光源以滿足照明需求,1998年基于這一需求成功開發(fā)了發(fā)白光的LED,這種LED將GaN芯片和釔鋁石榴石(YAG)封裝在一起做成。其中GaN芯片發(fā)藍(lán)光(λp=465nm,Wd=30nm),高溫?zé)Y(jié)制成的含Ce3+的YAG熒光粉受此藍(lán)光激發(fā)后發(fā)出黃色光射,其峰值為550nm。藍(lán)光LED基片安裝在碗形反射腔中,覆蓋以混有約200-500nm的YAG樹脂薄層。?LED基片發(fā)出的一部分藍(lán)光被熒光粉吸收,另一部分藍(lán)光與熒光粉發(fā)出的黃光混合,從而可以得到白光。對(duì)于InGaN/YAG白色LED,通過改變YAG熒光粉的化學(xué)組成和調(diào)節(jié)熒光粉層的厚度,可以獲得色溫3500-10000K的各色白光。這種通過藍(lán)光LED得到白光的方法,構(gòu)造簡(jiǎn)單、成本低廉、技術(shù)成熟度高,因此運(yùn)用最為廣泛。
基于LED燈的原理,本書制作了1位閃爍燈工程,感興趣的話可以根據(jù)步驟自己進(jìn)行實(shí)操練習(xí)。
?從圖3.1-1可以看到,至簡(jiǎn)設(shè)計(jì)法的教學(xué)板一共有8個(gè)可以發(fā)出綠光的LED燈。圖中左邊的LED1~LED8是教學(xué)板上LED燈的絲印,右邊的LED1~LED8_NET為信號(hào)線名。此標(biāo)注是為了更好的理解設(shè)計(jì),而在實(shí)際的開發(fā)板中不顯示這些信號(hào)線。
? ? LED燈兩端分別連接了3.3V的高電平和LED1~LED8_NET信號(hào)線。當(dāng)LED1~LED8_NET為高電平時(shí),電流無(wú)法導(dǎo)通,LED燈不發(fā)光;反之,當(dāng)LED1~LED8_NET是低電平時(shí),電流流通,此時(shí)LED燈發(fā)光。因此只要控制了信號(hào)LED1~LED8_NET的電平情況,就相當(dāng)于控制了LED燈發(fā)光的情況。

圖3.1-1開發(fā)板LED原理圖
? ?
那么信號(hào)線LED1~LED8_NET又連到哪里呢?從下圖可以發(fā)現(xiàn)這些信號(hào)都連接到了FPGA的管腳上。

圖3.1-2開發(fā)板LED信號(hào)連接圖
表3.1-1為開發(fā)板上實(shí)際信號(hào)管腳的對(duì)應(yīng)關(guān)系,例如信號(hào)線LED1連接到了FPGA的AA4管腳上。從表中可以看到LED1~LED8_NET分別與FPGA的8個(gè)管腳相連,因而LED1~LED8_NET處于高低電平以及LED燈是否發(fā)光最終取決于FPGA管腳的輸出。舉例說(shuō)明,如果想要控制LED7號(hào)燈,只需調(diào)整LED7連接的FPGA管腳AB14的輸出就可以了。當(dāng)輸出為高電平時(shí)LED7燈滅,當(dāng)輸出為低電平,LED7燈亮。8個(gè)LED燈各自對(duì)應(yīng)一個(gè)管腳,因此這8個(gè)LED燈都是由FPGA獨(dú)立進(jìn)行控制。
表3.1-1LED和FPGA管腳關(guān)系

第2節(jié)?設(shè)計(jì)目標(biāo)
確定設(shè)計(jì)的功能目標(biāo)是至簡(jiǎn)設(shè)計(jì)法的一大特別之處,只有對(duì)設(shè)計(jì)的功能目標(biāo)有一定的理解和預(yù)期,才能進(jìn)一步地討論如何進(jìn)行代碼設(shè)計(jì)和實(shí)現(xiàn)。也就是說(shuō),后續(xù)設(shè)計(jì)中每一個(gè)步驟都是圍繞著設(shè)計(jì)目標(biāo)的實(shí)現(xiàn)來(lái)針對(duì)性的展開。如果對(duì)于設(shè)計(jì)目標(biāo)一知半解,連最終想要什么都無(wú)法確定,那么后續(xù)設(shè)計(jì)的思路就難以形成體系化的思考模式,只能一味接收碎片式的知識(shí)。設(shè)計(jì)目標(biāo)就像大樓的設(shè)計(jì)圖,如果想要掌握完整的案例設(shè)計(jì),需要靜下心來(lái)從明確設(shè)計(jì)目標(biāo)開始一步步細(xì)細(xì)咀嚼,逐步掌握,才可以真正做到事半功倍。因此,在每個(gè)設(shè)計(jì)前本書會(huì)確定設(shè)計(jì)的功能目標(biāo),從而更好的完成設(shè)計(jì)。
本工程使用1個(gè)LED燈(LED1)來(lái)實(shí)現(xiàn)閃爍燈功能。工程的工作時(shí)鐘為50MHz,即時(shí)鐘周期為20ns。當(dāng)LED1連接的管腳AA4輸出低電平時(shí),LED1燈亮,輸出高電平時(shí),LED1燈滅。具體功能要求為:隔1秒,亮N秒。N的變化為:1,2,3,……,9秒,之后再次進(jìn)入循環(huán),如圖3.1-3所示。上板后的效果展示可參見圖3.1-4??梢缘卿浿梁?jiǎn)設(shè)計(jì)法官方網(wǎng)站觀看上板后的演示視頻:www.mdy-edu.com/xxxx。

圖3.1-3 1位閃爍燈功能圖

圖3.1-4 1位閃爍燈的效果圖
第3節(jié)?設(shè)計(jì)實(shí)現(xiàn)
?下面會(huì)詳細(xì)地介紹本設(shè)計(jì)的實(shí)現(xiàn)方法并對(duì)一些基本的設(shè)計(jì)理念和思路進(jìn)行詳細(xì)地說(shuō)明。如果已經(jīng)基本掌握至簡(jiǎn)設(shè)計(jì)法理念,且有一定獨(dú)立實(shí)操基礎(chǔ),可以選擇直接跳至第五節(jié)“簡(jiǎn)化版步驟分享”按照步驟進(jìn)行設(shè)計(jì)實(shí)操。當(dāng)然,還是建議初學(xué)者打好基礎(chǔ),按照分析一步步掌握思想原理后再按照操作步驟反復(fù)實(shí)踐練習(xí)。
3.1?頂層信號(hào)
新建目錄:D:mdy_bookmy_led,并在此目錄中新建一個(gè)名為my_led.v的文件。用GVIM打開該文件后開始編寫代碼。在這里建議初學(xué)者按照本書提供的路徑名和文件名使用,不要進(jìn)行其它更改。因?yàn)樵诟倪^程中可能會(huì)出現(xiàn)中文路徑、空格路徑等非法路徑的問題,或者有些文件名更改后會(huì)出現(xiàn)報(bào)錯(cuò)等現(xiàn)象,而初學(xué)者并不能很好地發(fā)現(xiàn)并解決這些問題。因此建議先按照要求更名保存,在多次進(jìn)行工程練習(xí),熟悉了各個(gè)步驟后,再進(jìn)行更名的操作。這個(gè)地方不要想當(dāng)然,按部就班地細(xì)心操作就會(huì)可以避免后續(xù)問題的出現(xiàn)。
下面來(lái)確定頂層信號(hào)。由設(shè)計(jì)目標(biāo)可知,想要控制1個(gè)LED燈亮或滅需要FPGA產(chǎn)生一個(gè)信號(hào)。假定這一信號(hào)為led,將其連接到LED燈上。如果要控制LED燈滅,F(xiàn)PGA將信號(hào)led輸出為1,控制LED燈亮,F(xiàn)PGA將信號(hào)led輸出為0。硬件電路圖的連接關(guān)系如表3.1- 2所示,可以看到本工程中LED1燈連接的FPGA管腳為AA4,對(duì)應(yīng)的FPGA工程信號(hào)為led。工程的時(shí)鐘管腳為G1,對(duì)應(yīng)FPGA工程信號(hào)為clk。工程的復(fù)位管腳為G1,對(duì)應(yīng)FPGA工程信號(hào)為rst_n。由此可見,工程中一共需要三個(gè)信號(hào):時(shí)鐘clk,復(fù)位rst_n以及輸出信號(hào)led。
表3.1-2信號(hào)和管腳關(guān)系

將module的名稱定義為my_led,在頂層信號(hào)代碼中需要將與外部相連接的輸入/輸出信號(hào)列出,從而實(shí)現(xiàn)信號(hào)與管腳的連接,具體頂層信號(hào)代碼如下:

? ?隨后對(duì)信號(hào)的輸入輸出屬性進(jìn)行聲明,指出對(duì)于FPGA來(lái)說(shuō)這一信號(hào)屬于輸入還是輸出,若為輸入,聲明則為input,若為輸出,聲明則為output。在本設(shè)計(jì)中,由于clk是外部晶振輸送給FPGA的,因此在FPGA中clk為輸入信號(hào)input。同樣地,rst_n是外部按鍵給FPGA的信號(hào),因此在FPGA中rst_n也為輸入信號(hào)input。同時(shí)可知led是FPGA輸出控制LED1顯示的,因此led為輸出信號(hào)output。其具體聲明代碼如下:

3.2?信號(hào)設(shè)計(jì)
隨后需要對(duì)架構(gòu)進(jìn)行設(shè)計(jì)。首先將項(xiàng)目實(shí)現(xiàn)功能用波形圖表示出來(lái),詳細(xì)的分析一下設(shè)計(jì)需求。LED燈的變化規(guī)律是暗1秒,亮N秒,其中N的變化為:1、2、3、……、9秒,然后再次從1秒開始循環(huán)。將此現(xiàn)象轉(zhuǎn)換為信號(hào),即為信號(hào)led=1持續(xù)1秒后信號(hào)led=0持續(xù)N秒,其中N的變化是:1、2、3、……、9秒,如圖3.1-5所示。可以看出在第一次亮暗過程中,led=1持續(xù)暗了1秒后led=0持續(xù)亮了1秒,共計(jì)2秒時(shí)間。在第二次亮暗過程中,led=1持續(xù)暗了1秒后led=0持續(xù)亮2秒,共計(jì)3秒時(shí)間。以此類推,到第9次時(shí),led=1持續(xù)1秒后led=0持續(xù)了9秒,共計(jì)10秒時(shí)間。隨后以此為規(guī)律進(jìn)行循環(huán)往復(fù)。

圖3.1-51位閃爍燈的波形圖
根據(jù)波形圖可以完成本項(xiàng)目計(jì)數(shù)器的架構(gòu)設(shè)計(jì)。本項(xiàng)目一共需要兩個(gè)計(jì)數(shù)器,其中一個(gè)計(jì)數(shù)器用來(lái)計(jì)算時(shí)間,另一個(gè)用來(lái)計(jì)算次數(shù)。本書使用計(jì)數(shù)器cnt1來(lái)記錄次數(shù)變化,另一個(gè)計(jì)數(shù)器cnt0來(lái)記錄每一次的工作時(shí)間,這樣做會(huì)方便后續(xù)的代碼設(shè)計(jì)。在這里來(lái)思考一下,為什么不能只用一個(gè)時(shí)間計(jì)數(shù)器,按照2秒、5秒、9秒、14秒……這樣增加秒數(shù)的方法來(lái)進(jìn)行設(shè)計(jì)呢?在實(shí)際的代碼操作中,這樣設(shè)計(jì)雖然只使用了一個(gè)計(jì)數(shù)器,但其計(jì)算方法卻是非常麻煩的。舉個(gè)生活中常見的例子,如下圖所示,把每一次的循環(huán)看做樓層,把每一秒的計(jì)數(shù)看做門牌號(hào)。按照一種計(jì)數(shù)模式來(lái)計(jì)數(shù)的話,若一樓的門牌號(hào)為1、2、3、4、5、6、7、8,二樓的門牌號(hào)則為9、10、11、12、13、14、15、16、17、18,后續(xù)樓層以此類推。按照這種方式進(jìn)行計(jì)數(shù),如果需要尋找到47號(hào)房間,可能需要?jiǎng)幽X筋計(jì)算很久才可以定位到。反之,使用兩種計(jì)數(shù)模式:一個(gè)計(jì)數(shù)器對(duì)應(yīng)樓層,另一個(gè)對(duì)應(yīng)門牌號(hào)。那么一樓的門牌號(hào)則為一樓的1、2、3、4、5、6、7、8,二樓的門牌號(hào)為二樓的1、2、3、4、5、6、7、8、9、10,以此類推。一共有多少層,每一層都有對(duì)應(yīng)的房間號(hào)就會(huì)一目了然。假如想要尋找六層7號(hào)房間就會(huì)輕而易舉。同樣的道理,在本工程設(shè)計(jì)中使用一個(gè)計(jì)數(shù)器表示次數(shù),另一個(gè)計(jì)數(shù)器? ? ?
表示時(shí)間,這樣在后續(xù)遇到問題時(shí)就可以快速的找到問題代碼,而無(wú)需逐個(gè)推算。

圖3.1-6門牌號(hào)計(jì)數(shù)示例
同樣是上面的案例,如果想要尋找每一層的固定位置房間,同樣可以利用兩種計(jì)數(shù)模式:用cnt0來(lái)表示房間號(hào),其范圍是0-9,用cnt1來(lái)表示樓層號(hào),其范圍是0-1。利用這一方法可以通過cnt0和cnt1兩個(gè)計(jì)數(shù)器來(lái)找到任何一個(gè)房間。這樣做的另一好處是:如果想找到同一個(gè)位置的房間,就可以直接用cnt0來(lái)統(tǒng)一進(jìn)行表示。例如cnt0==4可以統(tǒng)一表示每層樓的四號(hào)房間。而在只有房間號(hào)這一單一計(jì)數(shù)模式而沒有樓層計(jì)數(shù)的情況下,如果想表示每層樓的四號(hào)房間則需要表示方式為“cnt0==4”、“cnt0=12”,更高樓層以此類推。兩種表現(xiàn)形式的難易程度顯而易見。
借鑒同樣的思想用于LED燈的設(shè)計(jì)工程中,根據(jù)目標(biāo)可知需要LED燈第1秒不亮,而后面N秒亮,循環(huán)往復(fù)。從波形圖中也可以看出任何一次亮暗都是在第一秒結(jié)束的節(jié)點(diǎn)拉低,依據(jù)使用兩個(gè)計(jì)數(shù)單位的方法,統(tǒng)一將每次循環(huán)的第一秒表示為“add_cnt0 && cnt0==50_000_000-1”。
在這種無(wú)限循環(huán)的工程中,數(shù)據(jù)會(huì)像滾雪球一樣越滾越大,此時(shí)只要一個(gè)節(jié)點(diǎn)出現(xiàn)了問題,就需要花費(fèi)大量的時(shí)間去查找修復(fù)。通過增加一個(gè)次數(shù)計(jì)數(shù)器的方法將此項(xiàng)目閉合在一個(gè)固定的循環(huán)中就可以巧妙的避開了這一問題,大大減輕了排查錯(cuò)誤的難度。學(xué)會(huì)這種思考方式后在對(duì)項(xiàng)目進(jìn)行頂層設(shè)計(jì)時(shí)可以更加全面的考慮問題,從而為項(xiàng)目選擇最合適的展現(xiàn)形式。
回到本項(xiàng)目中,本項(xiàng)目采用計(jì)數(shù)器cnt0來(lái)計(jì)算時(shí)間,如計(jì)2秒、3秒等。工作時(shí)鐘為50MHz,即周期為1s/50MHz=20ns,通過時(shí)間換算關(guān)系可知2s=2_000_000_000ns,因此當(dāng)計(jì)數(shù)器計(jì)數(shù)到2_000_000_000/20=100_000_000個(gè)時(shí)就代表著2秒時(shí)間到了。按照此方法依次類推,在第2次亮暗控制時(shí)計(jì)數(shù)器數(shù)到150_000_000個(gè)時(shí)代表計(jì)時(shí)3秒。第4次亮暗控制時(shí)數(shù)到200_000_000個(gè)時(shí)代表計(jì)時(shí)4秒……,第9次時(shí),數(shù)到500_000_000個(gè)時(shí)就表示10秒時(shí)間計(jì)時(shí)結(jié)束。
前文討論中說(shuō)明了本設(shè)計(jì)需要2個(gè)計(jì)數(shù)器,現(xiàn)在就來(lái)討論一下每個(gè)計(jì)數(shù)器的實(shí)現(xiàn)方法。至簡(jiǎn)設(shè)計(jì)法的設(shè)計(jì)規(guī)則中有講過,計(jì)數(shù)器的設(shè)計(jì)只考慮兩個(gè)因素:加1條件和計(jì)數(shù)數(shù)量。只要確定好相應(yīng)邏輯,就能完成計(jì)數(shù)器代碼設(shè)計(jì)。
首先來(lái)討論時(shí)間計(jì)數(shù)器cnt0的加1條件:該計(jì)數(shù)器始終不停地進(jìn)行計(jì)數(shù),因此可以認(rèn)為其加1條件是一直有效的,可寫成:assign add_cnt0==1。
可能會(huì)有同學(xué)提出疑問:加1條件的概念是什么?這里以停車位來(lái)進(jìn)行比喻,一般情況下對(duì)每個(gè)停車位置會(huì)進(jìn)行對(duì)應(yīng)編號(hào),但是如果某個(gè)位置上放置了一塊石頭無(wú)法作為停車位時(shí),該位置就不能獲得對(duì)應(yīng)的編號(hào)。反之則可以認(rèn)為停車位編號(hào)的加1條件就是:對(duì)應(yīng)位置上沒有石頭,其可以繼續(xù)進(jìn)行編號(hào),即assignadd_cnt0 = “沒有石頭”。因此如果在設(shè)計(jì)中計(jì)數(shù)器一直沒有阻礙地進(jìn)行計(jì)數(shù)工作,就可以認(rèn)為加1條件是一直有效的。
下面討論一下時(shí)間計(jì)數(shù)器cnt0的計(jì)數(shù)數(shù)量:由于第1次到第9次的亮暗控制中每次計(jì)數(shù)的時(shí)間都各不相同,因此可以考慮使用變量法。在設(shè)計(jì)中變量法的選用邏輯非常簡(jiǎn)單:當(dāng)循環(huán)周期的個(gè)數(shù)不同時(shí)就可以選擇變量法來(lái)進(jìn)行設(shè)計(jì)。本設(shè)計(jì)中使用x表示計(jì)數(shù)器cnt0的計(jì)數(shù)數(shù)量,后續(xù)會(huì)對(duì)x的值進(jìn)行詳細(xì)展開。
進(jìn)行代碼編寫這一步驟時(shí),以往都是一行行的輸入相應(yīng)代碼。至簡(jiǎn)設(shè)計(jì)法在這里提供一個(gè)小技巧,在節(jié)省編寫代碼的時(shí)間的同時(shí)在一定程度上降低了代碼的出錯(cuò)率。至簡(jiǎn)設(shè)計(jì)法將日常代碼中常用到的固定部分制作成模板,進(jìn)行代碼編程時(shí)可以調(diào)用相應(yīng)模板后根據(jù)邏輯輸入對(duì)應(yīng)設(shè)計(jì)的變量將代碼補(bǔ)充完整。這里就使用模板編寫計(jì)數(shù)器代碼,學(xué)習(xí)一下這個(gè)炫酷的功能。
打開GVIM工具,在命令模式下輸入“:Mdyjsq”后點(diǎn)擊回車就調(diào)出了對(duì)應(yīng)模板,如下圖所示。之后再將本案例中的變量填到模板里面,就可以得到完整正確的計(jì)數(shù)器代碼。

圖3.1-7至簡(jiǎn)設(shè)計(jì)法調(diào)用計(jì)數(shù)器代碼模板
按照上文方法,可以得到該時(shí)間計(jì)數(shù)器的代碼如下:

同樣的,需要確定次數(shù)計(jì)數(shù)器cnt1的加1條件和計(jì)數(shù)數(shù)量:可以看到每當(dāng)cnt0完成一個(gè)周期后計(jì)數(shù)器cnt1就會(huì)加1,因此cnt1的加1條件即為cnt0的結(jié)束計(jì)數(shù),其代碼表示為end_cnt0。此外,從設(shè)計(jì)目標(biāo)中可以得知每一周期內(nèi)次數(shù)計(jì)數(shù)器cnt1的計(jì)數(shù)數(shù)量為9。
在這里可以繼續(xù)調(diào)用模板,在GVIM的命令模式下輸入“:Mdyjsq”后點(diǎn)擊回車調(diào)用對(duì)應(yīng)模板后將“add_cnt1”和“end_cnt1”補(bǔ)充完整,得到代碼為:

確定好兩個(gè)計(jì)數(shù)器后來(lái)思考一下輸出信號(hào)led的變化。從設(shè)計(jì)目標(biāo)可以得知led有兩個(gè)變化點(diǎn):變0和變1。變0的原因均為時(shí)間計(jì)數(shù)器完成到1秒計(jì)數(shù),也就是當(dāng)cnt0數(shù)到1_000_000_000/20=50_000_000個(gè)時(shí),計(jì)時(shí)1秒結(jié)束,此時(shí)LED1燈為燈滅狀態(tài)。設(shè)計(jì)目標(biāo)規(guī)定燈暗一秒后亮燈,即此時(shí)led信號(hào)變?yōu)?。同理,變1是因?yàn)橥瓿闪肆翢舻腘秒時(shí)間,相應(yīng)計(jì)數(shù)器完成了計(jì)數(shù),即end_cnt0。
依舊使用至簡(jiǎn)設(shè)計(jì)法模板,在GVIM編輯模式下輸入“Shixu2”回車,調(diào)出模板,得到led信號(hào)的代碼如下:

最后來(lái)思考一下計(jì)數(shù)器cnt0的計(jì)數(shù)數(shù)量x。前文中提到這種循環(huán)周期變化的情況要采用變量法來(lái)完成設(shè)計(jì),下面先同樣以樓房門牌號(hào)為例來(lái)輔助思考。假設(shè)樓房的第一層為八個(gè)房間,第二層為十個(gè)房間,第三層為十五個(gè)房間,第四層為二十個(gè)房間。如果想要用代碼將這種實(shí)際情況表示出來(lái),需要使用至簡(jiǎn)設(shè)計(jì)法中的組合邏輯模板,在編輯模式下輸入“Zuhe”后回車,填寫對(duì)應(yīng)條件后得到最終代碼如下:

這里的代碼設(shè)計(jì)需要著重學(xué)習(xí)一下,可以看到至簡(jiǎn)設(shè)計(jì)法寫出的代碼非常的整潔,邏輯思維一目了然,這種寫法可以做到資源最優(yōu),并且不會(huì)出現(xiàn)BUG,自己實(shí)操的時(shí)候可以使用這種寫法。
同樣的道理,在討論時(shí)間計(jì)數(shù)器cnt0的時(shí)候曾經(jīng)得出結(jié)論:“計(jì)數(shù)器計(jì)數(shù)到2_000_000_000/20=100_000_000個(gè)時(shí)就代表著2秒計(jì)時(shí)結(jié)束。按照此方法依次類推,在第2次亮暗控制時(shí)計(jì)數(shù)器數(shù)到150_000_000個(gè)時(shí)代表3秒計(jì)時(shí)結(jié)束。第4次亮暗控制時(shí)數(shù)到200_000_000個(gè)時(shí)代表4秒計(jì)時(shí)結(jié)束……,至第9次時(shí),數(shù)到500_000_000個(gè)時(shí)代表10秒計(jì)時(shí)結(jié)束。”,從中可以看出cnt0的計(jì)數(shù)數(shù)量與cnt1有關(guān)。第1次計(jì)數(shù)數(shù)量為100_000_000,第2次計(jì)數(shù)數(shù)量為150_000_000……,按照這樣的規(guī)律可以將9次亮暗對(duì)應(yīng)的x都表示出來(lái)。在GVIM的編輯模式下輸入“Zuhe”后回車,將對(duì)應(yīng)條件補(bǔ)充完整后得到x的賦值代碼如下:

至此,本設(shè)計(jì)的主體程序已經(jīng)完成。回顧一下思考過程可以發(fā)現(xiàn):設(shè)計(jì)的每一步都是按照設(shè)計(jì)目標(biāo)逐步展開,看似是在討論每個(gè)小問題,但其實(shí)都是圍繞設(shè)計(jì)目標(biāo)進(jìn)行討論,這也是本書最開始強(qiáng)調(diào)制定和理解設(shè)計(jì)目標(biāo)的重要性的原因。
3.3?信號(hào)定義
下面需要將module補(bǔ)充完整,首先要做的是定義信號(hào)的類型。在判斷信號(hào)類型時(shí)會(huì)感到很困惑,搞不清楚如何確定reg和wire。其實(shí)大多數(shù)的困惑是因?yàn)槁?lián)想的太多,例如認(rèn)為reg就是寄存器,wire是線,或者認(rèn)為reg類型會(huì)綜合成寄存器,wire類型不會(huì)綜合成寄存器,然而實(shí)際上這些與信號(hào)是reg型還是wire型都并無(wú)關(guān)系。至簡(jiǎn)設(shè)計(jì)法建議不要進(jìn)行任何聯(lián)想,只遵從一個(gè)規(guī)則“用always實(shí)現(xiàn)的是reg型,其他都是wire型”。
進(jìn)行信號(hào)定義時(shí),除了信號(hào)的類型,還需要確定信號(hào)的位寬。至簡(jiǎn)設(shè)計(jì)法在這里分享一個(gè)非常實(shí)用的獲取信號(hào)位寬的技巧:打開計(jì)算器,點(diǎn)擊“查看”,選擇“程序員”模式,在“十進(jìn)制”下輸入數(shù)字后就會(huì)獲得對(duì)應(yīng)的信號(hào)位寬。
cnt0是用always產(chǎn)生的信號(hào),因此類型為reg。根據(jù)前文計(jì)算可知cnt0計(jì)數(shù)的最大值為500_000_000,根據(jù)至簡(jiǎn)設(shè)計(jì)法的實(shí)用技巧,打開計(jì)算器后在程序員模式十進(jìn)制下輸入500_000_000,如下圖所示??梢钥闯?,信號(hào)的位寬為29。

圖3.1-8通過計(jì)算器獲取信號(hào)位寬
綜上所述cnt0的定義代碼如下:

同樣的,cnt1也是用always產(chǎn)生的信號(hào),因此類型為reg。cnt1計(jì)數(shù)的最大值為8,需要用4根線表示,即位寬是4位。編輯模式下輸入“Reg4”調(diào)用至簡(jiǎn)設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼表示如下:

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

同樣的,add_cnt1和end_cnt1也是用assign方式設(shè)計(jì)的,類型為wire。其值是0或者1,位寬為1。編輯模式下輸入“Wire1”調(diào)用至簡(jiǎn)設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼表示如下:

led是用always方式設(shè)計(jì)的,因此類型為reg。led信號(hào)值是0或者1,1根線表示即可。編輯模式下輸入“Reg1”調(diào)用至簡(jiǎn)設(shè)計(jì)法模板,補(bǔ)充完整后得到代碼表示如下:

x是用always方式設(shè)計(jì)的,因此類型為reg。其最大值為500_000_000,需要用29根線表示,即位寬為29。需要注意的是:這里的x是使用組合邏輯設(shè)計(jì)的,綜合結(jié)果也不會(huì)有寄存器,但是遵循剛剛提到的信號(hào)判斷原則,x是用always設(shè)計(jì)出來(lái)的,所以依舊使用reg型來(lái)進(jìn)行定義。代碼表示如下:

至此,整個(gè)代碼的設(shè)計(jì)工作已經(jīng)完成。完整版的工程代碼如下:

第4節(jié)?綜合與上板
上一節(jié)完成了代碼的設(shè)計(jì),接下來(lái)需要對(duì)其進(jìn)行綜合以及上板調(diào)試。
4.1?新建工程
? ? 打開軟件Quartus?Ⅱ,點(diǎn)擊File下拉列表中的New Project Wzard...新建工程選項(xiàng),如圖3.1-9所示。

圖3.1-9Quartus新建工程界面
? ? 隨后會(huì)出現(xiàn)圖3.1-10所示的Quartus新建工程介紹,直接點(diǎn)擊“Next”。

圖3.1-10Quartus新建工程介紹
?此時(shí)會(huì)出現(xiàn)工程文件夾、工程名、頂層模塊名設(shè)置界面,如圖3.1-11所示。注意目錄為:D:/mdy_book/my_led,工程名和頂層名為my_led。這里再次進(jìn)行強(qiáng)調(diào),為了避免初學(xué)者使用過程中出現(xiàn)報(bào)錯(cuò)情況,強(qiáng)烈建議按照本書的工程名和文件名進(jìn)行設(shè)置,設(shè)置完成后點(diǎn)擊Next。

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

圖3.1-12 QUARTUS新建工程類型

圖3.1-13QUARTUS添加文件
文件添加界面如圖3.1-13所示,此時(shí)添加之前寫的“my_led.v”文件,點(diǎn)擊右側(cè)的“Add”按鈕后文件會(huì)在下方顯示出來(lái),隨后點(diǎn)擊“Next”。

圖3.1-14QUARTUS選擇芯片型號(hào)
? 芯片型號(hào)選擇界面如圖3.1-14所示,選擇“Cyclone?ⅣE”,在芯片型號(hào)選擇處選擇“EP4CE15F23C8”,然后點(diǎn)擊“Next”。

圖3.1-15QUARTUS設(shè)置工具界面
? ? QUARTUS設(shè)置工具界面如圖3.1-15所示,不必要修改,直接點(diǎn)擊“Next”

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3.1-16QUARTUS新建工程匯總界面
圖3.1-16中可以看到新建工程的匯總情況,點(diǎn)擊“Finish”,完成新建工程。
4.2?綜合
? ? 新建工程步驟完成后,QUARTUS界面如下圖所示。

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

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

圖3.1-19QUARTUS配置管腳選項(xiàng)
?在配置窗口最下方中的location一列,按照表3.1-2中最右兩列進(jìn)行FPGA管腳的配置。此處配置管理來(lái)源的選擇在最開始的管腳配置設(shè)計(jì)環(huán)節(jié)中有進(jìn)行講解,最終配置的結(jié)果見圖3.1-20。
表3.1-2信號(hào)和管腳關(guān)系


圖3.1-20QUARTUS配置管腳
? ? 配置完成后關(guān)閉“Pin Planner”,軟件自動(dòng)會(huì)保存管腳配置信息。
4.4?再次綜合
?再次打開“QUARTUS”軟件,在菜單欄中選中“Processing”,然后選擇“StartCompilation”,再次對(duì)整個(gè)工程進(jìn)行編譯和綜合,如圖3.1-21所示。

圖3.1-21QUARTUS編譯選項(xiàng)

圖3.1-22QUARTUS編譯成功標(biāo)志
當(dāng)出現(xiàn)圖3.1-22時(shí)說(shuō)明編譯綜合成功。
4.5?連接開發(fā)板
?完成編譯后開始進(jìn)行上板調(diào)試操作,首先進(jìn)行開發(fā)板的連接。按照?qǐng)D3.1-23中的方式將下載器接入電腦USB接口,接上開發(fā)板電源后按下開發(fā)板下方藍(lán)色開關(guān)。

圖3.1-231位閃爍燈開發(fā)板連接圖
4.6?上板
?單擊下圖所示的QUARTUS界面中的?按鈕,彈出配置界面。

圖3.1-24QUARTUS界面
?隨后點(diǎn)擊add file后添加.sof文件,之后點(diǎn)擊“Start”,在“Progress”會(huì)顯示出進(jìn)度。

圖3.1-25QUARTUS下載程序界面
如圖3.1-25所示,“Progress”進(jìn)度條中提示成功后即可在開發(fā)板上觀察到相應(yīng)的現(xiàn)象??梢钥吹介_發(fā)板上的LED燈開始閃爍,并且按照亮一秒滅一秒,亮兩秒滅一秒的規(guī)律進(jìn)行循環(huán)閃爍。當(dāng)觀察到開發(fā)板上的LED燈可以照常閃爍,并且在亮九秒滅一秒后又回到亮一秒滅一秒的循環(huán)時(shí)就可以判斷此次實(shí)驗(yàn)成功。如果出現(xiàn)LED燈不亮或者不能按照規(guī)律進(jìn)行閃爍等情況時(shí),需要回頭思考檢查問題的出現(xiàn)點(diǎn),建議可以多進(jìn)行幾遍操作,不要粗心,找到錯(cuò)誤點(diǎn)后進(jìn)行改正。
第5節(jié)?簡(jiǎn)化版步驟分享
為了便于有基礎(chǔ)的同學(xué)操作學(xué)習(xí),本書也準(zhǔn)備了簡(jiǎn)化版的操作步驟。當(dāng)然對(duì)于初學(xué)者來(lái)說(shuō),掌握了各個(gè)部分原理后也可以按照下列方法進(jìn)行重復(fù)性的實(shí)驗(yàn)操作練習(xí),加強(qiáng)實(shí)操能力。
5.1?設(shè)計(jì)實(shí)現(xiàn)
5.1.1頂層信號(hào)
新建目錄:D:mdy_bookmy_led。在該目錄中新建一個(gè)名為my_led.v的文件,用GVIM打開后開始編寫代碼。
?確定頂層信號(hào)。此工程信號(hào)和管腳關(guān)系如下表所示。
表3.1-2 信號(hào)和管腳關(guān)系

? ? 寫出頂層信號(hào)代碼:

聲明輸入輸出屬性:

5.1.2信號(hào)設(shè)計(jì)
進(jìn)行架構(gòu)設(shè)計(jì)。根據(jù)設(shè)計(jì)需求畫出設(shè)計(jì)的波形圖:

圖3.1- 41位閃爍燈的波形圖
設(shè)計(jì)計(jì)數(shù)器架構(gòu),對(duì)表示計(jì)算時(shí)間的計(jì)數(shù)器cnt0進(jìn)行代碼設(shè)計(jì):

對(duì)表示計(jì)算次數(shù)的計(jì)數(shù)器cnt1進(jìn)行代碼設(shè)計(jì):

? ? 設(shè)計(jì)led信號(hào)代碼:

? ? 設(shè)計(jì)表示計(jì)數(shù)器cnt0的循環(huán)次x的代碼:

主體程序完成后將module補(bǔ)充完整。
5.1.3信號(hào)定義
首先,對(duì)信號(hào)進(jìn)行類型定義,其中cnt0信號(hào)定義如下:

add_cnt0和end_cnt0信號(hào)定義如下:

? ? cnt1信號(hào)定義如下:

add_cnt1和end_cnt1信號(hào)定義如下:

? ? led信號(hào)定義如下:

? ? x信號(hào)定義如下:

? ?至此,整個(gè)代碼的設(shè)計(jì)工作完成,后續(xù)應(yīng)對(duì)代碼進(jìn)行編譯綜合以及上板查看現(xiàn)象。
5.2?綜合與上板
5.2.1新建工程
? 打開Quartus?Ⅱ,點(diǎn)擊File下拉列表中的New Project Wzard...新建工程選項(xiàng)。

圖3.1-9Quartus新建工程界面
點(diǎn)擊“Next”:

圖3.1-10Quartus新建工程介紹
如下圖所示設(shè)置工程文件夾、工程名、頂層模塊名后點(diǎn)擊“Next”。

圖3.1-11QUARTUS新建工程設(shè)置名稱
選擇“Empty project”后點(diǎn)擊“Next”。

圖3.1-12QUARTUS新建工程類型
點(diǎn)擊“Add”選項(xiàng)-后添加“my_led.v”文件后點(diǎn)擊“Next”。

圖3.1-13QUARTUS添加文件
在“Device family”選項(xiàng)中選擇“Cyclone?ⅣE”,“Available devices”選項(xiàng)中選擇“EP4CE15F23C8”,隨后點(diǎn)擊“Next”。

圖3.1-14QUARTUS選擇芯片型號(hào)
直接點(diǎn)擊“Next”。

圖3.1-15QUARTUS設(shè)置工具界面
點(diǎn)擊“Finish”后完成新建工程。

圖3.1-16QUARTUS新建工程匯總界面
5.2.2綜合
新建工程后界面如圖3.1-17所示,點(diǎn)擊“編譯”按鈕,編譯成功后界面如圖3.1-18所示。

圖3.1-17QUARTUS新建工程后界面

圖3.1-18QUARTUS編譯后界面
5.2.3配置管腳
在菜單欄點(diǎn)擊“Assignments”后點(diǎn)擊“Pin Planner”,隨后會(huì)彈出配置管腳的窗口。

圖3.1-19QUARTUS配置管腳選項(xiàng)
在配置窗口“l(fā)ocation”配置管腳,配置完成關(guān)閉“Pin Planner”即可自動(dòng)保存配置信息。

圖3.1-20QUARTUS配置管腳
5.2.4再次綜合
菜單欄中選擇“Processing”后點(diǎn)擊“Start Compilation”再次進(jìn)行綜合。

圖3.1-21QUARTUS編譯選項(xiàng)
出現(xiàn)QUARTUS編譯成功標(biāo)志即表示此次編譯成功。

圖3.1-22QUARTUS編譯成功標(biāo)志
5.2.5連接開發(fā)板
將下載器接入電腦USB接口,開發(fā)板接上電源后按下藍(lán)色開關(guān)。

圖3.1-23 1位閃爍燈開發(fā)板連接圖
5.2.6上板
打開QUARTUS界面后單擊“?

?”圖標(biāo)。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??圖3.1-24QUARTUS界面
點(diǎn)擊“add file”添加“.sof”文件,隨后點(diǎn)擊“Start”?!癙rogress”會(huì)顯示進(jìn)度,進(jìn)度條顯示“100%”為成功,可在開發(fā)板觀察此時(shí)現(xiàn)象。

圖3.1-25QUARTUS下載程序界面
第6節(jié)?擴(kuò)展練習(xí)
?至此整個(gè)1位閃爍燈設(shè)計(jì)已經(jīng)分享完畢,這里只是展示了一個(gè)案例,已經(jīng)掌握原理后可以試著進(jìn)行設(shè)計(jì)的擴(kuò)展延伸。比如在同樣的閃爍燈設(shè)計(jì)中更改閃爍時(shí)間再進(jìn)行上板嘗試,舉一反三,既考察了自己的知識(shí)掌握程度,又強(qiáng)化了自己的設(shè)計(jì)能力。鼓勵(lì)同學(xué)們對(duì)此設(shè)計(jì)進(jìn)行擴(kuò)展性的思考和討論,有更好的思路可以前往至簡(jiǎn)設(shè)計(jì)法論壇進(jìn)行交流。