版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章VHDL編程基礎(chǔ)3.1概述
3.2VHDL程序基本結(jié)構(gòu)
3.3VHDL語言要素
3.4VHDL順序語句
3.5VHDL并行語句
3.6子程序
3.7程序包
3.8VHDL描述風(fēng)格
3.9基本邏輯電路設(shè)計
3.10狀態(tài)機(jī)的VHDL設(shè)計
3.1概述3.1.1常用硬件描述語言簡介常用硬件描述語言有VHDL、Verilog和ABEL語言。VHDL起源于美國國防部的VHSIC,Verilog起源于集成電路的設(shè)計,ABEL則來源于可編程邏輯器件的設(shè)計。下面從使用方面將三者進(jìn)行對比。
(1)邏輯描述層次:一般的硬件描述語言可以在三個層次上進(jìn)行電路描述,其層次由高到低依次可分為行為級、RTL級和門電路級。VHDL語言是一種高級描述語言,適用于行為級和RTL級的描述,最適于描述電路的行為;Verilog語言和ABEL語言是一種較低級的描述語言,適用于RTL級和門電路級的描述,最適于描述門級電路。(2)設(shè)計要求:VHDL進(jìn)行電子系統(tǒng)設(shè)計時可以不了解電路的結(jié)構(gòu)細(xì)節(jié),設(shè)計者所做的工作較少;Verilog和ABEL語言進(jìn)行電子系統(tǒng)設(shè)計時需了解電路的結(jié)構(gòu)細(xì)節(jié),設(shè)計者需做大量的工作。
(3)綜合過程:任何一種語言源程序,最終都要轉(zhuǎn)換成門電路級才能被布線器或適配器所接受。因此,VHDL語言源程序的綜合通常要經(jīng)過行為級→RTL級→門電路級的轉(zhuǎn)化,VHDL幾乎不能直接控制門電路的生成。而Verilog語言和ABEL語言源程序的綜合過程要稍簡單,即經(jīng)過RTL級→門電路級的轉(zhuǎn)化,易于控制電路資源。(4)對綜合器的要求:VHDL描述語言層次較高,不易控制底層電路,因而對綜合器的性能要求較高,Verilog和ABEL對綜合器的性能要求較低。
(5)支持的EDA工具:支持VHDL和Verilog的EDA工具很多,但支持ABEL的綜合器僅僅Dataio一家。
(6)國際化程度:VHDL和Verilog已成為IEEE標(biāo)準(zhǔn),而ABEL正朝國際化標(biāo)準(zhǔn)努力。3.1.2VHDL的優(yōu)點
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,誕生于1982年。1987年底,VHDL被IEEE(TheInstituteofElectricalandElectronicsEngineers)和美國國防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語言。自IEEE公布了VHDL的標(biāo)準(zhǔn)版本(IEEE-1076)之后,各EDA公司相繼推出了自己的VHDL設(shè)計環(huán)境,或宣布自己的設(shè)計工具可以和VHDL接口。此后VHDL在電子設(shè)計領(lǐng)域得到了廣泛的接受,并逐步取代了原有的非標(biāo)準(zhǔn)硬件描述語言。1993年,IEEE對VHDL進(jìn)行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴(kuò)展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標(biāo)準(zhǔn)的1076-1993版本?,F(xiàn)在,VHDL和Verilog作為IEEE的工業(yè)標(biāo)準(zhǔn)硬件描述語言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實上的通用硬件描述語言。有專家認(rèn)為,在新的世紀(jì)中,VHDL與Verilog語言將承擔(dān)起幾乎全部的數(shù)字系統(tǒng)設(shè)計任務(wù)。VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風(fēng)格與句法十分類似于一般的計算機(jī)高級語言。VHDL的程序結(jié)構(gòu)特點是將一項工程設(shè)計,或稱設(shè)計實體(可以是一個元件、一個電路模塊或一個系統(tǒng))分成外部(或稱可視部分,即端口)和內(nèi)部(或稱不可視部分),即設(shè)計實體的內(nèi)部功能和算法完成部分。在對一個設(shè)計實體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計就可以直接調(diào)用這個實體。這種將設(shè)計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計的基本點。應(yīng)用VHDL進(jìn)行工程設(shè)計的優(yōu)點是多方面的,具體如下:(1)與其他的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力。強(qiáng)大的行為描述能力是避開具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計大規(guī)模電子系統(tǒng)的重要保證。就目前流行的EDA工具和VHDL綜合器而言,將基于抽象的行為描述風(fēng)格的VHDL程序綜合成為具體的FPGA和CPLD等目標(biāo)器件的網(wǎng)表文件已不成問題,只是在綜合與優(yōu)化效率上略有差異。
(2)VHDL具有豐富的仿真語句和庫函數(shù),使得在任何大系統(tǒng)的設(shè)計早期,就能查驗設(shè)計系統(tǒng)的功能可行性,隨時可對系統(tǒng)進(jìn)行仿真模擬,使設(shè)計者對整個工程的結(jié)構(gòu)和功能可行性做出判斷。(3)VHDL語句的行為描述能力和程序結(jié)構(gòu),決定了它具有支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用功能。符合市場需求的大規(guī)模系統(tǒng)高效、高速的完成必須有多人甚至多個開發(fā)組共同并行工作才能實現(xiàn),VHDL中設(shè)計實體的概念、程序包的概念、設(shè)計庫的概念為設(shè)計的分解和并行工作提供了有利的支持。(4)用VHDL完成一個確定的設(shè)計,可以利用EDA工具進(jìn)行邏輯綜合和優(yōu)化,并自動把VHDL描述設(shè)計轉(zhuǎn)變成門級網(wǎng)表(根據(jù)不同的實現(xiàn)芯片)。這種方式突破了門級設(shè)計的瓶頸,極大地減少了電路設(shè)計的時間和可能發(fā)生的錯誤,降低了開發(fā)成本。利用EDA工具的邏輯優(yōu)化功能,可以自動地把一個綜合后的設(shè)計變成一個更小、更高速的電路系統(tǒng)。反過來,設(shè)計者還可以容易地從綜合和優(yōu)化的電路獲得設(shè)計信息,返回去更新修改完善VHDL設(shè)計描述。(5)VHDL對設(shè)計的描述具有相對獨立性。設(shè)計者可以不懂硬件的結(jié)構(gòu),也不必管最終設(shè)計的目標(biāo)器件是什么,而進(jìn)行獨立的設(shè)計。正因為VHDL的硬件描述與具體的工藝技術(shù)和硬件結(jié)構(gòu)無關(guān),所以VHDL設(shè)計程序的硬件實現(xiàn)目標(biāo)器件有廣闊的選擇范圍,其中包括各種系列的CPLD、FPGA及各種門陣列器件。
(6)由于VHDL具有類屬描述語句和子程序調(diào)用等功能,對于完成的設(shè)計,在不改變源程序的條件下,只需改變類屬參量或函數(shù),就能輕易地改變設(shè)計的規(guī)模和結(jié)構(gòu)。3.1.3VHDL程序設(shè)計約定為了便于程序的閱讀和調(diào)試,本書對VHDL程序設(shè)計特作如下約定:
(1)語句結(jié)構(gòu)描述中方括號“[]”內(nèi)的內(nèi)容為可選內(nèi)容。
(2)對于VHDL的編譯器和綜合器來說,程序文字的大小寫是不加區(qū)分的。本書一般使用大寫。
(3)程序中的注釋使用雙橫線“--”。在VHDL程序的任何一行中,雙橫線“--”后的文字都不參加編譯和綜合。(4)為了便于程序的閱讀與調(diào)試,書寫和輸入程序時,使用層次縮進(jìn)格式,同一層次的對齊,低層次的較高層次的縮進(jìn)兩個字符。
(5)考慮到MAX+plusII要求源程序文件的名字與實體名必須一致,因此為了使同一個VHDL源程序文件能適應(yīng)各個EDA開發(fā)軟件上的使用要求,建議各個源程序文件的命名均與其實體名一致。3.2VHDL程序基本結(jié)構(gòu)3.2.1VHDL程序設(shè)計舉例當(dāng)我們使用一個集成電路芯片時,根據(jù)數(shù)字電子技術(shù)的知識,至少需要了解三個方面的信息:①該芯片符合什么規(guī)范,是誰生產(chǎn)的,用戶是否認(rèn)可;②該芯片有多少管腳,每個管腳是輸入還是輸出,每個管腳對輸入/輸出有什么要求;③該芯片各管腳之間的關(guān)系,以及能完成什么邏輯功能。
相應(yīng)地,當(dāng)使用VHDL語言設(shè)計一個硬件電路時,至少需要描述三個方面的信息:①設(shè)計是在什么規(guī)范范圍內(nèi)進(jìn)行,即此設(shè)計符合哪個設(shè)計規(guī)范才能得到用戶的認(rèn)可,這就是庫、程序包使用說明;②所設(shè)計的硬件電路與外界的接口信號,這就是設(shè)計實體的描述;③所設(shè)計的硬件電路的內(nèi)部組成以及內(nèi)部工作的邏輯功能,這就是該設(shè)計實體對應(yīng)的結(jié)構(gòu)體描述。其中,庫、程序包使用說明用于打開(調(diào)用)本設(shè)計實體將要用到的庫、程序包;實體描述用于描述該設(shè)計實體與外界的接口信號說明,是可視部分;結(jié)構(gòu)體描述用于描述該設(shè)計實體內(nèi)部的組成及內(nèi)部工作的邏輯關(guān)系,是不可視部分?!纠?.1】74LS00的VHDL設(shè)計過程。
1.設(shè)計思路根據(jù)數(shù)字電子技術(shù)的知識,我們知道74LS00是一個四2輸入與非門,亦即該芯片有四個2輸入與非門組成,因此設(shè)計時可先設(shè)計一個2輸入與非門MYNAND2,如圖3.1(a)所示,再由四個2輸入與非門構(gòu)成一個整體MY74LS00,如圖3.1(b)所示。圖3.1MY74LS00的設(shè)計過程示意圖2.VHDL源程序1)?2輸入與非門MYNAND2的邏輯描述--IEEE庫及其程序包的使用說明LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--實體MYNAND2的說明ENTITYMYNAND2ISPORT(A,B:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDENTITYMYNAND2;--實體MYNAND2的結(jié)構(gòu)體ART1的說明ARCHITECTUREART1OFMYNAND2ISBEGINY<=ANANDB;ENDARCHITECTUREART1;2)?MY74LS00的邏輯描述--IEEE庫及其程序包的使用說明LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--實體MY74LS00的說明ENTITYMY74LS00ISPORT(A1,B1,A2,B2,A3,B3,A4,B4:INSTD_LOGIC;Y1,Y2,Y3,Y4:OUTSTD_LOGIC);ENDENTITYMY74LS00;--實體MY74LS00的結(jié)構(gòu)體ART2的說明ARCHITECTUREART2OFMY74LS00IS--元件調(diào)用聲明
COMPONENTMYNAND2ISPORT(A,B:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDCOMPONENTMYNAND2;--元件連接說明
BEGINU1:MYNAND2PORTMAP(A=>A1,B=>B1,Y=>Y1);U2:MYNAND2PORTMAP(A=>A2,B=>B2,Y=>Y2);U3:MYNAND2PORTMAP(A3,B3,Y3);U4:MYNAND2PORTMAP(A4,B4,Y4);ENDARCHITECTUREART2;
3.說明與分析
(1)整個設(shè)計包括兩個設(shè)計實體,分別為MYNAND2和MY74LS00,其中實體MY74LS00為頂層實體。兩個設(shè)計實體均包括三個組成部分:庫、程序包使用說明,實體說明和結(jié)構(gòu)體說明。這兩個設(shè)計實體既可以作為一個整體進(jìn)行編譯、綜合與存檔,也可以各自進(jìn)行獨立編譯、獨立綜合與存檔,或被其他的電路系統(tǒng)所調(diào)用。
(2)實體MYNAND2定義了2輸入與非門MYNAND2的引腳信號A、B(輸入)和Y(輸出),其對應(yīng)的結(jié)構(gòu)體ART1描述了輸入與輸出信號間的邏輯關(guān)系,即將輸入信號A、B與非后傳給輸出信號端Y,由此實體和結(jié)構(gòu)體描述一個完整的2輸入與非門元件。
(3)實體MY74LS00及對應(yīng)的結(jié)構(gòu)體ART2描述了一個如圖3.1(b)所示的四2輸入與非門。由其結(jié)構(gòu)體的描述可以看到,它是由四個2輸入與非門構(gòu)成的。
(4)在MY74LS00接口邏輯VHDL描述中,根據(jù)圖3.1(b)右側(cè)的MY74LS00的原理圖,實體MY74LS00定義了引腳的端口信號屬性和數(shù)據(jù)類型。其中,A1、B1、A2、B2、A3、B3、A4、B4分別為8個輸入端,Y1、Y2、Y3、Y4為輸出端。其對應(yīng)的結(jié)構(gòu)體ART2的功能是利用COMPONENT聲明語句和COMPONENT例化語句將上面由四個實體MYNAND2描述的獨立器件,按照圖3.1(b)MY74LS00內(nèi)部邏輯原理圖中的接線方式連接起來。(5)在結(jié)構(gòu)體ART2中,COMPONENT→ENDCOMPONENT語句結(jié)構(gòu)對所要調(diào)用的MYNAND2元件作了聲明。接下去的“PORTMAP(…)”語句稱為元件例化語句(COMPONENTINSTANTIATION)。所謂例化,在電路板上,相當(dāng)于往上裝配元器件;在邏輯原理圖上,相當(dāng)于從元件庫中取了一個元件符號放在電路原理圖上,并對此符號的各引腳進(jìn)行連線。例化也可理解為元件映射或元件連接,MAP是映射的意思。例如,語句“U2:MYNAND2PORTMAP(A=>A2,B=>B2,Y=>Y2)”表示將實體MYNAND2描述的元件U2的引腳信號A、B和Y分別連向外部信號A2、B2和Y2。符號“=>”表示信號連接。(6)實體MY74LS00引導(dǎo)的邏輯描述也是由三個主要部分構(gòu)成的,即庫、程序包的使用說明,實體說明和結(jié)構(gòu)體說明。從表面上看來,庫、程序包的說明部分僅包含一個IEEE標(biāo)準(zhǔn)庫和打開的IEEE.STD_LOGIC_1164.ALL程序包。但實際上,從結(jié)構(gòu)體的描述中可以看出,其對外部的邏輯有調(diào)用的操作,這類似于對庫或程序包中的內(nèi)容作了調(diào)用。因此,庫結(jié)構(gòu)部分還應(yīng)將上面的與非門的VHDL描述包括進(jìn)去,作為工作庫中的兩個待調(diào)用的元件。由此可見,庫結(jié)構(gòu)也是VHDL程序的重要組成部分。3.2.2VHDL程序的基本結(jié)構(gòu)一個相對完整的VHDL程序(或稱為設(shè)計實體)具有如圖3.2所示的比較固定的結(jié)構(gòu),即至少應(yīng)包括三個基本組成部分:庫、程序包使用說明,實體描述和實體對應(yīng)的結(jié)構(gòu)體描述。其中庫、程序包使用說明用于打開(調(diào)用)本設(shè)計實體將要用到的庫、程序包,實體描述用于描述該設(shè)計實體與外界的接口信號說明,結(jié)構(gòu)體描述用于描述該設(shè)計實體內(nèi)部的組成及內(nèi)部工作的邏輯關(guān)系。在一個實體中,可以含有一個或一個以上的結(jié)構(gòu)體,而在每一個結(jié)構(gòu)體中又可以含有一個或多個進(jìn)程以及其他的語句。根據(jù)需要,實體還可以有配置說明語句。配置說明語句主要用于以層次化的方式對特定的設(shè)計實體進(jìn)行元件例化,或是為實體選定某個特定的結(jié)構(gòu)體。圖3.2VHDL程序設(shè)計基本結(jié)構(gòu)如何才算一個完整的VHDL程序(設(shè)計實體),目前并沒有完全一致的結(jié)論,因為不同的程序設(shè)計目的可以有不同的程序結(jié)構(gòu)。通常認(rèn)為,一個完整的設(shè)計實體的最低要求應(yīng)該能為VHDL綜合器所接受,并能作為一個獨立設(shè)計單元,即以元件的形式存在的VHDL程序。這里所謂的元件,既可以被高層次的系統(tǒng)所調(diào)用,成為該系統(tǒng)的一部分,也可以作為一個電路功能塊而獨立存在和獨立運行。3.2.3庫、程序包使用說明
1.庫的種類
VHDL程序設(shè)計中常用的庫有四種。
1)?IEEE庫
IEEE庫是VHDL設(shè)計中最為常見的庫,它包含有IEEE標(biāo)準(zhǔn)的程序包和其他一些支持工業(yè)標(biāo)準(zhǔn)的程序包。IEEE庫中的標(biāo)準(zhǔn)程序包主要包括STD_LOGIC_1164、NUMERIC_BIT和NUMERIC_STD等程序包。其中,STD_LOGIC_1164是最重要、最常用的程序包,大部分基于數(shù)字系統(tǒng)設(shè)計的程序包都是以此程序包中設(shè)定的標(biāo)準(zhǔn)為基礎(chǔ)的。此外,還有一些程序包雖非IEEE標(biāo)準(zhǔn),但由于其已成事實上的工業(yè)標(biāo)準(zhǔn),也都并入了IEEE庫。這些程序包中,最常用的是Synopsys公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。目前流行于我國的大多數(shù)EDA工具都支持Synopsys公司程序包。一般基于大規(guī)??删幊踢壿嬈骷臄?shù)字系統(tǒng)設(shè)計,IEEE庫中的四個程序包STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED已經(jīng)足夠使用。另外需要注意的是,在IEEE庫中符合IEEE標(biāo)準(zhǔn)的程序包并非符合VHDL語言標(biāo)準(zhǔn),如STD_LOGIC_1164程序包,因此在使用VHDL設(shè)計實體的前面必須以顯式表達(dá)出來。
2)?STD庫
VHDL語言標(biāo)準(zhǔn)定義了兩個標(biāo)準(zhǔn)程序包,即STANDARD和TEXTIO程序包,它們都被收入在STD庫中。只要在VHDL應(yīng)用環(huán)境中,就可隨時調(diào)用這兩個程序包中的所有內(nèi)容,即在編譯和綜合過程中,VHDL的每一項設(shè)計都自動地將其包含進(jìn)去了。由于STD庫符合VHDL語言標(biāo)準(zhǔn),因此在應(yīng)用中不必如IEEE庫那樣以顯式表達(dá)出來。
3)?WORK庫
WORK庫是用戶的VHDL設(shè)計的現(xiàn)行工作庫,用于存放用戶設(shè)計和定義的一些設(shè)計單元和程序包。因此自動滿足VHDL語言標(biāo)準(zhǔn),在實際調(diào)用中,不必以顯式預(yù)先說明。
4)?VITAL庫
VITAL庫是各FPGA/CPLD生產(chǎn)廠商提供的面向ASIC的邏輯門庫。使用VITAL庫,可以提高VHDL門級時序模擬的精度,因而只在VHDL仿真器中使用。庫中包含時序程序包VITAL_TIMING和VITAL_PRIMITIVES。VITAL程序包已經(jīng)成為IEEE標(biāo)準(zhǔn),在當(dāng)前的VHDL仿真器的庫中,VITAL庫中的程序包都已經(jīng)并到IEEE庫中。實際上,由于各FPGA/CPLD生產(chǎn)廠商的適配工具(如ispEXPERTCompiler)都能為各自的芯片生成帶時序信息的VHDL門級網(wǎng)表,用VHDL仿真器仿真該網(wǎng)表可以得到非常精確的時序仿真結(jié)果。因此,基于實用的觀點,在FPGA/CPLD設(shè)計開發(fā)過程中,一般并不需要VITAL庫中的程序包。除了以上提到的庫外,EDA工具開發(fā)商為了便于FPGA/CPLD開發(fā)設(shè)計上的方便,都有自己的擴(kuò)展庫和相應(yīng)的程序包,如DATAIO公司的GENERICS庫、DATAIO庫等,以及上面提到的Synopsys公司的一些庫。在VHDL設(shè)計中,有的EDA工具將一些程序包和設(shè)計單元放在一個目錄下,而將此目錄名,如“WORK”,作為庫名,如Synplicity公司的Synplify。有的EDA工具是通過配置語句結(jié)構(gòu)來指定庫和庫中的程序包的,這時的配置即成為一個設(shè)計實體中最頂層的設(shè)計單元。此外,用戶還可以自己定義一些庫,將自己的設(shè)計內(nèi)容或通過交流獲得的程序包設(shè)計實體并入這些庫中。
2.程序包的種類常用的預(yù)定義的程序包有四種。
1)?STD_LOGIC_1164程序包它是IEEE庫中最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包。該程序包中包含了一些數(shù)據(jù)類型、子類型和函數(shù)的定義,這些定義將VHDL擴(kuò)展為一個能描述多值邏輯(即除具有“0”和“1”以外還有其他的邏輯量,如高阻態(tài)“Z”、不定態(tài)“X”等)的硬件描述語言,很好地滿足了實際數(shù)字系統(tǒng)的設(shè)計需求。該程序包中用得最多和最廣的是定義了滿足工業(yè)標(biāo)準(zhǔn)的兩個數(shù)據(jù)類型STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中的多值邏輯設(shè)計結(jié)構(gòu)。
2)?STD_LOGIC_ARITH程序包它預(yù)先編譯在IEEE庫中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上擴(kuò)展了三個數(shù)據(jù)類型:UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關(guān)的算術(shù)運算符和轉(zhuǎn)換函數(shù)。
3)?STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包這兩個程序包都是Synopsys公司的程序包,都預(yù)先編譯在IEEE庫中。這些程序包重載了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合運算的運算符,并定義了一個由STD_LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。這兩個程序包的區(qū)別是,STD_LOGIC_SIGNED中定義的運算符考慮到了符號,是有符號數(shù)的運算,而STD_LOGIC_UNSIGNED則正好相反。程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED雖然未成為IEEE標(biāo)準(zhǔn),但已經(jīng)成為事實上的工業(yè)標(biāo)準(zhǔn),絕大多數(shù)的VHDL綜合器和VHDL仿真器都支持它們。
4)?STANDARD和TEXTIO程序包這兩個程序包是STD庫中的預(yù)編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類型、子類型和函數(shù)。它是VHDL標(biāo)準(zhǔn)程序包,實際應(yīng)用中已隱性地打開了,故不必再用USE語句另作聲明。TEXTIO程序包定義了支持文本文件操作的許多類型和子程序。在使用本程序包之前,需加語句USESTD.TEXTIO.ALL。
TEXTIO程序包主要供仿真器使用??梢杂梦谋揪庉嬈鹘⒁粋€數(shù)據(jù)文件,文件中包含仿真時需要的數(shù)據(jù),仿真時用TEXTIO程序包中的子程序存取這些數(shù)據(jù)。綜合器中,此程序包被忽略。關(guān)于這些庫和程序包,可在與EDA軟件相關(guān)的地方找到。比如在QuartusⅡ8.0軟件中,通過路徑D:\altera\80\quartus\libraries\vhdl\ieee\std_1164.vhd可找到對應(yīng)的庫和程序包,如圖3.3和圖3.4所示。圖3.3QuartusⅡ8.0中庫的位置圖圖3.4QuartusⅡ8.0中程序包的位置圖
3.庫、程序包的使用在VHDL語言中,庫的說明語句總是放在實體單元前面,而且?guī)煺Z言一般必須與USE語言同用。庫語言關(guān)鍵詞LIBRARY指明所使用的庫名,USE語句指明庫中的程序包。一旦說明了庫和程序包,整個設(shè)計實體都可進(jìn)入訪問或調(diào)用,但其作用范圍僅限于所說明的設(shè)計實體。VHDL要求一項含有多個設(shè)計實體的更大的系統(tǒng),每一個設(shè)計實體都必須有自己完整的庫說明語句和USE語句。
庫、程序包的使用語句格式如下:
LIBRARY庫名;
USE庫名.程序包名.項目名/ALL;其中,第一個語句的作用是為其后的設(shè)計實體打開以此庫名命名的庫,以便設(shè)計實體可以利用其中的程序包;第二個語句的作用是向本設(shè)計實體開放指定庫中的特定程序包內(nèi)所選定的項目/所有的內(nèi)容。
【例3.2】庫和程序包的使用實例。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;以上的三條語句表示打開IEEE庫,再打開此庫中的STD_LOGIC_1164程序包和STD_LOGIC_UNSIGNED程序包的所有內(nèi)容。
【例3.3】庫和程序包的使用實例。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.STD_ULOGIC;
USEIEEE.STD_LOGIC_1164.RISING_EDGE;此例中向當(dāng)前設(shè)計實體開放了STD_LOGIC_1164程序包中的RISING_EDGE函數(shù)。但由于此函數(shù)需要用到數(shù)據(jù)類型STD_ULOGIC,因此在上一條USE語句中開放了同一程序包中的這一數(shù)據(jù)類型。3.2.4實體描述
1.實體描述語句結(jié)構(gòu)實體描述的常用語句結(jié)構(gòu)如下:
ENTITY實體名IS
[GENERIC(類屬表);]
[PORT(端口表);]
END[ENTITY][實體名];實體說明單元必須以語句“ENTITY實體名IS”開始,以語句“END[ENTITY][實體名];”結(jié)束,其中的實體名是設(shè)計者自己給設(shè)計實體的命名,可在其他設(shè)計實體對該設(shè)計實體進(jìn)行調(diào)用時用。中間方括號內(nèi)的語句描述在特定的情況下并非是必須的。例如,在構(gòu)建一個VHDL仿真測試基準(zhǔn)等情況時可以省去方括號中的語句。
2.類屬說明語句類屬(GENERIC)參量是一種端口界面常數(shù),常以一種說明的形式放在實體或塊結(jié)構(gòu)體前的說明部分。類屬為所說明的環(huán)境提供了一種靜態(tài)信息通道,類屬的值可以由設(shè)計實體外部提供。因此,設(shè)計者可以從外面通過類屬參量的重新設(shè)定而容易地改變一個設(shè)計實體或一個元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模。類屬說明的一般書寫格式如下:
GENERIC([常數(shù)名:數(shù)據(jù)類型[:設(shè)定值]
{;常數(shù)名:數(shù)據(jù)類型[:=設(shè)定值]});類屬參量以關(guān)鍵詞GENERIC引導(dǎo)一個類屬參量表,在表中提供時間參數(shù)或總線寬度等靜態(tài)信息。類屬表說明用于確定設(shè)計實體和其外部環(huán)境通信的參數(shù),傳遞靜態(tài)的信息。類屬說明在所定義的環(huán)境中的地位十分接近常數(shù),但卻能從環(huán)境(如設(shè)計實體)外部動態(tài)地接受賦值,其行為又有點類似于端口PORT。因此,常如以上的實體定義語句那樣,將類屬說明放在其中,且放在端口說明語句的前面。在一個實體中定義的、可以通過GENERIC參數(shù)類屬的說明,為這個實體創(chuàng)建多個行為不同的邏輯結(jié)構(gòu)。比較常見的情況是選用類屬來動態(tài)規(guī)定一個實體端口的大小,或設(shè)計實體的物理特性,或結(jié)構(gòu)體中的總線寬度,或設(shè)計實體中、底層中同種元件的例化數(shù)量等。一般在結(jié)構(gòu)體中,類屬的應(yīng)用與常數(shù)是一樣的。例如,當(dāng)用實體例化一個設(shè)計實體的器件時,可以用類屬表中的參數(shù)項定制這個器件,如可以將一個實體的傳輸延時、上升和下降延時等參數(shù)加到類屬參數(shù)表中,然后根據(jù)這些參數(shù)進(jìn)行定制,這對于系統(tǒng)仿真控制是十分方便的。類屬中的常數(shù)名是由設(shè)計者確定的類屬常數(shù)名;數(shù)據(jù)類型通常取INTEGER或TIME等類型;設(shè)定值即為常數(shù)名所代表的數(shù)值。但需注意,綜合器僅支持?jǐn)?shù)據(jù)類型為整數(shù)的類屬值。
3.PORT端口說明由PORT引導(dǎo)的端口說明語句是對于一個設(shè)計實體界面的說明。實體端口說明的一般書寫格式如下:
PORT(端口名:端口模式數(shù)據(jù)類型;
{端口名:端口模式數(shù)據(jù)類型});其中,端口名是設(shè)計者為實體的每一個對外通道所取的名字;端口模式是指這些通道上的數(shù)據(jù)流動方式,如輸入或輸出等;數(shù)據(jù)類型是指端口上流動的數(shù)據(jù)的表達(dá)格式。
VHDL是一種強(qiáng)類型語言,它對語句中的所有操作數(shù)的數(shù)據(jù)類型都有嚴(yán)格的規(guī)定。一個實體通常有一個或多個端口,端口類似于原理圖部件符號上的管腳。實體與外界交流的信息必須通過端口通道流入或流出。
IEEE1076標(biāo)準(zhǔn)包中定義了四種常用的端口模式,各端口模式的功能及符號分別見表3.1和圖3.5。在實際的數(shù)字集成電路中,IN相當(dāng)于只可輸入的引腳,OUT相當(dāng)于只可輸出的引腳,BUFFER相當(dāng)于帶輸出緩沖器并可以回讀的引腳(與TRI引腳不同),而INOUT相當(dāng)于雙向引腳(即BIDIR引腳)。表3.1端口模式說明圖3.5端口模式符號圖3.2.5結(jié)構(gòu)體描述結(jié)構(gòu)體(ARCHITECTUE)描述用于描述設(shè)計實體的內(nèi)部結(jié)構(gòu)以及實體端口間的邏輯關(guān)系。結(jié)構(gòu)體內(nèi)部構(gòu)造的描述層次和描述內(nèi)容可參看圖3.2。一般地,一個完整的結(jié)構(gòu)體由兩個基本層次組成:●對數(shù)據(jù)類型、常數(shù)、信號、子程序和元件等元素的說明部分?!衩枋鰧嶓w邏輯行為的,以各種不同的描述風(fēng)格表達(dá)的功能描述語句。
結(jié)構(gòu)體將具體實現(xiàn)一個實體。每個實體可以有多個結(jié)構(gòu)體,每個結(jié)構(gòu)體對應(yīng)著實體不同結(jié)構(gòu)和算法實現(xiàn)方案,其間的各個結(jié)構(gòu)體的地位是同等的,它們完整地實現(xiàn)了實體的行為,但同一結(jié)構(gòu)體不能為不同的實體所擁有。結(jié)構(gòu)體不能單獨存在,它必須有一個界面說明,即一個實體。對于具有多個結(jié)構(gòu)體的實體,必須用CONFIGURATION配置語句指明用于綜合的結(jié)構(gòu)體和用于仿真的結(jié)構(gòu)體,即在綜合后的可映射于硬件電路的設(shè)計實體中,一個實體只對應(yīng)一個結(jié)構(gòu)體。在電路中,如果實體代表一個器件符號,則結(jié)構(gòu)體描述了這個符號的內(nèi)部行為。當(dāng)把這個符號例化成一個實際的器件安裝到電路上時,則需配置語句為這個例化的器件指定一個結(jié)構(gòu)體(即指定一種實現(xiàn)方案),或由編譯器自動選一個結(jié)構(gòu)體。
1.結(jié)構(gòu)體的一般語句格式結(jié)構(gòu)體的語句格式如下:
ARCHITECTURE結(jié)構(gòu)體名OF實體名IS
[元素說明語句;]
BEGIN
[功能描述語句;]
END[ARCHITECTURE][結(jié)構(gòu)體名];其中,實體名必須是所在設(shè)計實體的名字,而結(jié)構(gòu)體名可以由設(shè)計者自己選擇,但當(dāng)一個實體具有多個結(jié)構(gòu)體時,結(jié)構(gòu)體的取名不可重復(fù)。
2.結(jié)構(gòu)體說明語句結(jié)構(gòu)體中的說明語句是對結(jié)構(gòu)體的功能描述語句中將要用到的信號(SIGNAL)、數(shù)據(jù)類型(TYPE)、常數(shù)(CONSTANT)、元件(COMPONENT)、函數(shù)(FUNCTION)和過程(PROCEDURE)等加以說明的語句。但在一個結(jié)構(gòu)體中說明和定義的數(shù)據(jù)類型、常數(shù)、元件、函數(shù)和過程只能用于這個結(jié)構(gòu)體中,若希望其能用于其他的實體或結(jié)構(gòu)體中,則需要將其作為程序包來處理。
3.功能描述語句結(jié)構(gòu)如圖3.5所示的功能描述語句結(jié)構(gòu)可以含有五種不同類型的,以并行方式工作的語句結(jié)構(gòu)。而在每一語句結(jié)構(gòu)的內(nèi)部可能含有并行運行的邏輯描述語句或順序運行的邏輯描述語句。各語句結(jié)構(gòu)的基本組成和功能分別是:
(1)塊語句是由一系列并行執(zhí)行語句構(gòu)成的組合體,它的功能是將結(jié)構(gòu)體中的并行語句組成一個或多個模塊。(2)進(jìn)程語句定義順序語句模塊,用以將從外部獲得的信號值,或內(nèi)部的運算數(shù)據(jù)向其他的信號進(jìn)行賦值。
(3)信號賦值語句將設(shè)計實體內(nèi)的處理結(jié)果向定義的信號或界面端口進(jìn)行賦值。
(4)子程序調(diào)用語句用于調(diào)用一個已設(shè)計好的子程序。
(5)元件例化語句對其他的設(shè)計實體作元件調(diào)用說明,并將此元件的端口與其他的元件、信號或高層次實體的界面端口進(jìn)行連接。3.2.6結(jié)構(gòu)體配置配置(CONFIGRATION)可以把特定的結(jié)構(gòu)體指定給一個確定的實體。通常在大而復(fù)雜的VHDL工程設(shè)計中,配置語句可以為實體指定或配置一個結(jié)構(gòu)體。如可利用配置使仿真器為同一實體配置不同的結(jié)構(gòu)體以使設(shè)計者比較不同結(jié)構(gòu)體的仿真差別,或者為例化的各元件實體配置指定的結(jié)構(gòu)體,從而形成一個所希望的例化元件層次構(gòu)成的設(shè)計實體。配置也是VHDL設(shè)計實體中的一個基本單元,在綜合或仿真中,可以利用配置語句為確定整個設(shè)計提供許多有用信息。例如對以元件例化的層次方式構(gòu)成的VHDL設(shè)計實體,就可把配置語句的設(shè)置看成是一個元件表,用配置語句指定在頂層設(shè)計中的每一元件與一特定結(jié)構(gòu)體相銜接,或賦予特定屬性。配置語句還能用于對元件的端口連接進(jìn)行重新安排等。
VHDL綜合器允許將配置規(guī)定為一個設(shè)計實體中的最高層設(shè)計單元,但只支持對最頂層的實體進(jìn)行配置。配置語句的一般格式如下:
CONFIGURATION配置名OF實體名IS配置說明;
END[CONFIGURATION][配置名];配置主要為頂層設(shè)計實體指定結(jié)構(gòu)體,或為參與例化的元件實體指定所希望的結(jié)構(gòu)體,以層次方式來對元件例化作結(jié)構(gòu)配置。如前所述,每個實體可以擁有多個不同的結(jié)構(gòu)體,而每個結(jié)構(gòu)體的地位是相同的,在這種情況下,可以利用配置說明為這個實體指定一個結(jié)構(gòu)體。
【例3.4】配置語句的應(yīng)用實例。
--MYNAND.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMYNANDIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
C:OUTSTD_LOGIC);
ENDENTITYMYNAND;
ARCHITECTUREART1OFMYNANDIS
BEGIN
C<=NOT(AANDB);
ENDARCHITECTUREART1;
ARCHITECTUREART2OFMYNANDIS
BEGIN
C<='1'WHEN(A='0')AND(B='0')ELSE
'1'WHEN(A='0')AND(B='1')ELSE
'1'WHEN(A='1')AND(B='0')ELSE
'0'WHEN(A='1')AND(B='1')ELSE
'0';
ENDARCHITECTUREART2;
CONFIGURATIONCFG2OFMYNANDIS
FORART2
ENDFOR;
ENDCONFIGURATIONCFG2;
--CONFIGURATIONCFG1OFMYNANDIS
--FORART1
--ENDFOR;
--ENDCONFIGURATIONCFG1;
--RSCFQ.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYRSCFQIS
PORT(R:INSTD_LOGIC;
S:INSTD_LOGIC;
Q:BUFFERSTD_LOGIC;
NQ:BUFFERSTD_LOGIC);
ENDENTITYRSCFQ;
ARCHITECTUREARTOFRSCFQIS
COMPONENTMYNANDIS
PORT(A:INSTD_LOGIC;
B:INSTD_LOGIC;
C:OUTSTD_LOGIC);
ENDCOMPONENTMYNAND;
BEGIN
U1:MYNANDPORTMAP(A=>S,B=>NQ,C=>Q);
U2:MYNANDPORTMAP(A=>Q,B=>R,C=>NQ);
ENDARCHITECTUREART;
CONFIGURATIONCFGOFRSCFQIS
FORART
FORU1,U2:MYNAND
USEENTITYWORK.MYNAND(ART2);
ENDFOR;
ENDFOR;
ENDCONFIGURATIONCFG;在例3.4中,MYNAND.VHD若指定配置名為CFG2,則為實體MYNAND配置的結(jié)構(gòu)體為ART2;若指定配置名為CFG1(注:程序中將此另一種配置注釋掉了),則為實體MYNAND配置的結(jié)構(gòu)體為ART1。這兩種結(jié)構(gòu)的描述方式是不同的,但是有相同的邏輯功能。若將配置語言全部除去,則可以用此具有兩個結(jié)構(gòu)體的實體MYNAND構(gòu)成另一個更高層次設(shè)計實體中的元件,并由此設(shè)計實體中的配置語句來指定元件實體MYNAND使用哪一個結(jié)構(gòu)體。RSCFQ.VHD就是利用已設(shè)計好的MYNAND.VHD實現(xiàn)RS觸發(fā)器設(shè)計的。最后,利用配置語句指定元件實體MYNAND中的第二個結(jié)構(gòu)ART2來構(gòu)成MYNAND2的結(jié)構(gòu)體。3.3VHDL語言要素3.3.1VHDL文字規(guī)則
VHDL文字(Literal)主要包括數(shù)值和標(biāo)識符。數(shù)值型文字主要有數(shù)字型、字符串型、位串型。
1.?dāng)?shù)字型文字?jǐn)?shù)字型文字的值有多種表達(dá)方式,現(xiàn)列舉如下:
(1)整數(shù)文字:整數(shù)文字都是十進(jìn)制的數(shù),如:
5,678,0,156E2(=15600),45_234_287(=45234287)
數(shù)字間的下劃線僅僅是為了提高文字的可讀性,相當(dāng)于一個空的間隔符,而沒有其他的意義,因而不影響文字本身的數(shù)值。(2)實數(shù)文字:實數(shù)文字也都是十進(jìn)制的數(shù),但必須帶有小數(shù)點,如:
188.993,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499),1.335,0.0(3)以數(shù)制基數(shù)表示的文字:用這種方式表示的數(shù)由五個部分組成。第一部分,用十進(jìn)制數(shù)標(biāo)明數(shù)制進(jìn)位的基數(shù);第二部分,數(shù)制隔離符號“#”;第三部分,表達(dá)的文字;第四部分,指數(shù)隔離符號“#”;第五部分,用十進(jìn)制表示的指數(shù)部分,這一部分的數(shù)如果是0可以省去不寫。現(xiàn)舉例如下:10#170#--(十進(jìn)制數(shù)表示,等于170)2#1111_1110#--(二進(jìn)制數(shù)表示,等于254)16#E#E1--(十六進(jìn)制數(shù)表示,等于2#11100000#,等于224)16#F.01#E+2--(十六進(jìn)制數(shù)表示,等于3841.00)(4)物理量文字(VHDL綜合器不接受此類文字)。如:60s(60秒),100m(100米),kΩ(千歐姆),177A(177安培)
2.字符串型文字字符是用單引號引起來的ASCII字符,可以是數(shù)值,也可以是符號或字母,如:‘R’,‘A’,‘*’,‘Z’。而字符串則是一維的字符數(shù)組,須放在雙引號中。VHDL中有兩種類型的字符串:文字字符串和數(shù)位字符串。
(1)文字字符串:文字字符串是用雙引號引起來的一串文字,如:“ERROR”,“BOTHSANDQEQUALTOL”,“X”,“BB$CC”(2)數(shù)位字符串:數(shù)位字符串也稱位矢量,是預(yù)定義的數(shù)據(jù)類型BIT的一位數(shù)組,它們所代表的是二進(jìn)制、八進(jìn)制或十六進(jìn)制的數(shù)組,其位矢量的長度即為等值的二進(jìn)制數(shù)的位數(shù)。數(shù)位字符串的表示首先要有計算基數(shù),然后將該基數(shù)表示的值放在雙引號中,基數(shù)符以“B”、“O”和“X”表示,并放在字符串的前面。它們的含義分別是:●B:二進(jìn)制基數(shù)符號,表示二進(jìn)制數(shù)位0或1,在字符串中每一個位表示一個BIT?!馩:八進(jìn)制基數(shù)符號,在字符串中的第一個數(shù)代表一個八進(jìn)制數(shù),即代表一個3位(BIT)的二進(jìn)制數(shù)?!馲:十六進(jìn)制基數(shù)符號(0~F),代表一個十六進(jìn)制數(shù),即代表一個4位的二進(jìn)制數(shù)。例如:B“1_1101_1110” --二進(jìn)制數(shù)數(shù)組,位矢數(shù)組長度是9X“AD0” --十六進(jìn)制數(shù)數(shù)組,位矢數(shù)組長度是12
3.標(biāo)識符標(biāo)識符用來定義常數(shù)、變量、信號、端口、子程序或參數(shù)的名字。VHDL的基本標(biāo)識符就是以英文字母開頭,不連續(xù)使用下劃線“_”,不以下劃線“_”結(jié)尾的,由26個大小寫英文字母、數(shù)字0~9以及下劃線“_”組成的字符串。VHDL’93標(biāo)準(zhǔn)還支持?jǐn)U展標(biāo)識符,但是目前仍有許多VHDL工具不支持?jǐn)U展標(biāo)識符。標(biāo)識符中的英語字母不分大小寫。VHDL的保留字不能用于作為標(biāo)識符使用。如:DECODER_1,F(xiàn)FT,Sig_N,NOT_ACK,State0,Idle是合法的標(biāo)識符;而_DECODER_1,2FFT,SIG_#N,NOT_ACK,RYY_RST,data_BUS,RETURN則是非法的標(biāo)識符。
4.下標(biāo)名及下標(biāo)段名下標(biāo)名用于指示數(shù)組型變量或信號的某一元素,而下標(biāo)段名則用于指示數(shù)組型變量或信號的某一段元素,其語句格式如下:數(shù)組類型信號名或變量名(表達(dá)式1[TO/DOWNTO表達(dá)式2]);表達(dá)式的數(shù)值必須在數(shù)組元素下標(biāo)號范圍以內(nèi),并且必須是可計算的。TO表示數(shù)組下標(biāo)序列由低到高,如“2TO8”;DOWNTO表示數(shù)組下標(biāo)序列由高到低,如“8DOWNTO2”?!纠?.5】下標(biāo)名及下標(biāo)段名使用示例。
SIGNALA,B,C:BIT_VECTOR(0TO7);
SIGNALM:INTEGERRANGE0TO3;
SIGNALY,Z:BIT;
Y<=A(M); --M是不可計算型下標(biāo)表示
Z<=B(3); --3是可計算型下標(biāo)表示
C(0TO3)<=A(4TO7); --以段的方式進(jìn)行賦值
C(4TO7)<=A(0TO3); --以段的方式進(jìn)行賦值3.3.2VHDL數(shù)據(jù)對象在VHDL中,數(shù)據(jù)對象(DataObjects)類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有三種,即常量(CONSTANT)、變量(VARIABLE)和信號(SIGNAL)。前兩種可以從傳統(tǒng)的計算機(jī)高級語言中找到對應(yīng)的數(shù)據(jù)類型,其語言行為與高級語言中的變量和常量十分相似。但信號是具有更多的硬件特征的特殊數(shù)據(jù)對象,是VHDL中最有特色的語言要素之一。
1.常量(CONSTANT)
常量的定義和設(shè)置主要是為了使設(shè)計實體中的常數(shù)更容易閱讀和修改。例如,將位矢的寬度定義為一個常量,只要修改這個常量就能很容易地改變寬度,從而改變硬件結(jié)構(gòu)。在程序中,常量是一個恒定不變的值,一旦作了數(shù)據(jù)類型的賦值定義后,在程序中不能再改變,因而具有全局意義。常量的定義形式如下:CONSTANT常量名:數(shù)據(jù)類型﹕=表達(dá)式;【例3.6】常量使用示例。CONSTANTFBUS﹕BIT_VECTOR﹕=“010115”;CONSTANTVCC﹕REAL﹕=5.0;CONSTANTDELY﹕TIME﹕=25ns;VHDL要求所定義的常量數(shù)據(jù)類型必須與表達(dá)式的數(shù)據(jù)類型一致。常量的數(shù)據(jù)類型可以是標(biāo)量類型或復(fù)合類型,但不能是文件類型(File)或存取類型(Access)。常量定義語句所允許的設(shè)計單元有實體、結(jié)構(gòu)體、程序包、塊、進(jìn)程和子程序。在程序包中定義的常量可以暫不設(shè)具體數(shù)值,它可以在程序包體中設(shè)定。
常量的可視性,即常量的使用范圍取決于它被定義的位置。在程序包中定義的常量具有最大全局化特征,可以用在調(diào)用此程序包的所有設(shè)計實體中;定義在設(shè)計實體中的常量,其有效范圍為這個實體定義的所有的結(jié)構(gòu)體;定義在設(shè)計實體的某一結(jié)構(gòu)體中的常量,則只能用于此結(jié)構(gòu)體;定義在結(jié)構(gòu)體的某一單元的常量,如一個進(jìn)程中,則這個常量只能用在這一進(jìn)程中。
2.變量(VARIABLE)
在VHDL語法規(guī)則中,變量是一個局部量,只能在進(jìn)程和子程序中使用。變量不能將信息帶出對它作出定義的當(dāng)前設(shè)計單元。變量的賦值是一種理想化的數(shù)據(jù)傳輸,是立即發(fā)生,不存在任何延時的行為。VHDL語言規(guī)則不支持變量附加延時語句。變量常用在實現(xiàn)某種算法的賦值語句中。
VARIABLE變量名:數(shù)據(jù)類型:=初始值;
【例3.7】變量使用示例。
VARIABLEA:INTEGER;--定義A為整數(shù)型變量
VARIABLEB,C:INTEGER:=2; --定義B和C為整型變量,初始值為2變量作為局部量,其適用范圍僅限于定義了變量的進(jìn)程或子程序中。仿真過程中惟一的例外是共享變量。變量的值將隨變量賦值語句的運算而改變。變量定義語句中的初始值可以是一個與變量具有相同數(shù)據(jù)類型的常數(shù)值,也可以是一個全局靜態(tài)表達(dá)式,這個表達(dá)式的數(shù)據(jù)類型必須與所賦值變量一致。此初始值不是必需的,綜合過程中綜合器將略去所有的初始值。
變量作為局部量,其適用范圍僅限于定義了變量的進(jìn)程或子程序中。仿真過程中惟一的例外是共享變量。變量的值將隨變量賦值語句的運算而改變。變量定義語句中的初始值可以是一個與變量具有相同數(shù)據(jù)類型的常數(shù)值,也可以是一個全局靜態(tài)表達(dá)式,這個表達(dá)式的數(shù)據(jù)類型必須與所賦值變量一致。此初始值不是必需的,綜合過程中綜合器將略去所有的初始值。變量數(shù)值的改變是通過變量賦值來實現(xiàn)的,其賦值語句的語法格式如下:目標(biāo)變量名:=表達(dá)式;
3.信號(SIGNAL)
信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于連接線。信號可以作為設(shè)計實體中并行語句模塊間的信息交流通道。在VHDL中,信號及其相關(guān)的信號賦值語句、決斷函數(shù)、延時語句等很好地描述了硬件系統(tǒng)的許多基本特征。如硬件系統(tǒng)運行的并行性;信號傳輸過程中的慣性延時特性;多驅(qū)動源的總線行為等。信號作為一種數(shù)值容器,不但可以容納當(dāng)前值,也可以保持歷史值。這一屬性與觸發(fā)器的記憶功能有很好的對應(yīng)關(guān)系。信號的定義格式如下:
SIGNAL信號名:數(shù)據(jù)類型﹕=初始值;
信號初始值的設(shè)置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變量相比,信號的硬件特征更為明顯,它具有全局性特性。例如,在程序包中定義的信號,對于所有調(diào)用此程序包的設(shè)計實體都是可見的;在實體中定義的信號,在其對應(yīng)的結(jié)構(gòu)體中都是可見的。事實上,除了沒有方向說明以外,信號與實體的端口(PORT)概念是一致的。相對于端口來說,其區(qū)別只是輸出端口不能讀入數(shù)據(jù),輸入端口不能被賦值。信號可以看成是實體內(nèi)部的端口。反之,實體的端口只是一種隱形的信號,端口的定義實際上是作了隱式的信號定義,并附加了數(shù)據(jù)流動的方向。信號本身的定義是一種顯式的定義,因此,在實體中定義的端口,在其結(jié)構(gòu)體中都可以看成是一個信號,并加以使用而不必另作定義。
【例3.8】
信號定義示例。
SIGNALS1:STD_LOGIG:=0; --定義了一個標(biāo)準(zhǔn)位的單值信號S1,初始值為低電平
SIGNALS2,S3:BIT; --定義了兩個為BIT的信號S2和S3
SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0);
--定義了一個標(biāo)準(zhǔn)位矢的位矢量(數(shù)組、總線)信號,共有16個信號元素信號的使用和定義范圍是實體、結(jié)構(gòu)體和程序包。在進(jìn)程和子程序中不允許定義信號。信號可以有多個驅(qū)動源,或者說賦值信號源,但必須將此信號的數(shù)據(jù)類型定義為決斷性數(shù)據(jù)類型。在進(jìn)程中,只能將信號列入敏感表,而不能將變量列入敏感表??梢娺M(jìn)程只對信號敏感,而對變量不敏感。當(dāng)定義了信號的數(shù)據(jù)類型和表達(dá)方式后,在VHDL設(shè)計中就能對信號進(jìn)行賦值了。信號的賦值語句表達(dá)式如下:目標(biāo)信號名<=表達(dá)式;其賦值語句的用法見3.4節(jié)。
4.三者的使用比較
(1)從硬件電路系統(tǒng)來看,常量相當(dāng)于電路中的恒定電平,如GND或VCC接口,而變量和信號則相當(dāng)于組合電路系統(tǒng)中門與門間的連接及其連線上的信號值。
(2)從行為仿真和VHDL語句功能上看,二者的區(qū)別主要表現(xiàn)在接受和保持信號的方式、信息保持與傳遞的區(qū)域大小上。例如信號可以設(shè)置延時量,而變量則不能;變量只能作為局部的信息載體,而信號則可作為模塊間的信息載體。變量的設(shè)置有時只是一種過渡,最后的信息傳輸和界面間的通信都靠信號來完成。(3)從綜合后所對應(yīng)的硬件電路結(jié)構(gòu)來看,信號一般將對應(yīng)更多的硬件結(jié)構(gòu),但在許多情況下,信號和變量并沒有什么區(qū)別。例如在滿足一定條件的進(jìn)程中,綜合后它們都能引入寄存器。這時它們都具有能夠接受賦值這一重要的共性,而VHDL綜合器并不理會它們在接受賦值時存在的延時特性。
(4)雖然VHDL仿真器允許變量和信號設(shè)置初始值,但在實際應(yīng)用中,VHDL綜合器并不會把這些信息綜合進(jìn)去。這是因為實際的FPGA/CPLD芯片在上電后,并不能確保其初始狀態(tài)的取向。因此,對于時序仿真來說,設(shè)置的初始值在綜合時是沒有實際意義的。3.3.3VHDL數(shù)據(jù)類型
VHDL是一種強(qiáng)類型語言,要求設(shè)計實體中的每一個常數(shù)、信號、變量、函數(shù)以及設(shè)定的各種參量都必須具有確定的數(shù)據(jù)類型,并且只有數(shù)據(jù)類型相同的量才能互相傳遞和作用。VHDL作為強(qiáng)類型語言的好處是能使VHDL編譯或綜合工具確定而無歧義的結(jié)果去綜合,保證設(shè)計硬件的唯一性。
VHDL中的數(shù)據(jù)類型按照數(shù)據(jù)類型的構(gòu)成可以分成四大類:標(biāo)量型(SCALARTYPE):屬單元素的最基本的數(shù)據(jù)類型,通常用于描述一個單值數(shù)據(jù)對象,它包括實數(shù)類型、整數(shù)類型、枚舉類型和時間類型。
復(fù)合類型(COMPOSITETYPE):可以由細(xì)小的數(shù)據(jù)類型復(fù)合而成,如可由標(biāo)量復(fù)合而成。復(fù)合類型主要有數(shù)組型(ARRAY)和記錄型(RECORD)。存取類型(ACCESSTYPE):為給定的數(shù)據(jù)類型的數(shù)據(jù)對象提供存取方式。文件類型(FILESTYPE):用于提供多值存取類型。
VHDL中的數(shù)據(jù)類型按照是否可以直接使用分成兩大類:在現(xiàn)成程序包中可以隨時獲得的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。預(yù)定義的VHDL數(shù)據(jù)類型是VHDL最常用、最基本的數(shù)據(jù)類型。這些數(shù)據(jù)類型都已在VHDL的標(biāo)準(zhǔn)程序包STANDARD和STD_LOGIC_1164及其他的標(biāo)準(zhǔn)程序包中作了定義,可在設(shè)計中隨時調(diào)用。
用戶自定義的數(shù)據(jù)類型以及子類型,其基本元素一般仍屬VHDL的預(yù)定義數(shù)據(jù)類型。盡管VHDL仿真器支持所有的數(shù)據(jù)類型,但VHDL綜合器并不支持所有的預(yù)定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。如REAL、TIME、FILE、ACCES等數(shù)據(jù)類型。在綜合中,它們將被忽略或宣布為不支持。
1.VHDL的預(yù)定義數(shù)據(jù)類型
1)布爾(BOOLEAN)數(shù)據(jù)類型程序包STANDARD中定義布爾數(shù)據(jù)類型的源代碼如下:
TYPEBOOLEANIS(FALES,TRUE);布爾數(shù)據(jù)類型實際上是一個二值枚舉型數(shù)據(jù)類型,它的取值有FALSE和TRUE兩種。綜合器將用一個二進(jìn)制位表示BOOLEAN型變量或信號。例如,當(dāng)A大于B時,在IF語句中的關(guān)系運算表達(dá)式(A>B)的結(jié)果是布爾量TRUE,反之為FALSE。綜合器將其變?yōu)?或0信號值,對應(yīng)于硬件系統(tǒng)中的一根線。2)位(BIT)數(shù)據(jù)類型位數(shù)據(jù)類型也屬于枚舉型,取值只能是1或0。位數(shù)據(jù)類型的數(shù)據(jù)對象,如變量、信號等,可以參與邏輯運算,運算結(jié)果仍是位的數(shù)據(jù)類型。VHDL綜合器用一個二進(jìn)制位表示BIT。在程序包STANDARD中定義的源代碼是:
TYPEBITIS(‘0’,‘1’);3)位矢量(BIT_VECTOR)數(shù)據(jù)類型位矢量只是基于BIT數(shù)據(jù)類型的數(shù)組,在程序包STANDARD中定義的源代碼是:
TYPEBIT_VETORISARRAY(NATURALRANGE<>)OFBIT;使用位矢量必須注明位寬,即數(shù)組中的元素個數(shù)和排列,例如:
SIGNALA﹕BIT_VECTOR(7TO0);信號A被定義為一個具有8位位寬的矢量,它的最左位是A(7),最右位是A(0)。4)字符(CHARACTER)數(shù)據(jù)類型字符類型通常用單引號引起來,如‘A’。字符類型區(qū)分大小寫,如‘B’不同于‘b’。字符類型已在STANDARD程序包中作了定義。5)整數(shù)(INTEGER)數(shù)據(jù)類型整數(shù)類型的數(shù)代表正整數(shù)、負(fù)整數(shù)和零。在VHDL中,整數(shù)的取值范圍是-21473647~+21473647,即可用32位有符號的二進(jìn)制數(shù)表示。在實際應(yīng)用中,VHDL仿真器通常將INTEGER類型作為有符號數(shù)處理,而VHDL綜合器則將INTEGER作為無符號數(shù)處理。在使用整數(shù)時,VHDL綜合器要求用RANGE子句為所定義的數(shù)限定范圍,然后根據(jù)所限定的范圍來決定表示此信號或變量的二進(jìn)制數(shù)的位數(shù),因為VHDL綜合器無法綜合未限定的整數(shù)類型的信號或變量。
如語句“SIGNALTYPE1﹕INTEGERRANGE0TO15;”規(guī)定整數(shù)TYPE1的取值范圍是0~15共16個值,可用4位二進(jìn)制數(shù)來表示,因此,TYPE1將被綜合成由四條信號線構(gòu)成的信號。整數(shù)常量的書寫方式示例如下:2 --十進(jìn)制整數(shù)10E4 --十進(jìn)制整數(shù)16#D2# --十六進(jìn)制整數(shù)2#11011010#--二進(jìn)制整數(shù)6)自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)數(shù)據(jù)類型自然數(shù)是整數(shù)的一個子類型,非負(fù)的整數(shù),即零和正整數(shù);正整數(shù)也是整數(shù)的一個子類型,它包括整數(shù)中非零和非負(fù)的數(shù)值。它們在STANDARD程序包中定義的源代碼如下:
SUBTYPENATURALISINTEGERRANGE0TOINTEGER'HIGH;
SUBTYPEPOSITIVEISINTEGERRANGE1TOINTEGER'HIGH;7)實數(shù)(REAL)數(shù)據(jù)類型
VHDL的實數(shù)類型類似于數(shù)學(xué)上的實數(shù),或稱浮點數(shù)。實數(shù)的取值范圍為-1.0E38~+1.0E38。通常情況下,實數(shù)類型僅能在VHDL仿真器中使用,VHDL綜合器不支持實數(shù),因為實數(shù)類型的實現(xiàn)相當(dāng)復(fù)雜,目前在電路規(guī)模上難以承受。實數(shù)常量的書寫方式舉例如下:
65971.333333--十進(jìn)制浮點數(shù)
8#43.6#E+4--八進(jìn)制浮點數(shù)
43.6E-4--十進(jìn)制浮點數(shù)8)字符串(STRING)數(shù)據(jù)類型字符串?dāng)?shù)據(jù)類型是字符數(shù)據(jù)類型的一個非約束型數(shù)組,或稱為字符串?dāng)?shù)組。字符串必須用雙引號標(biāo)明。如:VARIABLESTRING_VAR﹕STRING(1TO7);…STRING_VAR﹕“ABCD”;9)時間(TIME)數(shù)據(jù)類型
VHDL中惟一的預(yù)定義物理類型是時間。完整的時間類型包括整數(shù)和物理量單位兩部分,整數(shù)和單位之間至少留一個空格,如55ms,20ns。STANDARD程序包中也定義了時間。定義如下:TYPETIMEISRANGE-2147483647TO2147483647unitsfs; --飛秒,VHDL中的最小時間單位
ps=1000fs; --皮秒
ns=1000ps; --納秒
us=1000ns; --微秒
ms=1000us; --毫秒
sec=1000ms; --秒
min=60sec; --分
hr=60min; --時enduntis;10)錯誤等級(SEVERITY_LEVEL)
在VHDL仿真器中,錯誤等級用來指示設(shè)計系統(tǒng)的工作狀態(tài),共有四種可能的狀態(tài)值:NOTE(注意)、WARNING(警告)、ERROR(出錯)、FAILURE(失敗)。在仿真過程中,可輸出這四種值來提示被仿真系統(tǒng)當(dāng)前的工作情況。其定義如下:
TYPESEVERITY_LEVELIS(NOTE,WARNING,ERROR,F(xiàn)AILURE);
2.IEEE預(yù)定義標(biāo)準(zhǔn)邏輯位與矢量在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數(shù)據(jù)類型,即標(biāo)準(zhǔn)邏輯位STD_LOGIC和標(biāo)準(zhǔn)邏輯矢量STD_LOGIC_VECTOR。
1)標(biāo)準(zhǔn)邏輯位STD_LOGIC_1164中的數(shù)據(jù)類型以下是定義在IEEE庫程序包STD_LOGIC_1164中的數(shù)據(jù)類型。數(shù)據(jù)類型STD_LOGIC的定義如下所示:
TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');
各值的含義是:‘U’--未初始化的,‘X’--強(qiáng)未知的,‘0’--強(qiáng)0,‘1’--強(qiáng)1,‘Z’--高阻態(tài),‘W’--弱未知的
'L'--弱0,'H'--弱1,'-'--忽略在程序中使用此數(shù)據(jù)類型前,需加入下面的語句:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
由定義可見,STD_LOGIC是標(biāo)準(zhǔn)的BIT數(shù)據(jù)類型的擴(kuò)展,共定義了9種值,這意味著,對于定義為數(shù)據(jù)類型是標(biāo)準(zhǔn)邏輯位STD_LOGIC的數(shù)據(jù)對象,其可能的取值已非傳統(tǒng)的BIT那樣只有0和1兩種取值,而是如上定義的那樣有9種可能的取值。目前在設(shè)計中一般只使用IEEE的STD_LOGIC標(biāo)準(zhǔn)邏輯的位數(shù)據(jù)類型,BIT型則很少使用。由于標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型的多值性,在編程時應(yīng)當(dāng)特別注意。因為在條件語句中,如果未考慮到STD_LOGIC的所有可能的取值情況,綜合器可能會插入不希望的鎖存器。
程序包STD_LOGIC_1164中還定義了STD_LOGIC型邏輯運算符AND、NAND、OR、NOR、XOR和NOT的重載函數(shù),以及兩個轉(zhuǎn)換函數(shù),用于BIT與STD_LOGIC的相互轉(zhuǎn)換。在仿真和綜合中,STD_LOGIC值是非常重要的,它可以使設(shè)計者精確模擬一些未知和高阻態(tài)的線路情況。對于綜合器,高阻態(tài)和“-”忽略態(tài)可用于三態(tài)的描述。但就綜合而言,STD_LOGIC型數(shù)據(jù)能夠在數(shù)字器件中實現(xiàn)的只有其中的4種值,即“-”、“0”、“1”和“Z”。當(dāng)然,這并不表明其余的5種值不存在。這9種值對于VHDL的行為仿真都有重要意義。2)標(biāo)準(zhǔn)邏輯矢量(STD_LOGIC_VECTOR)數(shù)據(jù)類型
STD_LOGIC_VECTOR類型定義如下:
TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;顯然,STD_LOGIC_VECTOR是定義在STD_LOGIC_1164程序包中的標(biāo)準(zhǔn)一維數(shù)組,數(shù)組中的每一個元素的數(shù)據(jù)類型都是以上定義的標(biāo)準(zhǔn)邏輯位STD_LOGIC。
STD_LOGIC_VECTOR數(shù)據(jù)類型的數(shù)據(jù)對象賦值的原則是:同位寬、同數(shù)據(jù)類型的矢量間才能進(jìn)行賦值。下例描述的是CPU中數(shù)據(jù)總線上位矢賦值的操作示意情況,注意例中信號數(shù)據(jù)類型定義和賦值操作中信號的數(shù)組位寬。
3.其他預(yù)定義標(biāo)準(zhǔn)數(shù)據(jù)類型
VHDL綜合工具配帶的擴(kuò)展程序包中,定義了一些有用的類型。如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH中定義了如下的數(shù)據(jù)類型:無符號型(UNSIGNED)、有符號型(SIGNED)和小整型(SMALL_INT)。在程序包STD_LOGIC_ARITH中的類型定義如下:
TYPEUNSIGNEDISARRAY(NATURALRANGE<>)OFSTD_LOGIC;
TYPESIGNED
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年智能防盜門安裝與系統(tǒng)集成服務(wù)協(xié)議3篇
- 2024技術(shù)支持協(xié)議書范本
- 2024版聘用合同勞動合同
- 2025年度苯板銷售與產(chǎn)業(yè)鏈整合合同2篇
- 二零二五年度環(huán)保型廣告車租賃服務(wù)協(xié)議6篇
- 2024延期支付科研經(jīng)費合同協(xié)議書3篇
- 2024昆明市二手房買賣合同及其空氣質(zhì)量保證協(xié)議
- 二零二五年金融衍生品交易合同公證協(xié)議3篇
- 二零二五年度賓館客房租賃合同解除協(xié)議2篇
- 武漢信息傳播職業(yè)技術(shù)學(xué)院《空間數(shù)據(jù)庫》2023-2024學(xué)年第一學(xué)期期末試卷
- 常用靜脈藥物溶媒的選擇
- 當(dāng)代西方文學(xué)理論知到智慧樹章節(jié)測試課后答案2024年秋武漢科技大學(xué)
- 2024年預(yù)制混凝土制品購銷協(xié)議3篇
- 2024-2030年中國高端私人會所市場競爭格局及投資經(jīng)營管理分析報告
- GA/T 1003-2024銀行自助服務(wù)亭技術(shù)規(guī)范
- 《消防設(shè)備操作使用》培訓(xùn)
- 新交際英語(2024)一年級上冊Unit 1~6全冊教案
- 2024年度跨境電商平臺運營與孵化合同
- 2024年電動汽車充電消費者研究報告-2024-11-新能源
- 湖北省黃岡高級中學(xué)2025屆物理高一第一學(xué)期期末考試試題含解析
- 上海市徐匯中學(xué)2025屆物理高一第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
評論
0/150
提交評論