




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