《EDA技術(shù)及應用》課件第3章VHDL編程基礎0801_第1頁
《EDA技術(shù)及應用》課件第3章VHDL編程基礎0801_第2頁
《EDA技術(shù)及應用》課件第3章VHDL編程基礎0801_第3頁
《EDA技術(shù)及應用》課件第3章VHDL編程基礎0801_第4頁
《EDA技術(shù)及應用》課件第3章VHDL編程基礎0801_第5頁
已閱讀5頁,還剩316頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1第3章VHDL編程基礎

硬件描述語言是利用EDA技術(shù)進行電子系統(tǒng)設計的主要表達手段,而VHDL則是IEEE的工業(yè)標準硬件描述語言,目前已成為事實上的通用硬件描述語言。本章首先通過實例系統(tǒng)地闡述了VHDL的基本語法規(guī)則及使用注意事項,包括VHDL程序的基本結(jié)構(gòu),數(shù)據(jù)對象、數(shù)據(jù)類型、操作數(shù)、操作符等語言要素,賦值語句、IF條件語句、CASE選擇語句、LOOP循環(huán)語句等常用順序語句,PROCESS進程語句、并行賦值語句、元件例化語句等常用并行語句,子程序、庫和程序包以及VHDL描述風格。接著分類描述基本組合邏輯電路、時序邏輯電路和存儲器電路的VHDL實現(xiàn)的多種方法。最后闡述了實際應用中經(jīng)常用到一種特殊電路——狀態(tài)機電路的VHDL設計原理與實例。2目錄3.1概述

3.2VHDL程序基本結(jié)構(gòu)

3.3VHDL語言要素

3.4VHDL順序語句

3.5VHDL并行語句

3.6子程序

3.7程序包

3.8VHDL描述風格

3.9基本邏輯電路設計

3.10狀態(tài)機的VHDL設計33.1.1常用硬件描述語言簡介常用硬件描述語言有VHDL、Verilog和ABEL語言。VHDL起源于美國國防部的VHSIC;Verilog起源于集成電路的設計;ABEL來源于可編程邏輯器件的設計。下面從使用方面將三者進行對比。

(1)邏輯描述層次。一般的硬件描述語言由高到低依次可分為行為級、RTL級和門電路級三個描述層次。VHDL語言是一種高級描述語言,適用于行為級和RTL級的描述,最適于描述電路的行為;Verilog語言和ABEL語言是一種較低級的描述語言,適用于RTL級和門電路級的描述,最適于描述門級電路。

(2)設計要求。用VHDL進行電子系統(tǒng)設計時可以不了解電路的結(jié)構(gòu)細節(jié),設計者所做的工作較少;用Verilog和ABEL語言進行電子系統(tǒng)設計時需了解電路的結(jié)構(gòu)細節(jié),設計者需做大量的工作。3.1概述4

(3)綜合過程。任何一種語言源程序,最終都要轉(zhuǎn)換成門電路級才能被布線器或適配器所接受。因此,VHDL語言源程序的綜合通常要經(jīng)過行為級→RTL級→門電路級的轉(zhuǎn)化,它幾乎不能直接控制門電路的生成,而Verilog語言和ABEL語言源程序的綜合過程要稍簡單,即經(jīng)過RTL級→門電路級的轉(zhuǎn)化,易于控制電路資源。

(4)對綜合器的要求。VHDL描述語言層次較高,不易控制底層電路,因而對綜合器的性能要求較高;Verilog和ABEL對綜合器的性能要求較低。

(5)支持的EDA工具。支持VHDL和Verilog的EDA工具很多,但支持ABEL的綜合器僅僅DATAIO一家。

(6)國際化程度。VHDL和Verilog已成為IEEE標準;ABEL正朝國際化標準努力。53.1.2VHDL程序設計的優(yōu)點

VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,誕生于1982年。1987年底,VHDL被IEEE(TheInstituteofElectricalandElectronicsEngineers)和美國國防部確認為標準硬件描述語言。自IEEE公布了VHDL的標準版本(IEEE-1076)之后,VHDL在電子設計領域得到了廣泛的接受,并逐步取代了原有的非標準硬件描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標準的1076–1993版本。應用VHDL進行工程設計的優(yōu)點如下:

6

(1)與其他的硬件描述語言相比,VHDL具有更強的行為描述能力。

(2)VHDL具有豐富的仿真語句和庫函數(shù),可在任何大系統(tǒng)的設計早期查驗設計系統(tǒng)的功能可行性,隨時可對系統(tǒng)進行仿真模擬以便對整個工程的結(jié)構(gòu)和功能可行性做出判斷。

(3)VHDL語句的行為描述能力和程序結(jié)構(gòu),決定了它具有支持大規(guī)模設計的分解和已有設計的再利用功能。

(4)用VHDL完成一個確定的設計,可利用EDA工具進行邏輯綜合和優(yōu)化,并自動把VHDL描述設計轉(zhuǎn)變成門級網(wǎng)表。

(5)VHDL對設計的描述具有相對獨立性。

(6)VHDL具有類屬描述語句和子程序調(diào)用等功能,對于完成的設計,在不改變源程序的條件下,只需改變類屬參量或函數(shù),就能輕易地改變設計的規(guī)模和結(jié)構(gòu)。7

3.1.3VHDL程序設計約定本書對VHDL程序設計特作如下約定:

(1)語句結(jié)構(gòu)描述中方括號“[]”內(nèi)的內(nèi)容為可選內(nèi)容。

(2)對于VHDL的編譯器和綜合器來說,程序文字的大小寫是不加區(qū)分的。

(3)程序中的注釋使用雙橫線“--”。

(4)為了便于程序的閱讀與調(diào)試,書寫和輸入程序時,使用層次縮進格式,同一層次的對齊,低層次的,較高層次的縮進兩個字符。

(5)為了使同一個VHDL源程序文件能適應各個EDA開發(fā)軟件的使用要求,建議各個源程序文件的命名均與其實體名一致。83.2VHDL程序基本結(jié)構(gòu)

3.2.1VHDL程序設計舉例

使用VHDL語言設計一個硬件電路時,需要描述的信息:①設計是在什么規(guī)范范圍內(nèi)設計的,亦即此設計符合某個設計規(guī)范,能得到大家的認可,這就是庫、程序包使用說明;②所設計的硬件電路與外界的接口信號,這就是設計實體的說明;③所設計的硬件電路其內(nèi)部各組成部分的邏輯關系以及整個系統(tǒng)的邏輯功能,這就是該設計實體對應的結(jié)構(gòu)體說明。其中,庫、程序包使用說明用于打開(調(diào)用)本設計實體將要用到的庫、程序包;實體說明用于描述該設計實體與外界的接口信號說明,是可視部分;結(jié)構(gòu)體說明用于描述該設計實體內(nèi)部工作的邏輯關系,是不可視部分。9【例3.1】74LS00的VHDL設計過程。

1.設計思路

根據(jù)數(shù)字電子技術(shù)的知識,我們知道,74LS00是一個四—2輸入與非門,亦即該芯片由四個2輸入與非門組成,因此我們設計時可先設計一個2輸入與非門,再由四個2輸入與非門構(gòu)成一個整體——MY74LS00。圖3.1MY74LS00的設計過程示意圖102.VHDL源程序(1)2輸入與非門MYNAND2的邏輯描述--IEEE庫及其中程序包的使用說明LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--實體MYNAND2的說明ENTITYMYNAND2ISPORT(A,B:INSTD_LOGIC;

Y:OUTSTD_LOGIC);ENDENTITYMYNAND2;--實體NAND2的結(jié)構(gòu)體ART1的說明ARCHITECTUREART1OFMYNAND2ISBEGINY<=ANANDB;ENDARCHITECTUREART1;11

(2)MY74LS00的邏輯描述--IEEE庫及其中程序包的使用說明LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;--實體MY74LS00的說明ENTITYMY74LS00ISPORT(A1,B1,A2,B2:INSTD_LOGIC;

A3,B3,A4,B4:INSTD_LOGIC;

Y1,Y2,Y3,Y4:OUTSTD_LOGIC);ENDENTITYMY74LS00;12--實體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;13

3.2.2VHDL程序的基本結(jié)構(gòu)一個相對完整的VHDL程序(或稱為設計實體)具有如圖3.2所示的比較固定的結(jié)構(gòu),即至少應包括三個基本組成部分:庫、程序包使用說明,實體說明和實體對應的結(jié)構(gòu)體說明。圖3.2VHDL程序設計基本結(jié)構(gòu)143.2.3庫、程序包使用說明在利用VHDL進行工程設計中,為了提高設計效率以及使設計遵循某些統(tǒng)一的語言標準或數(shù)據(jù)格式,有必要將一些有用的信息匯集在一個或幾個庫中以供調(diào)用。這些信息可以是預先定義好的數(shù)據(jù)類型、子程序等設計單元的集合體(程序包),或預先設計好的各種設計實體(元件庫程序包)。因此,可以把庫看成是一種用來存儲預先完成的程序包和數(shù)據(jù)集合體的倉庫。為了使已定義的常數(shù)、數(shù)據(jù)類型、元件調(diào)用說明以及子程序能被更多的VHDL設計實體方便地訪問和共享,可以將它們收集在一個VHDL程序包中。多個程序包可以并入一個VHDL庫中,使之適用于更一般的訪問和調(diào)用范圍。這一點對于大系統(tǒng)開發(fā),多個或多組開發(fā)人員并行工作顯得尤為重要。

151.庫的種類

VHDL程序設計中常用的庫有4種。

(1)?IEEE庫

IEEE庫是VHDL設計中最為常見的庫,它包含有IEEE標準的程序包和其他一些支持工業(yè)標準的程序包。IEEE庫中的標準程序包主要包括STD_LOGIC_1164,NUMERIC_BIT和NUMERIC_STD等程序包。其中的STD_LOGIC_1164是最重要的最常用的程序包,大部分基于數(shù)字系統(tǒng)設計的程序包都是以此程序包中設定的標準為基礎的。16

此外,還有一些程序包雖非IEEE標準,但由于其已成事實上的工業(yè)標準,也都并入了IEEE庫。這些程序包中,最常用的是Synopsys公司的STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。目前流行于我國的大多數(shù)EDA工具都支持Synopsys公司程序包。一般基于大規(guī)模可編程邏輯器件的數(shù)字系統(tǒng)設計,IEEE庫中的4個程序包STD_LOGIC_1164、STD_LOGIC_ARITH、STD_LOGIC_SIGNED和STD_LOGIC_UNSIGNED已經(jīng)足夠使用。另外需要注意的是,在IEEE庫中符合IEEE標準的程序包并非符合VHDL語言標準,如STD_LOGIC_1164程序包,因此在使用VHDL設計實體的前面必須以顯式表達出來。17(2)?STD庫

VHDL語言標準定義了兩個標準程序包:STANDARD和TEXTIO程序包,它們都被收入在STD庫中。只要在VHDL應用環(huán)境中,可隨時調(diào)用這兩個程序包中的所有內(nèi)容,即在編譯和綜合過程中,VHDL的每一項設計都自動地將其包含進去了。由于STD庫符合VHDL語言標準,在應用中不必如IEEE庫那樣以顯式表達出來。

(3)?WORK庫

WORK庫是用戶的VHDL設計的現(xiàn)行工作庫,用于存放用戶設計和定義的一些設計單元和程序包。因此自動滿足VHDL語言標準,在實際調(diào)用中,不必以顯式預先說明。18(4)?VITAL庫

VITAL庫是各FPGA/CPLD生產(chǎn)廠商提供的面向ASIC的邏輯門庫。使用VITAL庫,可以提高VHDL門級時序模擬的精度,因而只在VHDL仿真器中使用。庫中包含時序程序包VITAL_TIMING和VITAL_PRIMITIVES。VITAL程序包已經(jīng)成為IEEE標準,在當前的VHDL仿真器的庫中,VITAL庫中的程序包都已經(jīng)并到IEEE庫中。實際上,由于各FPGA/CPLD生產(chǎn)廠商的適配工具都能為各自的芯片生成帶時序信息的VHDL門級網(wǎng)表,用VHDL仿真器仿真該網(wǎng)表可以得到非常精確的時序仿真結(jié)果。因此,基于實用的觀點,在FPGA/CPLD設計開發(fā)過程中,一般并不需要VITAL庫中的程序包。192.程序包的種類

(1)?STD_LOGIC_1164程序包它是IEEE庫中最常用的程序包,是IEEE的標準程序包。其中用得最多和最廣的是STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中多值邏輯設計結(jié)構(gòu)。

(2)?STD_LOGIC_ARITH程序包它預先編譯在IEEE庫中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎上擴展了三個數(shù)據(jù)類型UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關的算術(shù)運算符和轉(zhuǎn)換函數(shù)。

20(3)STD_LOGIC_UNSIGNED、STD_LOGIC_SIGNED程序包它們都是Synopsys公司的程序包,都預先編譯在IEEE庫中。該程序包重載了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合運算的運算符,并定義了一個由STD_LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。

(4)?STANDARD和TEXTIO程序包它們是STD庫中的預編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類型、子類型和函數(shù)。它是VHDL標準程序包,實際應用中已隱性地打開了,故不必再用USE語句另作聲明。TEXTIO程序包定義了支持文本文件操作的許多類型和子程序。在使用本程序包之前,需加語句USESTD.TEXTIO.ALL。21

關于這些庫和程序包,我們可在EDA軟件相關的地方找到。比如QuartusⅡ8.0軟件中,通過如下路徑D:\altera\80\quartus\libraries\vhdl\ieee\std_1164.vhd可找到對應的庫和程序包,如圖3.3和圖3.4所示。圖3.3QuartusⅡ8.0中庫的位置圖223.4QuartusⅡ8.0中程序包的位置圖233.庫、程序包的使用在VHDL語言中,庫的說明語句總是放在實體單元前面,而且?guī)煺Z言一般必須與USE語言同用。庫語言關鍵詞LIBRARY,指明所使用的庫名。USE語句指明庫中的程序包。一旦說明了庫和程序包,整個設計實體都可進入訪問或調(diào)用,但其作用范圍僅限于所說明的設計實體。VHDL要求一項含有多個設計實體的更大的系統(tǒng),每一個設計實體都必須有自己完整的庫說明語句和USE語句。

USE語句的使用將使所說明的程序包對本設計實體部分全部開放,即是可視的。USE語句的使用有兩種常用格式:24USE庫名.程序包名.項目名;

USE庫名.程序包名.ALL;第一語句格式的作用是,向本設計實體開放指定庫中的特定程序包內(nèi)所選定的項目。第二語句格式的作用是,向本設計實體開放指定庫中的特定程序包內(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)容。25

【例3.3】庫和程序包的使用實例。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;USEIEEE.STD_LOGIC_1164.RISING_EDGE;

此例中向當前設計實體開放了STD_LOGIC_1164程序包中的RISING_EDGE函數(shù)。但由于此函數(shù)需要用到數(shù)據(jù)類型STD_ULOGIC,所以在上一條USE語句中開放了同一程序包中的這一數(shù)據(jù)類型。26

3.2.4實體(ENTITY)

實體是一個設計實體的表層設計單元,其功能是對這個設計實體與外部電路進行接口描述。它規(guī)定了設計單元的輸入/輸出接口信號或引腳,是設計實體經(jīng)封裝后對外的一個通信界面。

1.實體語句結(jié)構(gòu)

ENTITY實體名IS[GENERIC(類屬表);][PORT(端口表);]END[ENTITY][實體名];其中實體說明單元必須以語句“ENTITY實體名IS”開始,以語句“ENDENTITY實體名;”結(jié)束,其中的實體名是設計者自己給設計實體的命名,可作為其他設計實體對該設計實體進行調(diào)用時用。27

2.類屬(GENERIC)說明語句

類屬(GENERIC)參量是一種端口界面常數(shù),常以一種說明的形式放在實體或塊結(jié)構(gòu)體前的說明部分。因此,設計者可以從外面通過類屬參量的重新設定而容易地改變一個設計實體或一個元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模。類屬說明的一般書寫格式如下:

GENERIC([常數(shù)名:數(shù)據(jù)類型[:設定值]{;常數(shù)名:數(shù)據(jù)類型[:=設定值]});在一個實體中定義的、可以通過GENERIC參數(shù)類屬的說明,為它創(chuàng)建多個行為不同的邏輯結(jié)構(gòu)。比較常見的情況是選用類屬來動態(tài)規(guī)定一個實體端口的大小,或設計實體的物理特性,或結(jié)構(gòu)體中的總線寬度,或設計實體中、底層中同種元件的例化數(shù)量等。283.PORT端口說明

由PORT引導的端口說明語句是對于一個設計實體界面的說明。實體端口說明的一般書寫格式如下:

PORT(端口名:端口模式數(shù)據(jù)類型;

{端口名:端口模式數(shù)據(jù)類型});其中,端口名是設計者為實體的每一個對外通道所取的名字;端口模式是指這些通道上的數(shù)據(jù)流動方式,如輸入或輸出等;數(shù)據(jù)類型是指端口上流動的數(shù)據(jù)的表達格式。

IEEE1076標準包中定義了四種常用的端口模式,各端口模式的功能及符號分別見表3.1和圖3.3。在實用中,端口描述中的數(shù)據(jù)類型主要有兩類:位(BIT)和位矢量(BIT_VECTOR)。29303.2.5結(jié)構(gòu)體(ARCHITECTURE)

結(jié)構(gòu)體是用于描述設計實體的內(nèi)部結(jié)構(gòu)以及實體端口間的邏輯關系。一般地,一個完整的結(jié)構(gòu)體由兩個基本層次組成:(1)對數(shù)據(jù)類型、常數(shù)、信號、子程序和元件等元素的說明部分。(2)描述實體邏輯行為的,以各種不同的描述風格表達的功能描述語句。結(jié)構(gòu)體將具體實現(xiàn)一個實體。每個實體可以有多個結(jié)構(gòu)體,每個結(jié)構(gòu)體對應著實體不同結(jié)構(gòu)和算法實現(xiàn)方案,并且其地位是同等的,它們完整地實現(xiàn)了實體的行為,但同一結(jié)構(gòu)體不能為不同的實體所擁有。結(jié)構(gòu)體不能單獨存在,它必須有一個界面說明,即一個實體。對于具有多個結(jié)構(gòu)體的實體,必須用ONFIGURATION(配置)語句指明用于綜合的結(jié)構(gòu)體和用于仿真的結(jié)構(gòu)體。31

1.結(jié)構(gòu)體的一般語句格式

ARCHITECTURE結(jié)構(gòu)體名OF實體名IS[說明語句;]BEGIN[功能描述語句;]END[ARCHITECTURE][結(jié)構(gòu)體名];

2.結(jié)構(gòu)體說明語句結(jié)構(gòu)體中的說明語句是對結(jié)構(gòu)體的功能描述語句中將要用到的信號(SIGNAL)、數(shù)據(jù)類型(TYPE)、常數(shù)(CONSTANT)、元件(COMPONENT)、函數(shù)(FUNCTION)和過程(PROCEDURE)等加以說明的語句。323.功能描述語句結(jié)構(gòu)

(1)塊語句是由一系列并行執(zhí)行語句構(gòu)成的組合體,它的功能是將結(jié)構(gòu)體中的并行語句組成一個或多個模塊。

(2)進程語句定義順序語句模塊,用以將從外部獲得的信號值,或內(nèi)部的運算數(shù)據(jù)向其他的信號進行賦值。

(3)信號賦值語句將設計實體內(nèi)的處理結(jié)果向定義的信號或界面端口進行賦值。

(4)子程序調(diào)用語句用于調(diào)用一個已設計好的子程序。

(5)元件例化語句對其他的設計實體作元件調(diào)用說明,并將此元件的端口與其他的元件、信號或高層次實體的界面端口進行連接。以上語句是以并行方式工作,而在每一語句結(jié)構(gòu)內(nèi)部可能含有并行運行的或順序運行的邏輯描述語句。33

3.2.6結(jié)構(gòu)體配置

配置可以把特定的結(jié)構(gòu)體指定給一個確定的實體。通常在大而復雜的VHDL工程設計中,配置語句可以為實體指定或配置一個結(jié)構(gòu)體。如可利用配置使仿真器為同一實體配置不同的結(jié)構(gòu)體以使設計者比較不同結(jié)構(gòu)體的仿真差別,或者為例化的各元件實體配置指定的結(jié)構(gòu)體,從而形成一個所希望的例化元件層次構(gòu)成的設計實體。配置也是VHDL設計實體中的一個基本單元,在綜合或仿真中,可以利用配置語句為確定整個設計提供許多有用信息。配置語句還能用于對元件的端口連接進行重新安排等。34VHDL綜合器允許將配置規(guī)定為一個設計實體中的最高層設計單元,但只支持對最頂層的實體進行配置。配置語句的一般格式如下:

CONFIGURATION配置名OF實體名IS

配置說明;

END[CONFIGURATION][配置名];配置主要為頂層設計實體指定結(jié)構(gòu)體,或為參與例化的元件實體指定所希望的結(jié)構(gòu)體,以層次方式來對元件例化作結(jié)構(gòu)配置。如前所述,每個實體可以擁有多個不同的結(jié)構(gòu)體,而每個結(jié)構(gòu)體的地位是相同的,在這種情況下,可以利用配置說明為這個實體指定一個結(jié)構(gòu)體。35

【例3.4】配置語句的應用實例。--MYNAND.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMYNANDISPORT(A:INSTD_LOGIC;B:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDENTITYMYNAND;ARCHITECTUREART1OFMYNANDISBEGINC<=NOT(AANDB);ENDARCHITECTUREART1;36

ARCHITECTUREART2OFMYNANDISBEGINC<='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;CONFIGURATIONCFG2OFMYNANDISFORART2ENDFOR;ENDCONFIGURATIONCFG2;--CONFIGURATIONCFG1OFMYNANDIS--FORART1--ENDFOR;--ENDCONFIGURATIONCFG1;37

--RSCFQ.VHDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYRSCFQISPORT(R:INSTD_LOGIC;S:INSTD_LOGIC;Q:BUFFERSTD_LOGIC;NQ:BUFFERSTD_LOGIC);ENDENTITYRSCFQ;ARCHITECTUREARTOFRSCFQISCOMPONENTMYNANDISPORT(A:INSTD_LOGIC;B:INSTD_LOGIC;C:OUTSTD_LOGIC);ENDCOMPONENTMYNAND;38

BEGINU1:MYNANDPORTMAP(A=>S,B=>NQ,C=>Q);U2:MYNANDPORTMAP(A=>Q,B=>R,C=>NQ);ENDARCHITECTUREART;CONFIGURATIONCFGOFRSCFQISFORARTFORU1,U2:MYNANDUSEENTITYWORK.MYNAND(ART2);ENDFOR;ENDFOR;ENDCONFIGURATIONCFG;393.3VHDL語言要素

VHDL的語言要素,作為硬件描述語言的基本結(jié)構(gòu)元素,主要有數(shù)據(jù)對象(DataObject,簡稱Object),數(shù)據(jù)類型(DataType,簡稱Type)和各類操作數(shù)(Operands)及運算操作符(Operator)。

3.3.1VHDL文字規(guī)則

VHDL文字(Literal)主要包括數(shù)值和標識符。數(shù)值型文字主要有數(shù)字型、字符串型和位串型等。

1.數(shù)字型文字

(1)整數(shù)文字:如:678。

(2)實數(shù)文字:如:188.993。40(3)以數(shù)制基數(shù)表示的文字:用這種方式表示的數(shù)由五個部分組成。第一部分,用十進制數(shù)標明數(shù)制進位的基數(shù);第二部分,數(shù)制隔離符號“#”;第三部分,表達的文字;第四部分,指數(shù)隔離符號“#”;第五部分,用十進制表示的指數(shù)部分,這一部分的數(shù)如果是0可以省去不寫?,F(xiàn)舉例如下:

16#E#E1--(十六進制數(shù),等于2#11100000#,等于224)2#1111_1110#--(二進制數(shù)表示,等于254)16#F.01#E+2--(十六進制數(shù)表示,等于3841.00)(4)物理量文字(VHDL綜合器不接受此類文字)。如:60s(60秒),100m(100米),kΩ(千歐姆)41

2.字符串型文字字符是用單引號引起來的ASCII字符,可以是數(shù)值,也可以是符號或字母,如:‘R’,‘A’,‘*’,‘Z’。字符串則是一維的字符數(shù)組,須放在雙引號中,包括:(1)文字字符串:文字字符串是用雙引號引起來的一串文字,如:“ERROR”,“BB$CC”。

(2)數(shù)位字符串:數(shù)位字符串也稱位矢量,是預定義的數(shù)據(jù)類型BIT的一維數(shù)組,其位矢量的長度即為等值的二進制數(shù)的位數(shù)。數(shù)位字符串的表示首先要有計算基數(shù),然后將該基數(shù)表示的值放在雙引號中,基數(shù)符以“B”(2進制)、“O”

”(8進制)和“X”

”(16進制)表示,并放在字符串的前面。例如:B“1_1101_1110”--二進制數(shù)數(shù)組,位矢長度是9;X“AD0”--十六進制數(shù)數(shù)組,位矢長度是12。42

3.標識符標識符用來定義常數(shù)、變量、信號、端口、子程序或參數(shù)的名字。

VHDL的基本標識符就是以英文字母開頭,不連續(xù)使用下劃線“_”,不以下劃線“_”結(jié)尾的,由26個大小寫英文字母、數(shù)字0~9以及下劃線“_”組成的字符串。

VHDL’93標準還支持擴展標識符,但是目前仍有許多VHDL工具不支持擴展標識符。標識符中的英語字母不分大小寫。VHDL的保留字不能用于作為標識符使用。如:DECODER_1,F(xiàn)FT,Sig_N,NOT_ACK,State0,Idle是合法的標識符;而_DECODER_1,2FFT,SIG_#N,NOT-ACK,RYY_RST_,data__BUS,RETURN則是非法的標識符。434.下標名及下標段名含義:下標名用于指示數(shù)組型變量或信號的某一元素,而下標段名則用于指示數(shù)組型變量或信號的某一段元素。語句格式:數(shù)組類型信號名或變量名(表達式1[TO/DOWNTO表達式2]);

【例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); --以段的方式進行賦值

44

3.3.2VHDL數(shù)據(jù)對象在VHDL中,數(shù)據(jù)對象(DataObjects)類似于一種容器,它接受不同數(shù)據(jù)類型的賦值。數(shù)據(jù)對象有三種,即常量(CONSTANT)、變量(VARIABLE)和信號(SIGNAL)。其中信號是具有更多的硬件特征的特殊數(shù)據(jù)對象,是VHDL中最有特色的語言要素之一。

1.常量(CONSTANT)

常量的定義和設置主要是為了使設計實體中的常數(shù)更容易閱讀和修改。例如,將位矢的寬度定義為一個常量,只要修改這個常量就能很容易地改變寬度,從而改變硬件結(jié)構(gòu)。在程序中,常量具有全局意義。

常量的定義形式:CONSTANT常量名:數(shù)據(jù)類型:=表達式;45

【例3.6】常量使用示例。

CONSTANTFBUS﹕BIT_VECTOR(5DOWNTO0):=“010111”;

CONSTANTVCC﹕REAL:=5.0;

CONSTANTDELY﹕TIME:=25ns;

VHDL要求所定義的常量數(shù)據(jù)類型必須與表達式的數(shù)據(jù)類型一致。常量的數(shù)據(jù)類型可以是標量類型或復合類型,但不能是文件類型(File)或存取類型(Access)。

常量定義語句所允許的設計單元有實體、結(jié)構(gòu)體、程序包、塊、進程和子程序。在程序包中定義的常量可以暫不設具體數(shù)值,它可以在程序包體中設定。

常量的可視性,即常量的使用范圍取決于它被定義的位置。46

2.變量(VARIABLE)

變量是一個局部量,只能在進程和子程序中使用。變量不能將信息帶出對它作出定義的當前設計單元。變量的賦值是一種理想化的數(shù)據(jù)傳輸,是立即發(fā)生的。

定義格式:VARIABLE變量名:數(shù)據(jù)類型:=初始值;

【例3.7】變量使用示例。

VARIABLEA:INTEGER; --定義A為整數(shù)型變量

VARIABLEB,C:INTEGER:=2; --定義B和C為整型變量,初始值為2

變量作為局部量,其適用范圍僅限于定義了變量的進程或子程序中。仿真過程中惟一的例外是共享變量。變量定義語句中的初始值可以是一個與變量具有相同數(shù)據(jù)類型的常數(shù)值,也可以是一個全局靜態(tài)表達式。

賦值語句的語法格式:目標變量名:=表達式;賦值語句的用法見3.4節(jié)。47

3.信號(SIGNAL)

信號是描述硬件系統(tǒng)的基本數(shù)據(jù)對象,它類似于連接線。信號可以作為設計實體中并行語句模塊間的信息交流通道。在VHDL中,信號及其相關的信號賦值語句、決斷函數(shù)、延時語句等很好地描述了硬件系統(tǒng)的許多基本特征。

信號作為一種數(shù)值容器,不但可以容納當前值,也可以保持歷史值。這一屬性與觸發(fā)器的記憶功能有很好的對應關系。

信號的定義格式:SIGNAL信號名:數(shù)據(jù)類型:=初始值;

信號初始值的設置不是必需的,而且初始值僅在VHDL的行為仿真中有效。與變量相比,信號的硬件特征更為明顯,它具有全局性特性。48

【例3.8】信號定義示例。

SIGNALS1:STD_LOGIG:=0; --定義了一個標準位的單值信號S1,初始值為低電平

SIGNALS2,S3:BIT;--定義了兩個為BIT的信號S2和S3SIGNALS4:STD_LOGIC_VECTOR(15DOWNTO0); --定義了一個標準位矢的位矢量(數(shù)組、總--線)信號,共有16個信號元素

信號的使用和定義范圍是實體、結(jié)構(gòu)體和程序包。

信號的賦值語句格式:目標信號名<=表達式;其賦值語句的用法見3.4節(jié)。49

4.三者的使用比較

(1)從硬件電路系統(tǒng)來看,常量相當于電路中的恒定電平,如GND或VCC接口,而變量和信號則相當于組合電路系統(tǒng)中門與門間的連接及其連線上的信號值。

(2)從行為仿真和VHDL語句功能上看,信號和變量的區(qū)別主要表現(xiàn)在接受和保持信息的方式、信息保持與傳遞的區(qū)域大小上。

(3)從綜合后所對應的硬件電路結(jié)構(gòu)來看,信號一般將對應更多的硬件結(jié)構(gòu),但在許多情況下,信號和變量并沒有什么區(qū)別。

(4)雖然VHDL仿真器允許變量和信號設置初始值,但在實際應用中,VHDL綜合器并不會把這些信息綜合進去。

50

3.3.3VHDL數(shù)據(jù)類型

VHDL是一種強類型語言,要求設計實體中的每一個常數(shù)、信號、變量、函數(shù)以及設定的各種參量都必須具有確定的數(shù)據(jù)類型,并且只有數(shù)據(jù)類型相同的量才能互相傳遞和作用。VHDL作為強類型語言的好處是能使VHDL編譯或綜合工具很容易地找出設計中的各種常見錯誤。VHDL設計成一種強類型語言的目的是為了保證硬件設計的唯一性。

從數(shù)據(jù)類型的構(gòu)成VHDL數(shù)據(jù)類型可分成四大類:標量型(SCALARTYPE),復合類型(COMPOSITETYPE),存取類型(ACCESSTYPE),文件類型(FILESTYPE)。

從數(shù)據(jù)類型能否直接使用,VHDL數(shù)據(jù)類型可分為兩種:預定義數(shù)據(jù)類型和用戶自定義數(shù)據(jù)類型。51

1.VHDL的預定義數(shù)據(jù)類型

VHDL的預定義數(shù)據(jù)類型都是在VHDL標準程序包STANDARD中定義的,在實際使用中,已自動包含進VHDL的源文件中,因而不必通過USE語句以顯式調(diào)用。

1)布爾(BOOLEAN)數(shù)據(jù)類型程序包STANDARD中定義布爾數(shù)據(jù)類型的源代碼如下:

TYPEBOOLEANIS(FALSE,TRUE);

布爾數(shù)據(jù)類型實際上是一個二值枚舉型數(shù)據(jù)類型,它的取值有FALSE和TRUE兩種。例如,當A大于B時,在IF語句中的關系運算表達式(A>B)的結(jié)果是布爾量TRUE,反之為FALSE。綜合器將其變?yōu)?或0信號值,對應于硬件系統(tǒng)中的一根線。52

2)位(BIT)數(shù)據(jù)類型

位數(shù)據(jù)類型也屬于枚舉型,取值只能是1或0。在程序包STANDARD中定義的源代碼是:TYPEBITIS(‘0’,‘1’);

3)位矢量(BIT_VECTOR)數(shù)據(jù)類型位矢量只是基于BIT數(shù)據(jù)類型的數(shù)組,在程序包STANDARD中定義的源代碼是:TYPEBIT_VETORISARRAY(NATURARANGE<>)OFBIT;

4)字符(CHARACTER)數(shù)據(jù)類型

5)整數(shù)(INTEGER)數(shù)據(jù)類型

6)自然數(shù)(NATURAL)和正整數(shù)(POSITIVE)數(shù)據(jù)類型

...10)錯誤等級(SEVERITY_LEVEL)53

2.IEEE預定義標準邏輯位與矢量在IEEE庫的程序包STD_LOGIC_1164中,定義了兩個非常重要的數(shù)據(jù)類型,即標準邏輯位STD_LOGIC和標準邏輯矢量STD_LOGIC_VECTOR。

1)標準邏輯位STD_LOGIC數(shù)據(jù)類型在IEEE庫程序包STD_LOGIC_1164中STD_LOGIC的定義如下:

TYPESTD_LOGICIS('U','X',‘0’,'1','Z','W','L','H','-');各值的含義是:‘U’--未初始化的,‘X’--強未知的,‘0’--強0,‘1’--強1,‘Z’--高阻態(tài),‘W’--弱未知的,‘L’--弱0,‘H’--弱1,‘-’--忽略。54

在程序中使用此數(shù)據(jù)類型前,需加入下面的語句:

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

在條件語句中,如果未考慮到STD_LOGIC的所有可能的取值情況,綜合器可能會插入不希望的鎖存器。在仿真和綜合中,STD_LOGIC值是非常重要的,它可以使設計者精確模擬一些未知和高阻態(tài)的線路情況。對于綜合器,高阻態(tài)和“-”忽略態(tài)可用于三態(tài)的描述。但就綜合而言,STD_LOGIC型數(shù)據(jù)能夠在數(shù)字器件中實現(xiàn)的只有其中的4種值,即“-”、“0”、“1”和“Z”。

2)標準邏輯矢量(STD_LOGIC_VECTOR)數(shù)據(jù)類型

STD_LOGIC_VECTOR類型定義如下:

TYPESTD_LOGIC_VECTORISARRAY(NATURARANGE<>)OFSTD_LOGIC;55

3.其他預定義標準數(shù)據(jù)類型

VHDL綜合工具配帶的擴展程序包中,定義了一些有用的類型。如Synopsys公司在IEEE庫中加入的程序包STD_LOGIC_ARITH中定義了如下的數(shù)據(jù)類型:無符號型(UNSIGNED)、有符號型(SIGNED)和小整型(SMALL_INT)。在程序包STD_LOGIC_ARITH中的類型定義如下:

TYPEUNSIGNEDISARRAY(NATURARANGE<>)OFSTD_LOGIC;

TYPESIGNEDISARRAY(NATURARANGE<>)OFSTD_LOGIC;

SUBTYPESMALL_INTISINTEGERRANGE0TO1;在使用之前,請注意必須加入下面的語句:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_ARITH.ALL;56

1)無符號數(shù)據(jù)類型(UNSIGNEDTYPE)

UNSIGNED數(shù)據(jù)類型代表一個無符號的數(shù)值,在綜合器中,這個數(shù)值被解釋為一個二進制數(shù),這個二進制數(shù)的最左位是其最高位。

VARIABLEVAR﹕UNSIGNED(0TO10);

SIGNALSIG﹕UNSIGNED(5TO0);其中VAR的最高位是VAR(0),SIG的最高位是SIG(5)。

2)有符號數(shù)據(jù)類型(SIGNEDTYPE)

SIGNED數(shù)據(jù)類型表示一個有符號的數(shù)值,綜合器將其解釋為補碼,此數(shù)的最高位是符號位,例如:SIGNED(“0101”)代表+5,5;SIGNED(“1011”)代表-5。如:VARIABLEVAR﹕SIGNED(0TO10);其中最左位VAR(0)是符號位。57

4.用戶自定義數(shù)據(jù)類型方式

VHDL允許用戶自行定義新的數(shù)據(jù)類型,它們可以有多種,如枚舉類型(ENUMERA-TIONTYPE)、整數(shù)類型(INTEGERTYPE)、數(shù)組類型(ARRAYTYPE)、記錄類型(RECORDTYPE)、時間類型(TIMETYPE)、實數(shù)類型(REATYPE)等。用戶自定義數(shù)據(jù)類型是用類型定義語句TYPE和子類型定義語句SUBTYPE實現(xiàn)的。

1)TYPE語句用法

TYPE數(shù)據(jù)類型名IS數(shù)據(jù)類型定義[OF基本數(shù)據(jù)類型];其中,數(shù)據(jù)類型名由設計者自定;數(shù)據(jù)類型定義部分用來描述所定義的數(shù)據(jù)類型的表達方式和表達內(nèi)容;關鍵詞OF后的基本數(shù)據(jù)類型是指數(shù)據(jù)類型定義中所定義的元素的基本數(shù)據(jù)類型,一般都是取已有的預定義數(shù)據(jù)類型,如BIT、STD_LOGIC或INTEGER等。

58

以下列出了兩種不同的定義方式:

TYPEST1ISARRAY(0TO15)OFSTD_LOGIC;

TYPEWEEKIS(SUN,MON,TUE,WED,THU,F(xiàn)RI,SAT);

2)SUBTYPE語句用法

子類型SUBTYPE只是由TYPE所定義的原數(shù)據(jù)類型的一個子集,它滿足原數(shù)據(jù)類型的所有約束條件,原數(shù)據(jù)類型稱為基本數(shù)據(jù)類型。子類型SUBTYPE的語句格式如下:

SUBTYPE子類型名IS基本數(shù)據(jù)RANGE約束范圍;如:SUBTYPEDIGITSINTEGERRANGE0TO9;例中,INTEGER是標準程序包中已定義過的數(shù)據(jù)類型,子類型DIGITS只是把INTEGER約束到只含10個值的數(shù)據(jù)類型。59

5.枚舉類型

VHDL中的枚舉數(shù)據(jù)類型是用文字符號來表示一組實際的二進制數(shù)的類型(若直接用數(shù)值來定義,則必須使用單引號)。

【例3.9】枚舉數(shù)據(jù)類型定義示例。

TYPEM_STATEIS(STATE1,STATE2,STATE3,STATE4,STATE5);

SIGNALCURRENT_STATE,NEXT_STATE:M_STATE;信號CURRENT_STATE和NEXT_STATE的數(shù)據(jù)類型定義為M_STATE,它們的取值范圍是可枚舉的,即從STATE1~STATE5共五種,而這些狀態(tài)代表五組惟一的二進制數(shù)值。

60

在綜合過程中,枚舉類型文字元素的編碼通常是自動的,編碼順序是默認的,一般將第一個枚舉量(最左邊的量)編碼為0,以后的依次加1。綜合器在編碼過程中自動將第一枚舉元素轉(zhuǎn)變成位矢量,位矢的長度將取所需表達的所有枚舉元素的最小值。如上例中用于表達5個狀態(tài)的位矢長度應該為3,編碼默認值為如下方式:STATE1=‘000’;STATE2=‘001’;STATE3=‘010’;STATE4=‘011’;STATE5=‘100’;于是它們的數(shù)值順序便成為STATE1<STATE2<STATE3<STATE4<STATE5。一般而言,編碼方法因綜合器不同而不同。為了某些特殊的需要,編碼順序也可以人為設置。61

6.整數(shù)類型和實數(shù)類型

整數(shù)和實數(shù)的數(shù)據(jù)類型在標準的程序包中已作了定義,但在實際應用中,特別在綜合中,由于這兩種非枚舉型的數(shù)據(jù)類型的取值定義范圍太大,綜合器無法進行綜合。

實際應用中,VHDL仿真器通常將整數(shù)或?qū)崝?shù)類型作為有符號數(shù)處理,VHDL綜合器對整數(shù)或?qū)崝?shù)的編碼方法是:對用戶已定義的數(shù)據(jù)類型和子類型中的負數(shù),編碼為二進制補碼;對用戶已定義的數(shù)據(jù)類型和子類型中的正數(shù),編碼為二進制原碼。62

編碼的位數(shù),即綜合后信號線的數(shù)目只取決于用戶定義的數(shù)值的最大值。在綜合中,以浮點數(shù)表示的實數(shù)將首先轉(zhuǎn)換成相應數(shù)值大小的整數(shù)。因此在使用整數(shù)時,VHDL綜合器要求使用數(shù)值限定關鍵詞RANGE,對整數(shù)的使用范圍作明確的限制。如下例所示。

【例3.10】整數(shù)數(shù)據(jù)類型定義綜合結(jié)果TYPEINT1ISRANGE0TO100;--7位二進制原碼TYPEINT2ISRANGE10TO100;--7位二進制原碼TYPEINT3ISRANGE–100TO100;--8位二進制補碼SUBTYPEINT4ISINT3RANGE0TO6;--3位二進制原碼63

7.數(shù)組類型數(shù)組類型屬復合類型,它是將一組具有相同數(shù)據(jù)類型的元素集合在一起,作為一個數(shù)據(jù)對象來處理的數(shù)據(jù)類型。數(shù)組可以是一維(每個元素只有一個下標)數(shù)組或多維數(shù)組(每個元素有多個下標)。VHDL仿真器支持多維數(shù)組,但VHDL綜合器只支持一維數(shù)組。數(shù)組的元素可以是任何一種數(shù)據(jù)類型,用以定義數(shù)組元素的下標范圍子句決定了數(shù)組中元素的個數(shù)以及元素的排序方向,即下標數(shù)是由低到高,或是由高到低。

VHDL允許定義兩種不同類型的數(shù)組,即限定性數(shù)組和非限定性數(shù)組。它們的區(qū)別是,限定性數(shù)組下標的取值范圍在數(shù)組定義時就被確定了,而非限定性數(shù)組下標的取值范圍需留待隨后根據(jù)具體數(shù)據(jù)對象再確定。64

限定性數(shù)組定義語句格式:

TYPE數(shù)組名ISARRAY(數(shù)組范圍)OF數(shù)據(jù)類型;其中,數(shù)組名是新定義的限定性數(shù)組類型的名稱,可以是任何標識符,其類型與數(shù)組元素相同;數(shù)組范圍明確指出數(shù)組元素的定義數(shù)量和排序方式,以整數(shù)來表示其數(shù)組的下標;數(shù)據(jù)類型即指數(shù)組各元素的數(shù)據(jù)類型。

【例3.11】限定性數(shù)組定義示例1。

TYPESTBISARRAY(7DOWNTO0)OFSTD_LOGIC;這個數(shù)組類型的名稱是STB,它有八個元素,它的下標排序是7,6,5,4,3,2,1,0,各元素的排序是STB(7),STB(6),…,STB(1),STB(0)。65

【例3.12】限定性數(shù)組定義示例2。

TYPEXIS(LOW,HIGH);

TYPEDATA_BUSISARRAY(0TO7,X)OFBIT;首先定義X為兩元素的枚舉數(shù)據(jù)類型,然后將DATA_BUS定義為一個數(shù)組類型,其中每一元素的數(shù)據(jù)類型是BIT。非限制性數(shù)組的定義語句格式如下:

TYPE數(shù)組名ISARRAY(數(shù)組下標名RANGE<>)OF數(shù)據(jù)類型;其中,數(shù)組名是定義的非限制性數(shù)組類型的取名;數(shù)組下標名是以整數(shù)類型設定的一個數(shù)組下標名稱;符號“<>”是下標范圍待定符號,用到該數(shù)組類型時,再填入具體的數(shù)值范圍;數(shù)據(jù)類型是數(shù)組中每一元素的數(shù)據(jù)類型。66

以下三例表達了非限制性數(shù)組類型的不同用法。

【例3.13】非限制性數(shù)組類型的不同用法。

TYPEBIT_VECTORISARRAY(NATURALRANE<>)OFBIT;

VARABLEVA:BIT_VECTOR(1TO6);--將數(shù)組取值范圍定在1~6【例3.14】非限制性數(shù)組類型的不同用法。

TYPEREAL_MATRIXISARRAY(POSITIVERANGE<>)OFREAL;

VARIABLEREAL_MATRIX_OBJECT:REAL_MATRIX(1TO8); --限定范圍

【例3.15】非限制性數(shù)組類型的不同用法。

TYPELOGIC_VECTORISARRAY(NATURALRANGE<>,POSITIVERANGE<>)OFLOGIC;

VARIABLEL16_OBJECT:LOGIC_VECTOR(0TO7,1TO2); --限定范圍67

8.記錄類型

由已定義的、數(shù)據(jù)類型不同的對象元素構(gòu)成的數(shù)組稱為記錄類型的對象。定義記錄類型的語句格式如下:

TYPE記錄類型名ISRECORD

元素名:元素數(shù)據(jù)類型;元素名:元素數(shù)據(jù)類型;

…ENDRECORD[記錄類型名];對于記錄類型的數(shù)據(jù)對象賦值的方式,可以是整體賦值也可以是對其中的單個元素進行賦值。在使用整體賦值方式時,可以有位置關聯(lián)方式或名字關聯(lián)方式兩種表達方式。如果使用了OTHERS選項,則至少應有一個元素被賦值,如果有兩個或更多的元素由OTHERS選項來賦值,則這些元素必須具有相同的類型。68

【例3.16】利用記錄類型定義的一個微處理器命令信息表。TYPEREGNAMEIS(AX,BX,CX,DX);TYPEOPERATIONISRECORDOPSTR﹕STRING(1TO10);

OPCODE﹕BIT_VECTOR(3DOWNTO0);

OP1,OP2,RES:REGNAME;ENDRECORDOPERATION;VARIABLEINSTR1,INSTR2:OPERATION;…INSTR1:=(“ADDAX,BX”,“0001”,AX,BX,AX);INSTR2:=(“ADDAX,BX”,“0010”,OTHERS=>BX);VARIABLEINSTR3﹕OPERATION;…INSTR3.OPSTR:=“MULAX,BX”;INSTR3.OP1:=AX;69

9.數(shù)據(jù)類型轉(zhuǎn)換由于VHDL是一種強類型語言,這就意味著即使對于非常接近的數(shù)據(jù)類型的數(shù)據(jù)對象,在相互操作時,也需要進行數(shù)據(jù)類型轉(zhuǎn)換。

1)類型轉(zhuǎn)換函數(shù)方式

類型轉(zhuǎn)換函數(shù)的作用就是將一種屬于某種數(shù)據(jù)類型的數(shù)據(jù)對象轉(zhuǎn)換成屬于另一種數(shù)據(jù)類型的數(shù)據(jù)對象。如DATAIO庫中的程序包STD_LOGIC_OPS中有兩個數(shù)據(jù)類型轉(zhuǎn)換函數(shù):TO_VECTOR和TO_INTEGER。利用類型轉(zhuǎn)換函數(shù)來進行類型的轉(zhuǎn)換需定義一個函數(shù),使其參數(shù)類型為被轉(zhuǎn)換的類型,返回值為轉(zhuǎn)換后的類型。這樣就可以自由地進行類型轉(zhuǎn)換。70【例3.17】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;LIBRARYDATAIO;USEDATAIO.STD_LOGIC_OPS.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;P:INOUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYCNT4;ARCHITECTUREARTOFCNT4ISBEGINPROCESS(CLK)ISBEGINIFCLK='1'ANDCLK'EVENTTHENP<=TO_VECTOR(2,TO_INTEGER(P)+1);ENDIF;ENDPROCESS;ENDARCHITECTUREART;71

2)直接類型轉(zhuǎn)換方式直接類型轉(zhuǎn)換的一般語句格式是:

數(shù)據(jù)類型標識符(表達式);一般情況下,直接類型轉(zhuǎn)換僅限于非常關聯(lián)的數(shù)據(jù)類型之間,必須遵循以下規(guī)則:

(1)所有的抽象數(shù)字類型是非常關聯(lián)的類型(如整型、浮點型),如果浮點數(shù)轉(zhuǎn)換為整數(shù),則轉(zhuǎn)換結(jié)果是最接近的一個整型數(shù);(2)如果兩個數(shù)組有相同的維數(shù),且兩個數(shù)組的元素是同一類型,并且在各處的下標范圍內(nèi)索引是同一類型或非常接近的類型,那么這兩個數(shù)組是非常關聯(lián)類型。(3)枚舉型不能被轉(zhuǎn)換。如果類型標識符所指的是非限定數(shù)組,則結(jié)果會將被轉(zhuǎn)換的數(shù)組的下標范圍去掉,即成為非限定數(shù)組。72

如果類型標識符所指的是非限定數(shù)組,則結(jié)果會將被轉(zhuǎn)換的數(shù)組的下標范圍去掉,即成為非限定數(shù)組。如果類型標識符所指的是限定性數(shù)組,則轉(zhuǎn)換后的數(shù)組的下標范圍與類型標識符所指的下標范圍相同。轉(zhuǎn)換結(jié)束后,數(shù)組中元素的值等價于原數(shù)組中的元素值,見例3.18。

【例3.18】??VARIABLEDATAC,PARAMC:INTEGER;

…??DATAC:=INTEGER(74.94*REAL(PARAMC));在類型與其子類型之間無需類型轉(zhuǎn)換。即使兩個數(shù)組的下標索引方向不同,這兩個數(shù)組仍有可能是非常關聯(lián)類型的。73

3.3.4VHDL操作符

VHDL的各種表達式由操作數(shù)和操作符組成,其中,操作數(shù)是各種運算的對象,而操作符則規(guī)定運算的方式。

1.操作符種類及對應的操作數(shù)類型在VHDL中,一般有四類操作符,即邏輯操作符(LogicaOperator)、關系操作符(RelationaOperator)、算術(shù)操作符(ArithmeticOperator)和符號操作符(SignOperator),前三類操作符是完成邏輯和算術(shù)運算的最基本的操作符的單元。此外還有重載操作符(OverloadingOperator),它是對基本操作符作了重新定義的函數(shù)型操作符。各種操作符所要求的操作數(shù)的類型詳見表3.2,操作符之間的優(yōu)先級別見表3.3。74

表3.2VHDL操作符列表7576

表3.3VHDL操作符優(yōu)先級772.各

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論