版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
6.1VHDL語言設(shè)計(jì)概述6.2VHDL可編譯源設(shè)計(jì)單元6.3VHDL語言基礎(chǔ)知識(shí)6.4時(shí)序語句與行為描述6.5信號(hào)與信號(hào)賦值6.6并發(fā)行為性語句與數(shù)據(jù)流描述6.7元件層次與結(jié)構(gòu)描述6.8VHDL設(shè)計(jì)舉例6.9課程設(shè)計(jì)復(fù)習(xí)第6章VHDL系統(tǒng)設(shè)計(jì)語言
6.1VHDL語言設(shè)計(jì)概述
6.1.1簡(jiǎn)介
1962年,Iverson首先提出硬件描述語言(HDL)的概念。經(jīng)過淘汰選擇,本書介紹的VHDL和VerilogHDL已經(jīng)成為被普遍接受的硬件設(shè)計(jì)語言標(biāo)準(zhǔn)。電子設(shè)計(jì)手段的更新?lián)Q代歷經(jīng)了一次否定之否定的螺旋式前進(jìn)歷程:從計(jì)算機(jī)早期階段的文本輸入,發(fā)展到圖形輸入,又發(fā)展到現(xiàn)在的文本描述與圖形輸入并存的局面。
屬于文本形式類的新型硬件設(shè)計(jì)語言還有SystemC、SystemVerilog;另一種屬于圖形類的便捷設(shè)計(jì)輸入方式則是采用高層原理方框圖的圖形描述技術(shù)。
1.VHDL名稱與功能
VHDL(VHSIC硬件描述語言,VHSICHardwareDescriptionLanguage)是一種電子工程設(shè)計(jì)師用來設(shè)計(jì)硬件系統(tǒng)與電路的高級(jí)語言。其中,VHSIC是指美國國防部(DOD)1978年制定的總預(yù)算為2.1億美元的七年超高速集成電路(VeryHighSpeedIntegratedCircuit)發(fā)展計(jì)劃。該計(jì)劃要求1986年美國的VHSIC實(shí)現(xiàn)亞微米工藝,芯片規(guī)模大于25萬門,速度提高100倍以上。1981年成立VHDL工作組;1983年由IBM、TI、Intermetrics等公司組成VHDL開發(fā)組。1986年IEEE標(biāo)準(zhǔn)化組織開始審定VHDL標(biāo)準(zhǔn)。美國最初制定VHDL語言標(biāo)準(zhǔn)的初衷是提供一種描述電子硬件系統(tǒng)的手段,用于復(fù)雜電子產(chǎn)品開發(fā)、技術(shù)交流和文件歸檔。其目的是加速VHSIC器件和電子系統(tǒng)的研制。
目前,VHDL已經(jīng)發(fā)展成為設(shè)計(jì)師實(shí)現(xiàn)設(shè)計(jì)創(chuàng)建描述(輸入—?dú)w檔—交流—修改)、設(shè)計(jì)模擬仿真(驗(yàn)證)、設(shè)計(jì)綜合、設(shè)計(jì)測(cè)試等貫穿設(shè)計(jì)全過程四種功能的標(biāo)準(zhǔn)語言。它已經(jīng)得到EDA及ASIC廠商的普遍支持。
采用VHDL進(jìn)行設(shè)計(jì),可以立刻得到新方案的仿真結(jié)論。但是,VHDL并不是全部可綜合的,可以被綜合的只是一個(gè)子集。
2.VHDL的標(biāo)準(zhǔn)化歷程
VHDL從問世起,就一直以標(biāo)準(zhǔn)系列的載體形式記錄著它的發(fā)展和逐漸成熟的歷程。下面按照時(shí)間順序列出一些典型的相關(guān)標(biāo)準(zhǔn)。
(1)早在1987年12月,VHDL被確定為標(biāo)準(zhǔn)的最初版本IEEEStd1076-1987。本書中簡(jiǎn)寫為IEEE-1076-1987,或IEEE-1076。
(2)?VHDL同時(shí)也是美國軍方的MilStd-454L標(biāo)準(zhǔn)。
(3)經(jīng)過對(duì)最初版本的使用和修訂之后,1993年美國國家標(biāo)準(zhǔn)局(ANSI)和IEEE給出VHDL的新版本ANSI/IEEEStd1076-1993。2002年IEEE設(shè)計(jì)自動(dòng)化委員會(huì)又推出IEEEStd1076-2002新版本(詳見參考文獻(xiàn)IEEEStandardVHDLLanguageReferenceManual.2002及附錄1)。
(4)其中可綜合的子集部分被匯編成標(biāo)準(zhǔn)文本IEEE-1076.6/D2.0。
(5)多值邏輯系統(tǒng)集合包于1993年被確定為與VHDL主標(biāo)準(zhǔn)相配套的IEEE-1164-1993標(biāo)準(zhǔn)。
(6)標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算集合包,包括Math_real和Math_complex兩個(gè)集合包,于1996年被確定為附屬標(biāo)準(zhǔn)IEEE-1076.2。
(7)?VITAL(VHDLInitiativeTowardsASICLibraries)是ASIC仿真時(shí)的延遲參數(shù)格式標(biāo)準(zhǔn),用于建立庫參數(shù)模型(LPM,LibraryParameterModel),于1995年被確定為附屬標(biāo)準(zhǔn)IEEE-1076.4。
(8)根據(jù)IEEE-1076-1993,1995年國家技術(shù)監(jiān)督局推薦VHDL為我國EDA硬件描述語言的國家標(biāo)準(zhǔn)。之后,在2001年制定了國內(nèi)的電子設(shè)計(jì)硬件描述語言VHDL標(biāo)準(zhǔn)SJ20777-2000。
3.VHDL的優(yōu)點(diǎn)
采用VHDL語言進(jìn)行硬件系統(tǒng)與電路設(shè)計(jì),具有如下一些優(yōu)點(diǎn)。
1)支持多種設(shè)計(jì)方法和技術(shù)
VHDL支持多種設(shè)計(jì)方法和技術(shù),已經(jīng)得到EDA廠商的廣泛支持。所支持的設(shè)計(jì)方法包括:自上而下的設(shè)計(jì)和基于庫的設(shè)計(jì)。所支持的設(shè)計(jì)技術(shù)包括:同步設(shè)計(jì)和異步設(shè)計(jì)等。
2)支持高復(fù)雜度的描述與設(shè)計(jì)
VHDL支持各種規(guī)模級(jí)別復(fù)雜度、行為和邏輯結(jié)構(gòu)兩個(gè)層次描述的設(shè)計(jì),可以包括從系統(tǒng)級(jí)描述(行為或結(jié)構(gòu))到寄存器轉(zhuǎn)移級(jí)(RTL)描述,再到門級(jí)邏輯網(wǎng)表結(jié)構(gòu)詳細(xì)描述。它是SOC系統(tǒng)集成設(shè)計(jì)的得力工具。利用元件這一抽象機(jī)制,VHDL支持并行開發(fā)策略,支持多層次的混合仿真。
3)設(shè)計(jì)活動(dòng)具有獨(dú)立性
VHDL獨(dú)立于EDA軟件工具之外,便于學(xué)習(xí)。但這個(gè)語言標(biāo)準(zhǔn)又得到了所有EDA廠商的廣泛有力支持。
4)與制造工藝獨(dú)立
VHDL不針對(duì)物理結(jié)構(gòu)進(jìn)行描述,它與制造工藝技術(shù)相對(duì)獨(dú)立,但設(shè)計(jì)師可以用VHDL編寫部分工藝信息。
5)標(biāo)準(zhǔn)化的一次成功實(shí)踐
VHDL完全是人為制造出來的一種設(shè)計(jì)語言標(biāo)準(zhǔn),已經(jīng)使得設(shè)計(jì)活動(dòng)中的各種銜接關(guān)系得到改善和簡(jiǎn)化。它的采用推動(dòng)了電子設(shè)計(jì)的交流、存檔和復(fù)用。
VHDL提供的復(fù)用手段包括:集合包、配置、子程序、元件、一個(gè)實(shí)體號(hào)對(duì)應(yīng)多個(gè)構(gòu)造體等。6.1.2設(shè)計(jì)單元和庫
1.四種源設(shè)計(jì)單元
VHDL中有以下四種可編譯的源設(shè)計(jì)單元:
(1)實(shí)體號(hào)(EntityDeclaration)。
(2)構(gòu)造體(ArchitectureBody)。
(3)集合包(Package,分為包說明Declaration和包體Body兩部分)。
(4)配置(ConfigurationDeclaration)。
2.庫內(nèi)容
采用VHDL進(jìn)行設(shè)計(jì)活動(dòng)時(shí),需要用到庫(Library)。庫不是VHDL的源設(shè)計(jì)單元,它是存放源設(shè)計(jì)單元的場(chǎng)所,其存放的內(nèi)容分為以下幾類:
(1)當(dāng)前設(shè)計(jì)的上述四種源設(shè)計(jì)單元。
(2)已有的用戶設(shè)計(jì)庫。
(3)集合包STANDARD、TEXTIO等。
(4)?ASIC廠商提供的庫。
(5)?EDA廠商提供的庫。
這里所列五類庫的內(nèi)容(1)、(2)、(3)、(4)、(5)與設(shè)計(jì)活動(dòng)的關(guān)系如圖6-1所示。圖6-1VHDL設(shè)計(jì)中庫的作用6.1.3表現(xiàn)手法
VHDL表現(xiàn)電路設(shè)計(jì)的手法主要有兩種:電路邏輯結(jié)構(gòu)網(wǎng)表和電路功能行為描述。VHDL為了能在系統(tǒng)行為層次表現(xiàn)算法,擴(kuò)展了實(shí)數(shù)數(shù)據(jù)類型。
我們?cè)诒?-1的基礎(chǔ)上加以修改,將VHDL語言的表達(dá)能力用表6-1表示。下面分別做一介紹。
1.表征電路結(jié)構(gòu)網(wǎng)表
可以用VHDL結(jié)構(gòu)風(fēng)格中的元件(Component)及實(shí)例生成連接關(guān)系來描述邏輯電路網(wǎng)表。
2.表征系統(tǒng)行為
也可以用VHDL表征系統(tǒng)的行為,例如用并發(fā)行為性語句
A<=B+Cafter5ns;
給出整數(shù)A、B、C之間的運(yùn)算關(guān)系。
VHDL對(duì)大、小寫不加區(qū)別,上述語句與A<=b+cafter5NS;是一樣的。
3.表現(xiàn)實(shí)數(shù)域運(yùn)算算法
VHDL中也定義有實(shí)數(shù)(浮點(diǎn)數(shù)),但是它主要是用來描述模擬量和研究算法的。
這樣,在概念設(shè)計(jì)時(shí)可以允許有不同的表征層次,包括:系統(tǒng)、算法行為、寄存器轉(zhuǎn)移結(jié)構(gòu)、單位延遲門和詳細(xì)時(shí)序門等。在真正硬件實(shí)現(xiàn)時(shí),需要再改造為可綜合的設(shè)計(jì),包括用定點(diǎn)數(shù)來完成計(jì)算等。6.1.4VHDL開發(fā)環(huán)境
目前,幾乎所有的EDA工具都擁有VHDL的開發(fā)環(huán)境。以比較簡(jiǎn)單易用的V-System為例,設(shè)計(jì)開發(fā)的基本步驟如下。
1.編輯編譯
使用編輯(Editor)工具,設(shè)計(jì)出VHDL的源設(shè)計(jì)文本。再將源設(shè)計(jì)文件進(jìn)行編譯(Compilier),可以得到源程序中語法方面的出錯(cuò)信息。
2.仿真硬件
V-System(后來發(fā)展為ModelSim)開發(fā)環(huán)境的主體是模擬仿真器(Simulator),用仿真器對(duì)編譯好的源設(shè)計(jì)單元進(jìn)行模擬仿真。可以用仿真器的命令給出仿真用的激勵(lì),也可以直接用VHDL來編寫激勵(lì)。對(duì)用VHDL編寫的程序進(jìn)行仿真,和對(duì)用一般軟件語言編寫的程序進(jìn)行仿真,具有如下的不同之處。
(1)模擬時(shí)間——在VHDL中引入“模擬時(shí)間”的概念來模擬真實(shí)硬件實(shí)際運(yùn)行時(shí)所花費(fèi)的時(shí)間;模擬VHDL程序段對(duì)應(yīng)的硬件運(yùn)行時(shí)間。它用時(shí)間步長(zhǎng)規(guī)定了相對(duì)時(shí)間、絕對(duì)時(shí)間等序列。程序按模擬時(shí)間運(yùn)行,互相間的延遲也按模擬時(shí)間計(jì)算。
(2)并發(fā)性——并發(fā)性是模擬真實(shí)硬件運(yùn)行時(shí)的重要概念,這一點(diǎn)也不同于一般的軟件語言程序。如果設(shè)計(jì)中有幾個(gè)加法器,它們將隨著模擬時(shí)間的增長(zhǎng)并行工作,其中的每個(gè)加法器都是在輸入到來后就并行運(yùn)行。這與硬件電路實(shí)際工作情況是一致的。
3.結(jié)構(gòu)化關(guān)系
所謂結(jié)構(gòu)層次化設(shè)計(jì),主要是指結(jié)構(gòu)描述手法。VHDL用實(shí)例生成(Instantiation)完成在構(gòu)造體中對(duì)元件的調(diào)用和裝配。
類比于一般軟件程序語言設(shè)計(jì)中的主程序與子程序的關(guān)系,VHDL語言則體現(xiàn)在構(gòu)造體設(shè)計(jì)中的實(shí)例生成與元件的關(guān)系。
4.配置手段
可以用不同的配置形成不同的設(shè)計(jì)版本;模擬用的不同模型也以不同配置的形式出現(xiàn),詳見參考文獻(xiàn)——薛宏熙等著《數(shù)字系統(tǒng)設(shè)計(jì)自動(dòng)化》。
6.2VHDL可編譯源設(shè)計(jì)單元
前面介紹過的四種可編譯源設(shè)計(jì)單元,也可以將其稱之為VHDL中的四大構(gòu)件(Construct)。它們的基本功能是:
(1)實(shí)體號(hào)——描述設(shè)計(jì)的信號(hào)接口界面(即子設(shè)計(jì)元件或總設(shè)計(jì)的I/O界面)。
(2)構(gòu)造體——指定設(shè)計(jì)的真實(shí)行為性能和結(jié)構(gòu)。
(3)集合包——將常用的數(shù)據(jù)類型、常數(shù)、說明這一類約定和子程序等設(shè)計(jì)模塊集中存放。這樣,對(duì)于其他設(shè)計(jì)而言,它們是可見的和可共享的。
(4)配置——用于從庫中選取單元來搭配組合成不同的設(shè)計(jì)版本,是通過指派來建造新設(shè)計(jì)體的一種手段。
此外還有庫,它本身不是源設(shè)計(jì)單元,它用來存放源設(shè)計(jì)單元,它是設(shè)計(jì)時(shí)的倉庫。
下面先給出VHDL設(shè)計(jì)文件示例mine.vhd。
packagemy_defsis--實(shí)際上包標(biāo)題應(yīng)該已經(jīng)設(shè)計(jì)好并事先放入freds_library中
constantunit_delay:time:=1ns;
endmy_defs;
entityCOMPAREis
port(a,b:inbit;
c:outbit);
endCOMPARE;
libraryfreds_library;
Usefreds_library.my_defs.all;
architectureflowofCOMPAREis
begin
C<=NOT(axorb)afterunit_delay; --“同或門”
構(gòu)成
endflow; --等值比較器集合包my_defs給出了可以共享的常數(shù)。
實(shí)體號(hào)COMPARE為設(shè)計(jì)和信號(hào)端口命名。
構(gòu)造體flow給出了設(shè)計(jì)細(xì)節(jié)。
按默認(rèn)的規(guī)定,最新編譯的構(gòu)造體就是當(dāng)前的默認(rèn)配置,所以COMPARE的一個(gè)配置就是flow。備注:
所有的VHDL源文件文本都可以采用--…做為注釋方法!它由兩個(gè)連字符--開頭組成一個(gè)注釋內(nèi)容為…的注釋行。若一行寫不下,可以再用兩個(gè)連字符--增加一行注釋行。中英文都行,注釋并不影響程序的編譯和仿真。
在本章關(guān)于VHDL的句法描述中,用定義符::=表示定義符左邊的項(xiàng)由右邊的表達(dá)式來定義;用豎杠符號(hào)∣分隔多個(gè)選項(xiàng);用[…]表明方括弧內(nèi)的項(xiàng)是可選項(xiàng);用{…}表明花括弧內(nèi)的項(xiàng)可以重復(fù)0次或多次。
另外,VHDL語法認(rèn)為源文件中的大小寫字母是一樣的,例如not與NOT是相同的。
為了醒目起見,在設(shè)計(jì)舉例中,我們將四種源設(shè)計(jì)單元中用于起始、結(jié)束的字符和其他所有的保留字都用黑體表示。6.2.1庫
1.分類
如前所述,庫(Library)是放置源設(shè)計(jì)單元的倉庫。庫中的內(nèi)容包括:
(1)通用集合包庫——標(biāo)準(zhǔn)集合包STANDARD,文本I/O函數(shù)TEXTIO集合包。為了提高生命力,標(biāo)準(zhǔn)化組織已經(jīng)擴(kuò)展了不少集合包。
(2)用戶庫WORK——用戶設(shè)計(jì)源文件,包含集合包,由用戶自己不斷充實(shí)完善。
(3)?ASIC廠商庫——這里是經(jīng)過驗(yàn)證的設(shè)計(jì),包括門電路等都是庫中的元件。
(4)?EDA廠商庫——有函數(shù)集合包,例如求平方根等。
2.庫規(guī)則解釋
(1)?VHDL編譯的結(jié)果存放在某一個(gè)用戶庫中,庫可以包括上述四種源設(shè)計(jì)單元。
(2)?VHDL不支持庫之間的包含結(jié)構(gòu),即,盡管庫可以有許多個(gè),但庫之間不能嵌套。
(3)兩個(gè)內(nèi)建(Built-in)庫:其名稱為WORK和STD。
(4)需要從庫中調(diào)出設(shè)計(jì)單元用于設(shè)計(jì)時(shí),則庫說明部分的句法如下所述,即
librarylibrary_name;
再用Use子句打開,然后才能起作用。打開庫時(shí)最多有三個(gè)層次,格式如下:
uselibrary_name.package_name.item_name;
或者是兩層:
uselibrary_name.item_name;
舉例:
Usefreds_library.my_defs.unit_delay;
其中集合包my_defs必須先編譯;Use后面給出的即為打開的庫層次。被打開的項(xiàng)unit_delay在下面的語句及隨后的其他語句中才可以使用。
C<=NOT(axorb)afterunit_delay;而默認(rèn)庫WORK是不需說明的特殊庫。對(duì)于WORK庫中的內(nèi)容,在Use字句中可以不出現(xiàn)庫名而直接出現(xiàn)庫中下兩層的內(nèi)容:
usepackage_name.item_name;或者useitem_name;
(5)庫中各單元的名稱應(yīng)該各不相同(實(shí)體號(hào)和集合包的名稱應(yīng)該不同,同一個(gè)設(shè)計(jì)實(shí)體號(hào)的各構(gòu)造體名字也應(yīng)該各不相同)。6.2.2集合包
1.簡(jiǎn)介
集合包(Package)是一個(gè)可共享、可編譯的VHDL源設(shè)計(jì)單元,它又是庫中的一個(gè)層次。集合包由集合包說明(PackageDeclaration)和集合包體(PackageBody)兩部分構(gòu)成。
用Use語句將集合包打開,但STD庫中的STANDARD集合包中的調(diào)用不需要Use語句。Use語句中的all是指其中的所有項(xiàng);Use實(shí)現(xiàn)將庫打開的效果,該庫內(nèi)容將被應(yīng)用于其后的那個(gè)設(shè)計(jì)單元。
2.功能和構(gòu)成
這里,對(duì)集合包中的有關(guān)功能先做一簡(jiǎn)要解釋。
(1)先編譯的集合包說明(PackageDeclaration,又稱標(biāo)題,Header)包括:
類型說明、元件說明、信號(hào)說明、子程序說明、常數(shù)說明或推遲說明。
(2)后編譯的集合包體(PackageBody)是一可選項(xiàng),將給出進(jìn)一步的有關(guān)細(xì)節(jié),包括:子程序體、推遲說明的常數(shù)值等。
將包說明與包體加以分離,有助于隔離和孤立日后的設(shè)計(jì)變動(dòng)。注意:一個(gè)包說明最多只有一個(gè)包體,也可以沒有包體;包說明和包體可以不放在一處。
本節(jié)開始時(shí)給出一個(gè)VHDL設(shè)計(jì)文件示例mine.vhd,該處的集合包my_defs就沒有包體。此種情況下如果想改變常數(shù)就比較困難,而下例則比較方便。
3.格式舉例
packagemathis
Mean_Value:REAL;
ENDmath;
PACKAGEBODYmathis
CONSTANTMean_Value:REAL:=110.0;
ENDmath;
需要改變時(shí),最好只對(duì)此段集合包體程序進(jìn)行單獨(dú)編譯。為達(dá)到這一目的,需要將集合包說明和集合包體分別放在不同的設(shè)計(jì)文件中。這時(shí),最好把不再改動(dòng)的集合包標(biāo)題部分放在公用的庫中不動(dòng)。6.2.3實(shí)體號(hào)
1.釋義
在VHDL中,用來描述硬件的主體是設(shè)計(jì)實(shí)體(DesignEntity,稱作Entity)。完整的實(shí)體由實(shí)體號(hào)(EntityDeclaration)和構(gòu)造體(ArchitectureBody)兩部分組成。實(shí)體號(hào)經(jīng)常被簡(jiǎn)稱為Entity,構(gòu)造體被簡(jiǎn)稱為Architecture。
VHDL將實(shí)體號(hào)與構(gòu)造體分開是一個(gè)比較明智的策略。實(shí)體號(hào)定義了一個(gè)新的元件名,編譯并經(jīng)過模擬仿真后放入庫中。這樣在另外的設(shè)計(jì)中加以說明,就可以作為元件使用。要說明的內(nèi)容有元件的輸入/輸出連接關(guān)系以及一些有關(guān)的參數(shù);要說清楚元件的外部接口以及連接用信號(hào)的類型和方向。根據(jù)如圖
6-2所示的示例框圖,可以進(jìn)一步理解VHDL中實(shí)體號(hào)的作用。2.格式
entityentity_nameis--這里的entity_name為實(shí)體號(hào)名稱
〔generics〕 --entity標(biāo)題之一的類屬子句
〔ports〕 --entity標(biāo)題之二的端口子句
〔declarations{constants,types,signals}〕--declarations為說明
〔begin--常數(shù)類型信號(hào)
entity_statements〕--這里的實(shí)體號(hào)語句通常不用
endentity_name;在實(shí)體號(hào)中,如果出現(xiàn)begin,則begin后的實(shí)體號(hào)語句不是動(dòng)態(tài)的動(dòng)作。它只是被動(dòng)的核查與認(rèn)定,例如觸發(fā)器置位和復(fù)位端是否同時(shí)為0等。
3.舉例
下面給出實(shí)體號(hào)設(shè)計(jì)的三個(gè)示例——例(1)、例(2)、例(3)。在了解它們共性的基礎(chǔ)上,請(qǐng)進(jìn)一步注意它們之間的差別。
例(1)
entityCOMPAREis
port(A,B:inbit;
C:outbit);
endCOMPARE;
例(1)中的entity和is都是VHDL的保留字;A、B是類型為Bit的輸入信號(hào);C是類型為Bit的輸出信號(hào)。實(shí)體號(hào)的名稱是COMPARE,并不等價(jià)于它代表真實(shí)的功能。這個(gè)實(shí)體號(hào)可能是一個(gè)比較器,但也可能不是。設(shè)計(jì)的輸入輸出關(guān)系如圖6-2所示,讀者可以望文生義,暫且先把它想像成比較器,留待后面構(gòu)造體中的語句功能再加以驗(yàn)證。圖6-2VHDL實(shí)體號(hào)對(duì)應(yīng)的框圖例(2)
entityCOMPARE_digitis
port(A,B:inintegerrange0to9:=0;--區(qū)間約束
C:outboolean);
endCOMPARE_digit;
例(2)的設(shè)計(jì)明顯與上面的例(1)不同,port說明中的integer為整數(shù),:=0表示初值,boolean量的初值為false,增加了一些約束來指定端口的位數(shù)、區(qū)間及初值。例(3)
entityCOMPARE_digit1is
port(A,B:inintegerrange0to9:=big_number
C:outboolean);
endCOMPARE_digit1;
在例(3)的設(shè)計(jì)中,初值的設(shè)置更加靈活。但是,句法要求其中的big_number應(yīng)在集合包中說明過。
編譯后的實(shí)體號(hào)可以作為一個(gè)元件使用和對(duì)待,使用時(shí)不需要知道細(xì)節(jié),而且也不需要重新編譯。6.2.4構(gòu)造體
1.概述
構(gòu)造體(ArchitectureBody)與實(shí)體號(hào)(EntityDeclaration)一起構(gòu)成一個(gè)完整的實(shí)體(Entity)。根據(jù)實(shí)體號(hào)所確定的前提,設(shè)計(jì)師用構(gòu)造體來具體指定實(shí)體的行為、元件(結(jié)構(gòu))以及內(nèi)部連接關(guān)系,定義出設(shè)計(jì)實(shí)體的真實(shí)功能。
設(shè)計(jì)師在設(shè)計(jì)活動(dòng)中需要先編譯Entity,然后再編譯Architecture。一旦重新編譯了Entity,則相應(yīng)地需要再重新編譯Architecture。設(shè)計(jì)構(gòu)造體時(shí),可以從下述兩個(gè)方面去詮釋和描述實(shí)體號(hào):既可以采用不同的抽象層次(例如用系統(tǒng)行為功能的方框模型,或者是電路邏輯結(jié)構(gòu)模型);也可以采用不同的實(shí)現(xiàn)方式(例如加法器可以是串行脈動(dòng)進(jìn)位,或者是并行超前進(jìn)位)。
關(guān)于實(shí)體的實(shí)質(zhì)性描述最終是由構(gòu)造體給出。即使對(duì)應(yīng)于同一個(gè)實(shí)體號(hào),不同的構(gòu)造體描述可能會(huì)使得整個(gè)實(shí)體的功能面目全非。采用不同設(shè)計(jì)風(fēng)格進(jìn)行設(shè)計(jì)時(shí),關(guān)注的對(duì)象和核心是不同的。概括起來,行為風(fēng)格核心是數(shù)據(jù)變換和定時(shí);數(shù)據(jù)流風(fēng)格核心是激勵(lì)—響應(yīng)模型;結(jié)構(gòu)風(fēng)格核心是元件、端口和信號(hào)?,F(xiàn)在已經(jīng)有編譯器和綜合工具支持混合風(fēng)格描述。一般,一個(gè)設(shè)計(jì)可以采用上述某種或全部描述風(fēng)格,這要根據(jù)抽象層次及細(xì)節(jié)描述的需要而定。
2.Architecture格式
architecturearchitecture_nameofentity_nameis
〔declarations〕
begin
〔concurrent_statements〕
end〔architecture_name〕;
此段中architecture_name為構(gòu)造體名,entity_name為實(shí)體號(hào)名;declarations說明本構(gòu)造體內(nèi)用的項(xiàng):類型、子程序、常數(shù)、信號(hào)、元件等;concurrent_statements泛指包括元件實(shí)例生成在內(nèi)的廣義并發(fā)語句。一個(gè)Entity(下例中為compare)可以對(duì)應(yīng)不同的Architectures。如果對(duì)應(yīng)的構(gòu)造體有a、b、c三種,則每一個(gè)都可以理解為其中之一,即oneofcompare的關(guān)系。
在編寫Architecture時(shí),出現(xiàn)在構(gòu)造體首行的形式為
…aofcompare…
…bofcompare…
…cofcompare…
在編寫配置說明時(shí),又往往寫成如下的關(guān)系形式:
…compare(a)…
…compare(b)…
…compare(c)…這些構(gòu)造體的接口關(guān)系都相同(由實(shí)體號(hào)完成定義),但它們各自的名字不同(功能也允許不同,但一般避免這樣做)。以后再通過配置手段,可以在不同的版本中選擇不同的速度和規(guī)模。不同的構(gòu)造體可以分別編譯,這樣修改其中的一個(gè)并不影響另一個(gè)。
構(gòu)造體可以采用行為、數(shù)據(jù)流(有人稱作定時(shí))、結(jié)構(gòu)三種表達(dá)方式來描述。我們以同一個(gè)加法器設(shè)計(jì)為例,分別給出三種描述中的關(guān)鍵語句。
行為描述——定義出按時(shí)序描述的進(jìn)程(Process),對(duì)應(yīng)著時(shí)序語句。
如果用進(jìn)程描述加法器行為,則形如:
...Process....a<=b+c;endprocess;....--這里的b、c、a定義為算術(shù)運(yùn)算中的整數(shù)。
數(shù)據(jù)流描述—基本上是一種行為描述,又隱含著寄存器傳輸級(jí)(RTL,RegisterTransferLevel,更確切地應(yīng)該稱其為寄存器轉(zhuǎn)移級(jí))一級(jí)的邏輯結(jié)構(gòu)描述,對(duì)應(yīng)并發(fā)行為性語句。
此處用直接的邏輯表達(dá)式描述加法器的RTL級(jí)數(shù)據(jù)流:
...Sum<=bxorc;Carry<=bandc;....--這里是邏輯運(yùn)算,b、c、Sum、Carry定義為Bit量。
當(dāng)然,作為上述進(jìn)程的例子也同樣可以縮寫為數(shù)據(jù)流描述。一般而言,進(jìn)程比簡(jiǎn)單的并發(fā)語句能夠描述更復(fù)雜的功能。
結(jié)構(gòu)描述——定義了元件的內(nèi)部連接關(guān)系,對(duì)應(yīng)著結(jié)構(gòu)VHDL。
現(xiàn)在,用門級(jí)網(wǎng)表來描述加法器的結(jié)構(gòu):
...U0:XR2portmap(b,c,sum);...--這里是元件的結(jié)構(gòu)映射。
用結(jié)構(gòu)描述(元件及互連網(wǎng)表)風(fēng)格的優(yōu)點(diǎn)是便于實(shí)現(xiàn)層次化設(shè)計(jì)。
3.行為風(fēng)格構(gòu)造體
行為風(fēng)格(BehavioralStyle)適用于描述算法。下面舉例解釋,用行為風(fēng)格、數(shù)據(jù)流風(fēng)格和結(jié)構(gòu)風(fēng)格設(shè)計(jì)同一個(gè)等值比較器COMPARE,它比一般的大小比較器要簡(jiǎn)單。
它的實(shí)體號(hào)為
entityCOMPAREis
port(A,B:inbit;
C:outbit);
endCOMPARE;舉例之一:行為風(fēng)格構(gòu)造體——采用進(jìn)程設(shè)計(jì)
architectureAXW1ofCOMPAREis
begin
process(A,B)
begin
if(A=B)then
C<=‘1’after1ns;
else
C<=‘0’after2ns;
endif;
endprocess;
endAXW1;上述構(gòu)造體中包含一個(gè)進(jìn)程。進(jìn)程也是一種并發(fā)語句,只不過表達(dá)能力更強(qiáng)。在上述進(jìn)程中采用了信號(hào)賦值語句。
模擬時(shí)間是為了用計(jì)算機(jī)的EDA軟件模擬VHDL固有的并發(fā)特點(diǎn)而引入的概念,用以模擬真實(shí)硬件系統(tǒng)中事件發(fā)生的時(shí)刻。構(gòu)造體中的各進(jìn)程在模擬器的模擬時(shí)間刻度上并發(fā)運(yùn)行,例如1ns、2ns等,這樣地向前計(jì)時(shí)推進(jìn)。
各進(jìn)程的地位是相互獨(dú)立的,某一進(jìn)程的運(yùn)行可以與其他進(jìn)程有關(guān)。進(jìn)程間需要由信號(hào)進(jìn)行通信,信號(hào)用來傳送數(shù)據(jù)。進(jìn)程內(nèi)部可以有變量,但只限于局部變量、局部存儲(chǔ),不能用來向外傳出信息。1993版本的VHDL標(biāo)準(zhǔn)擴(kuò)展了共享變量,但一定要慎重使用。
上述process(A,B)中的A,B稱為敏感信號(hào)列表,進(jìn)程等待著輸入信號(hào)A、B的觸發(fā)。只要A或B變化,進(jìn)程就被激活;之后C又可能激活其他進(jìn)程n。
各進(jìn)程在行為描述中的信號(hào)變換關(guān)系如圖6-3所示。在設(shè)計(jì)行為風(fēng)格構(gòu)造體時(shí),需要注意的核心問題是(信號(hào)的)數(shù)據(jù)變換和定時(shí)。數(shù)據(jù)變換是指信號(hào)上的數(shù)據(jù)變換,定時(shí)是指信號(hào)間的時(shí)序。這些信號(hào)包括進(jìn)程間和進(jìn)程內(nèi)的信號(hào)。在自上而下設(shè)計(jì)的前期階段,適宜于采用這種行為風(fēng)格來“抽象”行為。圖6-3行為描述中的變換和定時(shí)
4.?dāng)?shù)據(jù)流風(fēng)格構(gòu)造體
數(shù)據(jù)流風(fēng)格(DataflowStyle)構(gòu)造體,按邏輯函數(shù)隨時(shí)間而變的信息或數(shù)據(jù)流行為建立模型寫成并發(fā)行為性語句(以并發(fā)信號(hào)賦值語句為主),例如實(shí)現(xiàn)加法器、比較器、譯碼器和基本邏輯門等??梢哉J(rèn)為,數(shù)據(jù)流風(fēng)格是行為風(fēng)格派生的。進(jìn)程可以完全取代這里的并發(fā)行為性語句來實(shí)現(xiàn)其并發(fā)性,所以說,并發(fā)行為性語句可以認(rèn)為是進(jìn)程的縮寫,但又隱含著RTL結(jié)構(gòu)描述。舉例之二:數(shù)據(jù)流風(fēng)格構(gòu)造體
采用同或門設(shè)計(jì)
architectureASJL2ofCOMPAREis
begin
C<=not(AxorB)after1ns;--括弧中xor要先執(zhí)行(數(shù)據(jù)流順序約定)
endASJL2;
后面的結(jié)構(gòu)風(fēng)格中將要用到許多底層元件,都可以用這種數(shù)據(jù)流風(fēng)格設(shè)計(jì)出來。為此,以底層元件異或門XR2和反相器INV的設(shè)計(jì)為例加以解釋。
底層元件異或門XR2設(shè)計(jì):
entityXR2is
generic(m:time:=1.0ns);
port(X,Y:inbit;
Z:outbit);
endXR2;
architectureDATAFLOWofXR2is
begin
Z<=XxorYafterm;
endDATAFLOW;
底層元件反相器INV設(shè)計(jì):
INVport(X:inbit;Z:outbit)請(qǐng)讀者參照上例自己編寫。
采用數(shù)據(jù)流風(fēng)格進(jìn)行設(shè)計(jì)的核心問題是更直接的(信號(hào))激勵(lì)—響應(yīng)模型,分清每個(gè)信號(hào)擔(dān)負(fù)的激勵(lì)和響應(yīng)角色;注意事件間的并發(fā)性和連環(huán)激勵(lì)的特點(diǎn)。
5.結(jié)構(gòu)風(fēng)格構(gòu)造體
舉例之三:結(jié)構(gòu)風(fēng)格構(gòu)造體
采用元件設(shè)計(jì)
architectureAJG3ofCOMPAREis
signalI:bit;
componentXR2port(X,Y:inbit;Z:outbit);
endcomponent;
componentINVport(X:inbit;Z:outbit);
endcomponent;
begin
U0:XR2portmap(A,B,I);
U1:INVportmap(I,C);
endAJG3;
其原理方框圖如圖6-4所示。圖6-4結(jié)構(gòu)描述中的元件和信號(hào)采用結(jié)構(gòu)風(fēng)格進(jìn)行設(shè)計(jì)的核心問題是元件、端口和信號(hào),這與電路的結(jié)構(gòu)網(wǎng)表直接對(duì)應(yīng)。設(shè)計(jì)時(shí)以元件為紐帶,每個(gè)元件都有端口,而端口本身也是信號(hào),同時(shí)它還要與其他的信號(hào)相連接,這就是網(wǎng)表概念的真諦——元件及其網(wǎng)絡(luò)連接。
上例中的元件有異或門XR2、反相器INV。信號(hào)線I將兩元件相連,在構(gòu)造體內(nèi)被說明為局部信號(hào)。此處構(gòu)造體中的元件說明也可以挪到集合包中,到這里再用Use語句打開。上面實(shí)例生成中的portmap指出端口映射關(guān)系。根據(jù)句法約定,這里還隱含地指出XR2、INV的設(shè)計(jì)實(shí)體放在庫WORK中。6.2.5配置說明
1.設(shè)計(jì)層次
如果XR2、INV編譯入庫,則它們?cè)谠O(shè)計(jì)COMPARE時(shí)可以被當(dāng)作元件使用。依此類推,在COMPARE的設(shè)計(jì)完成之后,COMPARE又可以被當(dāng)作元件用于更大規(guī)模的后續(xù)ALU的設(shè)計(jì)之中。舉例如下:entityALUis
port(opcode:...)
endALU;
architecturefirstofALUis
componentCOMPARE
port(a,b:inbit;
c:outbit);
endcomponent;
...
forU0:COMPAREuseentitywork.COMPARE(AJG3);
begin
U0:COMPAREportmap(s,d,q);
...
endfirst;上述component部分為元件COMPARE的元件說明,實(shí)例生成U0時(shí),用(s,d,q)對(duì)端口a、b、c進(jìn)行信號(hào)的port映射。
理解VHDL的設(shè)計(jì)層次(DesignHierarchy)是正確使用配置手段的基礎(chǔ)。這里,我們用兩種表達(dá)方式來表示設(shè)計(jì)的層次關(guān)系。
(1)用樹狀結(jié)構(gòu)圖示法給出構(gòu)造體和元件間的層次。如圖6-5的樹狀結(jié)構(gòu),同時(shí)給出并列的構(gòu)造體及其中合成用的不同元件。圖6-5構(gòu)造體及元件的樹狀結(jié)構(gòu)圖圖6-5中第二行的各構(gòu)造體之間是同質(zhì)可替代的并列候選候補(bǔ)關(guān)系;第三行的各元件(與實(shí)體號(hào)對(duì)應(yīng))之間是不可替代的有機(jī)異質(zhì)合成關(guān)系;第四行又是不同的構(gòu)造體;第五行又是元件……。記住,VHDL中的多層次主要是結(jié)構(gòu)關(guān)系的描述!
(2)用括弧嵌套給出元件間的層次。如:
{CPU(ALU(COPMARE<XR2,INV>))
注意,這里每一層次的元件實(shí)體號(hào)ALU、COMPARE、XR2、INV都可以對(duì)應(yīng)多個(gè)構(gòu)造體。
2.配置格式
在VHDL中,用配置說明(ConfigurationDeclaration)來選定不同的硬件設(shè)計(jì)組合。配置說明又被簡(jiǎn)稱為配置(Configuration)。實(shí)現(xiàn)選配的前提是一個(gè)實(shí)體號(hào)可能對(duì)應(yīng)有幾個(gè)構(gòu)造體,配置這一手段被用來搭配選取不同的構(gòu)造體以構(gòu)成不同的設(shè)計(jì)。一般,顯式配置總是從某一個(gè)庫中為某個(gè)實(shí)體號(hào)選配一個(gè)特定的構(gòu)造體。配置的句法格式為設(shè)同一實(shí)體號(hào)COMPARE有三個(gè)不同構(gòu)造體AXW1、ASJL2、AJG3,則配置可以選取其中之一,比如COMPARE(ASJL2)。
多個(gè)構(gòu)造體可以反映算法的不同或者是抽象的層次不同。例如:
configurationFast_OneofALUis
Forfirst --為ALU選定構(gòu)造體first,并進(jìn)一步配置
forU0:COMPAREuseentityWORK.COMPARE
(ASJL2);
endfor; --對(duì)其中U0的COMPARE進(jìn)行配置
EndFor;
endFast_One;上例給出實(shí)體號(hào)ALU的一種配置,取名為FAST_ONE。也可以說,本配置為實(shí)體號(hào)ALU配置了構(gòu)造體first,又為其中U0的元件COMPARE配置了ASJL2這一構(gòu)造體。
這里的Use子句,它識(shí)別庫的層次為:某個(gè)庫→某個(gè)實(shí)體號(hào)(元件,例如COMPARE)→某個(gè)對(duì)應(yīng)的構(gòu)造體。
配置主要用來進(jìn)行版本控制。上例中通過配置,獲得設(shè)計(jì)單元ALU的新版本FAST_ONE。上例為顯式配置,VHDL規(guī)定的默認(rèn)配置為最新編譯的構(gòu)造體。例如,如果在設(shè)計(jì)中要配置74系列,首要的是建造VHDL的各種元件庫,包括S、LS等。配置主要用于結(jié)構(gòu)描述風(fēng)格的設(shè)計(jì)當(dāng)中!6.2.6課程設(shè)計(jì)與練習(xí)
1.課堂練習(xí)題之A
設(shè)計(jì)一個(gè)一位全加器Full_adder.vhd,其模型框圖如圖6-6。圖6-6全加器模型框圖entityFull_adderis
generic(ts:time:=1.2ns;tc:time:=1.0ns);
port(x,y,Cin:inbit;Cout,Sum:outbit);
endFull_adder;
architectureBehaveofFull_adderis
begin
Sum<=xxoryxorCinafterts;
Cout<=(xandy)or(xandCin)or(yandCin)
aftertc;
end;附:一位全加器仿真批處理命令文件Full_adder.do。
wave/*
force/x10,025-r50
force/y10,050,1100,0300
force/Cin10,0200,1250,0350,1400,0600
run3000
viewwaveform
2.課堂練習(xí)題之B
用練習(xí)題之A的全加器做為元件,設(shè)計(jì)八位脈動(dòng)進(jìn)位加法器Adder8.vhd。八位加法器的外部接口模型框圖如圖6-7所示。圖6-7一般八位加法器模型entityAdder8is
port(A,B:inbit_vector(7downto0);
Cin:inbit;Cout:outbit;
Sum:outbit_vector(7downto0));
endAdder8;
architecturestructureofAdder8is
componentFull_adder
port(x,y,Cin:inbit;
Cout,Sum:outbit);
endcomponent;
signalC:bit_vector(7downto0);
begin
stages:foriin7downto0generateLowbit:ifi=0generate
Fa:Full_adderportmap(A(0),B(0),Cin,C(0),Sum(0));
endgenerate;
Otherbits:ifi/=0generate
Fa:Full_adderportmap(A(i),B(i),C(i-1),C(i),Sum(i));
endgenerate;
endgenerate;
Cout<=C(7);
end;附:八位脈動(dòng)進(jìn)位加法器命令文件Adder8.do。
wave/*
force/A16#340,16#4625-r50
force/B16#400,16#2050,16#30100,16#44300
force/Cin10,0200,1250,0350,1400,0600
run3000
viewwaveform
八位加法器脈動(dòng)進(jìn)位鏈如圖6-8所示。圖6-8八位加法器脈動(dòng)進(jìn)位鏈
6.3VHDL語言基礎(chǔ)知識(shí)
VHDL有以下幾種基本數(shù)據(jù)類型(參見附錄1)。
1.標(biāo)量(Scalar)類型
標(biāo)量數(shù)據(jù)是一個(gè)集合的概念。標(biāo)量型集合中的數(shù)據(jù),只具有單一值,該值無法再分解,包括實(shí)數(shù)、整數(shù)等。
2.復(fù)合(Composite)類型
復(fù)合型數(shù)據(jù)是由標(biāo)量組成的數(shù)組或記錄。這里的一個(gè)數(shù)據(jù)可以含有多個(gè)標(biāo)量值。
3.尋址(Access)類型
通過分配符(allocator)返回存取值來實(shí)現(xiàn)尋址。實(shí)際中這一類很少用。
4.文件(File)類型
VHDL中的文件存放在主機(jī)的系統(tǒng)當(dāng)中,文件類型實(shí)質(zhì)是定義出文件中所包含值的類型。
此外,還有子類型應(yīng)歸為相應(yīng)數(shù)據(jù)類型的附屬類型。下面,我們主要介紹標(biāo)量型和復(fù)合型兩種。
VHDL是強(qiáng)類型語言:整數(shù)1、實(shí)數(shù)1.0、位?'1'?的概念不一樣;40bit與8bit的總線不能相連;字符也不能相加等等。編譯器中的分析器將對(duì)設(shè)計(jì)文件進(jìn)行數(shù)據(jù)類型分析,指出設(shè)計(jì)中的語法錯(cuò)誤信息。6.3.1標(biāo)量類型數(shù)據(jù)
在定義數(shù)據(jù)類型時(shí),VHDL用不同的文字(Literal)來作為數(shù)據(jù)的標(biāo)識(shí)符號(hào)(非操作符)。下面給出各種標(biāo)量類型數(shù)據(jù)(ScalarType)的定義并加以解釋。
1.字符(Character)
最基本的標(biāo)量類型是字符(Character),它是一種預(yù)定義枚舉量。表示字符時(shí)要用單引號(hào)括起來,例如?'x'。只在這種表示字符的情況下,VHDL才對(duì)大寫小寫加以區(qū)別,這時(shí)?'a'?不同于'A'。字符可以是a~z中的字母;0~9中的數(shù)字;空白;特殊字符,如?'、$、@、%等,詳見IEEE-1076的集合包STANDARD。
2.Bit量(Bit)
Bit量(Bit)也是一種預(yù)定義枚舉量,包括?‘0’、‘1’?兩個(gè)數(shù)據(jù)。顯式說明為bit‘(’1‘)。
它可以用來描述總線中的一位,其初值為?’0‘。
Bit量可以組成復(fù)合型的位矢量,例如,用雙引號(hào)括起來的?"001100"?可以稱作是位矢量的一個(gè)聚集(Aggregate)或?qū)崿F(xiàn)樣本。
注:X代表十六進(jìn)制,O代表八進(jìn)制,B代表二進(jìn)制。這只是書寫形式而已,可以邏輯運(yùn)算。
3.布爾量(Boolean)
布爾量(Boolean)包括True(真)和False(假)兩個(gè)數(shù)據(jù),它是一個(gè)預(yù)定義二值枚舉量。
它可以在IF語句中被測(cè)試,關(guān)系操作?=、<=、>=、/=?都將產(chǎn)生布爾量結(jié)果。
信號(hào)或變量可以定義為布爾量,它與Bit量無關(guān),有的EDA工具可以轉(zhuǎn)換。
4.一般枚舉量(Enumeration)
把集合中的所有數(shù)據(jù)量窮舉出來,定義出一種新的數(shù)據(jù)類型,這種量稱之為枚舉量。前面的字符、Bit量(位)、布爾量均為一般枚舉量(EnumeratedType)的某種特例,稱之為預(yù)定義枚舉量類型,在IEEE-1076的STANDARD集合包中有完整的介紹。枚舉文字由字符或標(biāo)識(shí)符組成。字符、標(biāo)識(shí)符都是符號(hào),不是數(shù)值。一般枚舉類型需要枚舉說明,其句法格式為
typeidentifieris(enumeration_literal{,enumeration_literal});
例如:
typeTLLis(‘0’,‘1’);--字符
typeFLLis(‘x’,‘0’,‘1’,‘z’);
typetoolsis(hammer,saw,drill,wrench);--標(biāo)識(shí)符
5.整數(shù)量(Integer)
預(yù)定義整數(shù)量(Integer)與數(shù)學(xué)中的定義相同。在大多數(shù)VHDL實(shí)現(xiàn)中,機(jī)器內(nèi)部是用32位二進(jìn)制數(shù)來表示十進(jìn)制數(shù),可以表示的數(shù)值區(qū)間為
-(2**31-1)~(2**31-1)=-2147483647~+2147483647
在實(shí)際設(shè)計(jì)中直接書寫為十進(jìn)制數(shù),例如:+1,862,
-257,+15,…。
整數(shù)不同于位矢量,它不能按位去訪問;表示整數(shù)不用加雙引號(hào)。不能進(jìn)行邏輯運(yùn)算;但可以進(jìn)行算術(shù)運(yùn)算。需要進(jìn)行按位操作時(shí),先要進(jìn)行類型轉(zhuǎn)換。自然數(shù)和正整數(shù)都是整數(shù)的子集。整數(shù)類型說明舉例:
typeword_indexisrange31downto0;
6.實(shí)數(shù)量(Real)
在大多數(shù)VHDL實(shí)現(xiàn)中,實(shí)數(shù)量(Real)的區(qū)間為(-1.0E+38)~(+1.0E+38)。實(shí)數(shù)量又稱為浮點(diǎn)數(shù)(FloatingPointType)。
預(yù)定義實(shí)數(shù)量可以有正數(shù)、負(fù)數(shù)、小數(shù)點(diǎn)及指數(shù)表示,例如:-1.0,+2.35,36.0,-1.0E+28。
實(shí)數(shù)量可進(jìn)行四則運(yùn)算,用于算法研究或方案實(shí)驗(yàn)比較方便。但是在算法研究和設(shè)計(jì)仿真完成之后,正式綜合之前需要再改用定點(diǎn)進(jìn)行四則運(yùn)算。注:VHDL句法中也采用了巴科斯范式(BNF-BackusNaurForm,一種用來定義程序語言句法的事實(shí)上的標(biāo)準(zhǔn))表示法。以數(shù)的表示為例,可以選擇二進(jìn)制到十六進(jìn)制中的一種。在各種基中,十進(jìn)制是默認(rèn)的,表示形式上可以省略。其余,還有2、4、8、16等。每種進(jìn)制對(duì)應(yīng)一個(gè)基,例如十進(jìn)制的基就是10,代表一位與附近的一位是10倍的關(guān)系,二進(jìn)制的基就是2。注意,這里表示不同的基本身是用十進(jìn)制表示的。整數(shù)和實(shí)數(shù)的BNF表示如下:
以基表示的整數(shù)、實(shí)數(shù)::=基#基于基的整數(shù)[.基于基的整數(shù)]#[指數(shù)]
上式中還有指數(shù)。指數(shù)部分可以繼續(xù)展開為
指數(shù)::=E[+]整數(shù)|E-整數(shù)
其中的整數(shù)用十進(jìn)制表示。
例如:
整數(shù)255可以表示為2#1111--_1111#或者16#FF#。這里數(shù)字間所加的下劃線“_”是為了閱讀的方便。
實(shí)數(shù)4095.0可以表示為16#F.FF#E+2或者2#1.1111_1111_111#E11。整數(shù)和實(shí)數(shù)之間可以用類型標(biāo)記的方法進(jìn)行轉(zhuǎn)換。例如:
variablei:integer;
variabler:real;
則下列的賦值語句可以實(shí)現(xiàn)轉(zhuǎn)換:
i:=integer(r);
r:=real(i);
7.物理量(Physical)
物理量(Physical)是某一種物理測(cè)量值的度量,它始終是某一物理單位量的整數(shù)倍。例如,預(yù)定義時(shí)間物理量:
1sec,60sec,1min
時(shí)間單位有fs、ps、ns、us、ms、sec、min、h。例如:
10ns,100μs,6.3ns
其中10是整數(shù);6.3是實(shí)數(shù)。在大多數(shù)VHDL實(shí)現(xiàn)中,時(shí)間的區(qū)間為
-(2**31-1)~(2**31-1)=-2147483647~+2147483647
除了時(shí)間物理量之外,允許自定義其他物理量,例如電流。
實(shí)數(shù)、整數(shù)、物理量又統(tǒng)稱為數(shù)值型,它們都可以進(jìn)行四則運(yùn)算。
8.區(qū)間約束(RangeConstraint)
采用VHDL進(jìn)行設(shè)計(jì)時(shí),經(jīng)常需要對(duì)作用范圍進(jìn)行限定,這就是區(qū)間約束(RangeConstraint)。
其句法為
rangelow_valtohigh_val或高值downto低值
例如:
integerrange10downto1
realrange1.0to10.0若對(duì)整數(shù)integer的區(qū)間需要推遲到以后再確定,則采用符號(hào)<>,寫作如下形式:
integerrange<>
備注:這里主要針對(duì)整數(shù)、實(shí)數(shù)這種開放式結(jié)構(gòu)型數(shù)據(jù)而言。所謂開放,就是指這里事先對(duì)區(qū)間沒有約束,允許以后重新定義。
9.子類型(Subtype)說明
子類型(Subtype)說明給出某數(shù)據(jù)類型的一個(gè)子集,并再起一個(gè)名字。例如:
subtypeRegisterisbit_vector(7downto0);6.3.2復(fù)合類型數(shù)據(jù)
復(fù)合(Composite)類型數(shù)據(jù)包括數(shù)組(矢量,Array——同種復(fù)合型)以及記錄(Record——異種復(fù)合型)兩種。
1.?dāng)?shù)組(Array)
數(shù)組(Array)可以組成線性空間,一維、二維或多維,位矢量就是一維數(shù)組。可以定義實(shí)數(shù)數(shù)組和整數(shù)數(shù)組;也可以有約束(給出定界)或未約束(區(qū)間及走向待定<>)。
數(shù)組說明用type語句,句法為
typearray_nameisarray[index_constraint]ofelement_type;
上述index_constraint就是對(duì)下標(biāo)的約束。例如:
typeword8isarray(1to8)ofbit;
typewordisarray(integerrange<>)ofbit;
說明之后就可以用于變量或信號(hào)說明。例如:
variablemystuff:word8;
variableyourstuff:word(1to10);
前述的<>表示推遲約束,推遲到word(1to10)才說明。
內(nèi)建的STANDARD中預(yù)定義未約束數(shù)組位矢量,將來由用戶再給出約束:
typebit_vectorisarray(naturalrange<>)ofbit;
當(dāng)用戶使用時(shí),則可以寫成:
variablec:bit_vector(0to3);
比如,c:=“1010”;(此時(shí)c(1)=‘0’)
將上述數(shù)組用于描述總線很方便。字符可以組成一維數(shù)組,稱之為字符數(shù)組,是復(fù)合型數(shù)據(jù)的一種。使用較多的字符串及標(biāo)識(shí)符,可以認(rèn)為是一維字符數(shù)組某一個(gè)特定的實(shí)現(xiàn)樣本,在此做進(jìn)一步注釋:
(1)字符數(shù)組的實(shí)現(xiàn)樣本稱為字符串,可用雙引號(hào)括起來。例如:“holdtimeoutofrange”。一般的字符串屬于復(fù)合型數(shù)據(jù)中一維數(shù)組的一種實(shí)現(xiàn)樣本。
(2)標(biāo)識(shí)符是為了設(shè)計(jì)方便設(shè)計(jì)師自編的一種特殊專用字符串,它被作為VHDL中源設(shè)計(jì)單元或客體等項(xiàng)目命名用的符號(hào)。其編制規(guī)定如下:①標(biāo)識(shí)符中第一個(gè)字符為字母。
②其余字符可以是字母或數(shù)字。
③標(biāo)識(shí)符中可以加有下劃線,但不能有兩個(gè)連著的下劃線。
④標(biāo)識(shí)符中不能有空格。
⑤?VHDL對(duì)標(biāo)識(shí)符不區(qū)分大小寫。
⑥標(biāo)識(shí)符不加引號(hào)。
2.記錄(Record)
對(duì)于記錄(Record)的概念,下面以記錄“指令”為例加以說明。
枚舉型指令碼∪整數(shù)地址→其并集定義一個(gè)記錄“指令”;而指令又可以用來定義“寄存器組”。例如:
typeOpcodeis--Opcode(枚舉量)和Address(整數(shù))是異種標(biāo)量
(add,add_with_carry,......);
typeAddressisrange16#0000#to16#FFFF#;這兩個(gè)type語句用來先說明所用標(biāo)量數(shù)據(jù)類型。
typeInstructionis
record--Instruction是復(fù)合型(異種數(shù)據(jù))
Opcode_field:Opcode;
Operand_1:Address;
Operand_2:Address;
endrecord;6.3.3客體
1.簡(jiǎn)介
在VHDL中,凡是可以擁有數(shù)據(jù)的某載體就稱之為客體(Object,對(duì)象)。它所荷載的數(shù)據(jù)類型決定了該客體所能參與的運(yùn)算??腕w主要有三種:信號(hào)(Signal)、變量(Variable)、常數(shù)(Constant)。
(1)信號(hào)——按模擬時(shí)間對(duì)信號(hào)進(jìn)行賦值,它對(duì)應(yīng)于硬件互連線,需要到某一時(shí)刻才獲得真實(shí)的當(dāng)前值。
(2)常數(shù)——屬于一次性賦值,例如電源、地。
(3)變量——可以立即獲得真實(shí)當(dāng)前值,與對(duì)應(yīng)硬件不直接對(duì)應(yīng),是一種局部量(也可以不斷變化)。
其他從屬的客體有:端口信號(hào)、傳遞環(huán)境信息的類屬(比較特殊的常數(shù))、參數(shù)(在子程序中說明,其中函數(shù)中的參數(shù)是常數(shù),過程(Procedure)中的參數(shù)可以是任一客體等)、下標(biāo)(循環(huán)或生成語句中的次數(shù))等。
2.客體類型說明
在使用客體之前,對(duì)于客體類型要先行說明,包括:
1)常數(shù)說明(ConstantDeclaration)
其句法為
constantidentifier:type_indication[:=expression];
名稱類型數(shù)值例如:
constantVCC:real:=4.5;
名稱類型數(shù)值
其中constant為保留字。
它可以在實(shí)體號(hào)、集合包或子程序中說明,原則是誰用誰說明,即在說明時(shí)要考慮常數(shù)的使用場(chǎng)所。
2)變量說明
變量用于賦給進(jìn)程中變化的值,賦值立即生效。
變量使用前必須先說明,其句法為
variableidentifier:type_indication[constraint][:=expression];
例如:
variableCOUNT:integerrange0to99:=0;
名稱類型區(qū)間初值
變量可以是標(biāo)量或數(shù)組,只能在進(jìn)程或子程序中加以說明。
在模擬時(shí)作為局部數(shù)據(jù)記憶單元對(duì)待;變量不能在進(jìn)程間通信。
3)信號(hào)說明
信號(hào)是物理硬件互連線或總線的抽象,可以在實(shí)體號(hào)、構(gòu)造體、集合包中說明,可用于全局通信。
信號(hào)說明的句法為
signalidentifier:type_indication[constraint][:=expression];
例如:
signalS:bit:=‘1’;
名稱類型初值
signalxyz:bit;
xyz<='1'after5ns;
其中<=表示是信號(hào)賦值。
(1)在進(jìn)程中不能說明信號(hào),在進(jìn)程中可以使用信號(hào)。
(2)進(jìn)程中的信號(hào)賦值要等待WAIT的執(zhí)行。
當(dāng)行為風(fēng)格用到信號(hào)概念時(shí)強(qiáng)調(diào)的是變化,當(dāng)結(jié)構(gòu)風(fēng)格使用信號(hào)時(shí)強(qiáng)調(diào)的是固定的互連關(guān)系。6.3.4操作符與表達(dá)式
1.簡(jiǎn)介
由操作符、操作數(shù)組成的表達(dá)式是實(shí)現(xiàn)數(shù)據(jù)變換的武器和工具。
(1)表達(dá)式(Expression)——操作符、操作數(shù)組成的數(shù)學(xué)式,定義操作處理,例如“A+B”。
(2)操作符(Operator)——指定對(duì)操作數(shù)所執(zhí)行的運(yùn)算,例如式中的“+”。
(3)操作數(shù)(Operand)——被運(yùn)算的客體數(shù)據(jù),其類型與操作符的要求要一致,例如式中的“A”和“B”。
2.操作符分類(黑體表示的為1993版新增)
(1)邏輯(Logical)——not(一元),and,or,nand,nor,xor,xnor。
(2)關(guān)系(Relational)——=,/=,<,<=,>,>=。
(3)移位(Shift)——SLL,SLA,SRL,SRA,ROL,ROR。
(4)算術(shù)(Arithmetic)——+,-,abs(一元正、負(fù)、絕對(duì)值);
+,-(二元);
*,/;
mod(取模),rem(取余),**(指數(shù))。
(5)并置(Concatenation)——&。
當(dāng)然,從原理上講,算術(shù)運(yùn)算也可以寫在數(shù)據(jù)流風(fēng)格語句中。但是,在綜合時(shí),這樣的語句離RTL的門級(jí)實(shí)現(xiàn)可能要更遠(yuǎn)一點(diǎn)。
3.操作符解釋
1993年版本VHDL的優(yōu)先級(jí)如下(由低到高,黑體表示的為1993版新增):
and,or,nand,nor,xor,xnor;
=,/=,<,<=,>,>=;
SLL,SLA,SRL,SRA,ROL,ROR;
+,-(二元);
+,-(一元);
*,/,mod,rem;
NOT,**,ABS;
&。操作符分為五大級(jí),算術(shù)又分四小級(jí),優(yōu)先級(jí)由低到高(兩個(gè)版本的標(biāo)準(zhǔn)略有不同)。同一級(jí)內(nèi)優(yōu)先級(jí)相同;可以采用括號(hào)來確定優(yōu)先級(jí)。二元操作時(shí)要求數(shù)據(jù)類型應(yīng)該相同,它們對(duì)數(shù)據(jù)的要求如下:
(1)邏輯——Bit,boolean,及其一維數(shù)組;二元邏輯操作除XOR外都是短路操作。對(duì)所謂短路概念,這里需要做一解釋。以或運(yùn)算“or”為例,只要操作數(shù)有一個(gè)1,結(jié)果即可確定。
(2)關(guān)系——=,/=的操作數(shù)可以是任一類型;其余關(guān)系符的操作數(shù)應(yīng)是標(biāo)量,包括枚舉量和整數(shù)量,或一維離散數(shù)組。運(yùn)算結(jié)果總為布爾量。
(3)移位——SLL,SLA,SRL,SRA,ROL,ROR。其中S…為左右、算術(shù)邏輯移,RO…為循環(huán)左右移。
(4)算術(shù)——只可以是數(shù)值型(整數(shù)、實(shí)數(shù)、物理量)。其中:指數(shù)操作的左操作數(shù)為整數(shù)、實(shí)數(shù);右操作數(shù)為整數(shù)。除此之外的所有二元操作其操作數(shù)都要相同。
(5)并置——操作數(shù)是一維數(shù)組或其元素。例如:
constants1:string:=“ABC”;
constants2:string:=“DEF”;
constants3:string:=s1&s2;
其結(jié)果將生成?"ABCDEF"。
4.補(bǔ)充解釋
1)取余(AREMB)定義
余數(shù)應(yīng)能滿足
AREMB=A-(A/B)*B
其(AREMB)的符號(hào)與A相同(節(jié)“余”歸己),其絕對(duì)值小于B的絕對(duì)值。
例如:
7REM5=2,7REM(-5)=2
2)取模(AMODB)定義
存在某一整數(shù)N,使得
AMODB=A-B*N
其(AMODB)的符號(hào)與B相同,其絕對(duì)值小于B的絕對(duì)值。
例如:
7MOD5=2,7MOD(-5)=-3(可以驗(yàn)證一下!)6.3.5預(yù)定義屬性
預(yù)定義屬性(Attribute)主要包括類型、子類型、子程序、客體的屬性。元件、語句標(biāo)號(hào)也可以有屬性。使用屬性的目的通常是按約定返回并獲取有關(guān)數(shù)據(jù)。
(1)標(biāo)量類型屬性:LEFT,RIGHT,LOW,HIGH,Succ,Pred,Leftof,Rightof,LENGTH,Range返回值等;
(2)函數(shù)類屬性:可劃分為類型屬性、數(shù)組屬性和信號(hào)屬性三種。
(3)信號(hào)屬性:四種主要的(其中?‘Event很有用)信號(hào)屬性如下。
S’Active
S‘QuietS’Event
S‘Stable
有事務(wù)靜止有事件穩(wěn)定任何一次信號(hào)賦值,都將產(chǎn)生一個(gè)事務(wù)Transcation。這時(shí)的S‘Transcation是一個(gè)Bit量信號(hào),在每一個(gè)模擬循環(huán)后它都將翻轉(zhuǎn)一次。
如果這次信號(hào)賦值使信號(hào)值發(fā)生變化,那么這又是一次事件,S’Event為真。
其中S'Event、S'Active屬于函數(shù)信號(hào)屬性,可用于函數(shù)或過程中。其他的S'Quiet、S'Stable、S'Traqnscation屬于信號(hào)類屬性,不能用于子程序內(nèi)部。6.3.6課程設(shè)計(jì)與練習(xí)
全部采用VHDL設(shè)計(jì),編制一位全加器、激勵(lì)器及測(cè)試平臺(tái)的完整示例。圖6-9給出了全加器的結(jié)構(gòu)。圖6-9由半加器構(gòu)成全加器
(1)由半加器構(gòu)成全加器的原始設(shè)計(jì)(OriginalDesign)——
addw1.vhd。
Libraryieee;
Useieee.std_logic_1164.all;
Entityfull_adderis
Generic(tpd:time:=10ns);
Port(x,y,c_in:instd_logic;
sum,c_out:outstd_logic);
Endfull_adder;
Architecturedataflow_viewoffull_adderis
Signals:std_logic;
Begin
s<=xxoryaftertpd;
sum<=sxorc_inaftertpd;
c_out<=(xandy)or(sandc_in)after2*tpd;--sandc_in等效于
Enddataflow_view;--(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 16830:2025 EN Specification of bamboo drinking straws
- 江西師范大學(xué)科學(xué)技術(shù)學(xué)院《建筑設(shè)備施工組織設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南中醫(yī)藥大學(xué)湘杏學(xué)院《水電站建筑物》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南工藝美術(shù)職業(yè)學(xué)院《多媒體信息處理與檢索技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 衡陽科技職業(yè)學(xué)院《統(tǒng)計(jì)軟件操作》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江師范大學(xué)《能源與動(dòng)力工程測(cè)試技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長(zhǎng)春師范大學(xué)《衛(wèi)生檢驗(yàn)綜合技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 榆林職業(yè)技術(shù)學(xué)院《太陽能熱利用技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 使用二手設(shè)備節(jié)約資本開支
- 實(shí)踐學(xué)習(xí)實(shí)施報(bào)告
- 特色酒吧方案計(jì)劃書
- 重慶市南開中學(xué)2023-2024學(xué)年中考三模英語試題含答案
- 2023年上海高中物理合格考模擬試卷一含詳解
- 2022版義務(wù)教育(地理)課程標(biāo)準(zhǔn)(附課標(biāo)解讀)
- 2024年滑雪用品行業(yè)分析報(bào)告及未來發(fā)展趨勢(shì)
- 經(jīng)方治療腦梗塞的體會(huì)
- 新版DFMEA基礎(chǔ)知識(shí)解析與運(yùn)用-培訓(xùn)教材
- 制氮機(jī)操作安全規(guī)程
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國演義》中人物性格探析研究性課題報(bào)告
評(píng)論
0/150
提交評(píng)論