胡 青,黃 勤,唐 丹,王延川
(重慶大學 自動化學院信息工程與自動化系,重慶 400030)
隨著電子技術(shù)的飛速發(fā)展,EDA技術(shù)借助硬件描述語言對FPGA和CPLD芯片進行了編程,徹底改變了數(shù)字系統(tǒng)的設(shè)計實現(xiàn)方法[1-3]。國內(nèi)多所高校開設(shè)了EDA設(shè)計的相關(guān)課程,在教學實踐過程中發(fā)現(xiàn)了一些問題,見參考文獻[4-7]。EDA技術(shù)以FPGA或CPLD芯片為編程對象,應(yīng)用Quartus等開發(fā)軟件,采用層次化設(shè)計方法完成數(shù)字系統(tǒng)設(shè)計[8-10]。本文以Quartus II為開發(fā)軟件,詳細說明層次化設(shè)計步驟和實現(xiàn)方法,并以秒表設(shè)計為例,演示了層次化設(shè)計方法的應(yīng)用。
層次化設(shè)計將整個設(shè)計任務(wù)按功能劃分為多個子模塊分別實現(xiàn)和驗證,大大降低了設(shè)計和仿真驗證的難度[11]。更重要的是,只有掌握了層次化設(shè)計方法才能將一些常用的基本功能,如定時器、鎖存器、多路開關(guān)等設(shè)計為基本元件,建立自己的元件庫。這樣在以后的設(shè)計開發(fā)中就可以直接調(diào)用元件庫中的元件。豐富實用的元件庫將大大縮短開發(fā)進程,提高開發(fā)效率。
此外,有些硬件功能必須通過宏功能模塊才能使用,如ROM存儲器、LPM加法器等。Quartus提供了MegaWizard Plug-in Manager工具,幫助用戶根據(jù)自己的需求新建和編輯宏功能模塊的設(shè)計文件,但用戶必須掌握了層次化設(shè)計實現(xiàn)方法,才能在自己的設(shè)計文件中調(diào)用宏功能模塊。
傳統(tǒng)的硬件設(shè)計就是選擇合適的元件,在印制電路板上將多個元件連接起來,實現(xiàn)某個具體的功能。這種設(shè)計思想在EDA技術(shù)中依然適用,并且更加靈活。層次化設(shè)計方法是將具體的設(shè)計任務(wù)按功能分成多個獨立的模塊,分別實現(xiàn),經(jīng)過時序仿真驗證無誤后,再以這些模塊為基本元件,完成整個設(shè)計任務(wù)。隨著設(shè)計經(jīng)驗的增加,元件庫也越來越豐富,這是設(shè)計者的寶貴財富,可以大大縮短開發(fā)周期,降低開發(fā)難度。
層次化設(shè)計方法在設(shè)計任務(wù)時自頂向下進行分析設(shè)計,將任務(wù)劃分為多個獨立的子模塊,而實現(xiàn)時則是自底向上逐層實現(xiàn)。
EDA設(shè)計的輸入方式主要分為兩種:原理圖方式和硬件描述語言方式。
(1)原理圖設(shè)計輸入是在畫布上放置元件,用導線將元件引腳連接起來,添加輸入輸出引腳,最終完成設(shè)計。原理圖設(shè)計方法比較簡單、直觀,缺點是Quartus應(yīng)用軟件提供的元件庫中只有一些常用的基礎(chǔ)元件,完全符合需求的元件比較難找。
(2)硬件描述語言將設(shè)計者從具體的硬件設(shè)計細節(jié)中解脫出來,設(shè)計者不需要深入了解具體的硬件設(shè)計,只需要用指令描述元件的邏輯功能就能完成功能設(shè)計。硬件描述語言的出現(xiàn)大大降低了硬件設(shè)計的難度,用硬件描述語言完成電路設(shè)計是EDA技術(shù)的核心內(nèi)容,雖然有多種不同的硬件描述語言,但它們沒有本質(zhì)區(qū)別,都是編寫代碼、綜合適配成相應(yīng)的硬件電路。VHDL和Verilog HDL是使用較多的兩種硬件描述語言。本文的設(shè)計實例采用的是VHDL描述語言方式。
應(yīng)用層次化設(shè)計方法完成具體的設(shè)計任務(wù)時,應(yīng)自底向上逐層實現(xiàn),以下層設(shè)計為基礎(chǔ)元件完成上層設(shè)計。每一層次的設(shè)計都可以采用原理圖輸入或硬件描述語言輸入。
(1)采用原理圖輸入方式。此時需要先將下層設(shè)計包裝成元件,方便在原理圖中調(diào)用。具體步驟:先打開下層設(shè)計文件(原理圖或VHDL),選擇File選單(菜單)—Create/Update子 選 單 (子 菜單)—Create Symbol Files for Current File選項,將下層設(shè)計文件生成對應(yīng)的元件;然后再新建原理圖設(shè)計文件完成上層設(shè)計,此時元件對話框中在Project文件夾下會多出剛才生成的元件,調(diào)用它們即完成了上層設(shè)計。
(2)采用VHDL輸入方式。此時只需在VHDL文件中用COMPONENT語句聲明要使用的基本元件,然后就可以根據(jù)需要定義多個元件實例,并用PORT MAP語句完成端口映射連接即可。元件聲明的作用是說明要使用的元件類型;元件實例則等同于在畫布上放置所需的元件芯片,根據(jù)設(shè)計需要,同一類型的元件可以有多個實例;端口映射等同于在畫布上用導線連接芯片的引腳。
以一個簡單的秒表設(shè)計任務(wù)為例說明層次化設(shè)計方法的思路和實現(xiàn)。秒表可以啟動/暫停計時,復位則重新開始計時,時分秒以“X-XX-XX”的形式在7位LED上顯示出來。7位LED的位選信號通過插孔ds1~ds7引出,而段選信號連在一起,通過插孔a—h引出,2個開關(guān)分別用作復位鍵和啟停鍵。對FPGA芯片編程可以實現(xiàn)秒表功能,并控制LED顯示。
首先分析設(shè)計任務(wù),將其劃分為多個獨立的子模塊。按功能劃分,這個設(shè)計任務(wù)明顯可分為兩大模塊:秒表模塊和LED顯示控制模塊。而在秒表模塊中的時、分、秒都是計數(shù)器,為了方便LED顯示,可以用分、秒的十位和個位分別實現(xiàn),這樣只需要用3個計數(shù)值為0~9的mod 10計數(shù)器和2個計數(shù)值為0~5的mod 6計數(shù)器,就可以完成秒表功能。圖1為層次設(shè)計框圖。
圖1 秒表的層次設(shè)計框圖
實現(xiàn)時應(yīng)該自底向上,先實現(xiàn)下層模塊,再調(diào)用下層設(shè)計完成上層設(shè)計。
3.2.1 最底層的計數(shù)器設(shè)計
用VHDL編程分別實現(xiàn)mod 6和mod 10定時器設(shè)計,文件名分別為mod6.vhd和mod10.vhd。
3.2.2 第2層的秒表模塊設(shè)計
(1)用原理圖輸入方式完成。先打開mod6.vhd文件,點擊選單生成相應(yīng)的symbol文件;再打開mod10.vhd文件,同樣點擊選單生成symbol文件;最后新建原理圖文件timer.bdf,此時雙擊畫布的空白區(qū)域,彈出的Symbol窗口,在Project文件夾下就多了mod6和mod102個元件,如圖2所示。
在畫布上放置3個mod10元件,2個mod6元件,添加輸入輸出接口,并將它們用導線連接,就完成了秒表模塊的設(shè)計。
(2)用VHDL完成。新建VHDL文件,文件名為timer.vhd。只需要在結(jié)構(gòu)體中給出mod 6和mod 10的元件聲明,然后根據(jù)需要定義2個mod 6和3個mod 10的實例,參考程序如下。
圖2 生成計數(shù)器元件后的Symbol窗口
此外Quartus可以自動生成元件聲明語句,只需打開元件的設(shè)計文件,選擇File選單——Create/Update子選單——Create VHDL Component Declaration File for Current File選項,就會在項目文件夾下生成與設(shè)計文件同名、后綴為.cmp的文件;打開該文件,將內(nèi)容復制粘貼到當前層次設(shè)計的VHDL文件中即可。
3.2.3 實現(xiàn)7位LED控制器設(shè)計
用VHDL完成LED顯示控制模塊,文件名為ledctrl.vhd。由于篇幅限制,省略具體代碼,只給出LED控制器的實體定義。
輸入引腳en控制LED是否顯示;輸入時鐘信號clk的周期控制每一位LED的顯示時間,7位LED每次只有一位顯示,具體顯示的數(shù)值由din1~din7決定;輸出引腳ds和seg分別控制LED的位選和段選。
din1~din7端口輸入的數(shù)據(jù)分別顯示在從右到左的第1位~第7位LED上。若輸入數(shù)據(jù)在”0000”~“1001”之間LED則顯示對應(yīng)的字形;輸入為”1010”LED則顯示“—”;若為其他數(shù)據(jù)LED不顯示。當clk信號頻率在1kHz左右時,視覺暫停效果使得看上去7位LED同時顯示不同的數(shù)值。
3.2.4 實現(xiàn)最頂層的秒表設(shè)計
以timer和ledctrl為基礎(chǔ)元件完成整個秒表設(shè)計和顯示,需要將timer元件的輸出端口與ledctrl元件的輸入端口相連,而timer元件的輸出secH、minH為3位總線,ledctrl元件的din1~din7均為4位總線,2個總線位數(shù)不一致時不能直接連接。第6位和第3位LED始終顯示“—”,即din6和din3的輸入始終為“1010”,需要向端口輸入常數(shù)。
(1)原理圖中的總線、分線和常數(shù)。原理圖中需要分別連接某總線端口的各位信號線時,可以將元件端口用總線引出并命名,例如將ledctrl元件中的din2用總線引出并命名為d2[3..0]。d2為總線的名稱,[3..0]說明該總線為4位;然后就可以用d2[3]、d2[2]、d2[1]和d2[0]分別表示d2總線中的各位信號線。
電路圖中的常數(shù)意味著信號固定接地(GND)或接電源(VCC),在Symbol對話框中輸入 GND或VCC,就能在原理圖上放置地或電源,再用導線連接即可。
圖3將timer元件中3位的secH與ledctrl元件中din2的低3位相連,din2的最高位接地。為突出連接,將相關(guān)部分用紅色框出。
(2)VHDL中的總線、分線和常數(shù)。用VHDL實現(xiàn)最頂層秒表設(shè)計的部分程序段如下,相關(guān)代碼用紅色框出。
圖3 3位總線與4位總線之間的連接
EDA技術(shù)徹底改變了數(shù)字系統(tǒng)的設(shè)計實現(xiàn)方法,硬件編程語言降低了硬件設(shè)計的難度和復雜度,而層次化設(shè)計方法自頂向下將設(shè)計任務(wù)分解為獨立的功能模塊分別實現(xiàn)和仿真驗證,用戶可建立自己的元件庫,重復利用以往的設(shè)計成果,大大提高了設(shè)計的靈活性和效率,縮短了設(shè)計周期。
(References)
[1]趙輝.基于EDA技術(shù)的數(shù)字系統(tǒng)設(shè)計[J].電子設(shè)計工程,2012,20(2):34-37,41.
[2]趙剛,何志敏,陳利學.基于FPGA的EDA綜合實驗系統(tǒng)設(shè)計[J].微計算機信息,2012,28(1):49-51.
[3]潘松,黃繼業(yè).EDA技術(shù)實用教程[M].北京:科技出版社,2006.
[4]牛軍浩,胡聰,殷賢華.EDA分層教育方法改革[J].電氣電子教學學報,2011,33(6):115-116,119.
[5]任國鳳.項目式教學法應(yīng)用于EDA本科教學的探索[J].太原師范學院學報:自然科學版,2011,10(4):158-160.
[6]張惠國,潘啟勇,華強,等.EDA課程層入式教學及實驗平臺建設(shè)[J].常熟理工學院學報:2011(12):107-109.
[7]張艷,靳孝峰.對EDA技術(shù)課程教學改革的探討[J].教育與職業(yè),2011(21):143-144.
[8]張艷春.數(shù)字電子系統(tǒng)的EDA設(shè)計方法研究[[J].現(xiàn)代電子技術(shù):2009,32(17):188-190.
[9]王曉峰.可編程邏輯器件及硬件描述語言的EDA方法[J].長春大學學報,2005,15(4):14-16.
[10]孟中.基于EDA層次化設(shè)計方法的出租車計費器設(shè)計[J].現(xiàn)代電子技術(shù),2011,34(16):23-24,30.
[11]王戎丞,陳可中,明鑫.基于VHDL的數(shù)字頻率計的設(shè)計與實現(xiàn)[J].現(xiàn)代電子技術(shù),2005,28(15):102-104.