硬件描述語(yǔ)言VHDL_第1頁(yè)
硬件描述語(yǔ)言VHDL_第2頁(yè)
硬件描述語(yǔ)言VHDL_第3頁(yè)
硬件描述語(yǔ)言VHDL_第4頁(yè)
硬件描述語(yǔ)言VHDL_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

原理圖設(shè)計(jì)方法:設(shè)計(jì)人員普遍熟悉并使用直觀的原理圖描述方法進(jìn)行系統(tǒng)設(shè)計(jì),隨著數(shù)字系統(tǒng)設(shè)計(jì)規(guī)模日益增大、復(fù)雜程度日益提高,如果仍然采用圖形方式描述電路,設(shè)計(jì)工作的周期長(zhǎng)、成本高,無(wú)法滿足快速高效的設(shè)計(jì)要求。硬件描述語(yǔ)言設(shè)計(jì)方法:為了滿足設(shè)計(jì)人員對(duì)抽象層次更高的電路描述需求,硬件描述語(yǔ)言(HDL:HardwareDescriptionLanguage)應(yīng)運(yùn)而生。HDL優(yōu)勢(shì):具有對(duì)系統(tǒng)的高層次描述功能,為數(shù)字系統(tǒng)設(shè)計(jì)提供了強(qiáng)大的靈活性和通用性,有效地縮短了設(shè)計(jì)周期,降低了設(shè)計(jì)成本。HDL標(biāo)準(zhǔn)化:20年代80年代后期,硬件描述語(yǔ)言向著標(biāo)準(zhǔn)化、集成化的方向發(fā)展,其中VHDL和VerilogHDL先后成為IEEE標(biāo)準(zhǔn)。超高速集成電路硬件描述語(yǔ)言VHDL:VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage簡(jiǎn)稱VHDL,是最早被接納為IEEE標(biāo)準(zhǔn)的硬件描述語(yǔ)言。VHDL由美國(guó)國(guó)防部組織開(kāi)發(fā),1987年被IEEE確認(rèn)為IEEE1076標(biāo)準(zhǔn),1993年升級(jí)為IEEE1164標(biāo)準(zhǔn)。本章介紹VHDL:介紹VHDL程序結(jié)構(gòu)、語(yǔ)法規(guī)則、常用語(yǔ)句。相信通過(guò)硬件描述語(yǔ)言的學(xué)習(xí),你會(huì)發(fā)現(xiàn)硬件電路的設(shè)計(jì),原來(lái)也可以如同軟件設(shè)計(jì)一樣,方便修改和完善。通過(guò)本章的學(xué)習(xí),將為順利完成FPGA設(shè)計(jì)應(yīng)用打下良好的設(shè)計(jì)基礎(chǔ)。5.1VHDL程序結(jié)構(gòu)5.2VHDL語(yǔ)法規(guī)則5.3VHDL并行語(yǔ)句5.4VHDL順序語(yǔ)句第5章硬件描述語(yǔ)言VHDL★

硬件描述語(yǔ)言

ABEL◆

AHDL

VerilogHDL◆

VHDL美國(guó)國(guó)防部在80年代初提出了VHSIC(VeryHighSpeedIntegratedCircuit)計(jì)劃,其目標(biāo)之一是為下一代集成電路的生產(chǎn),實(shí)現(xiàn)階段性的工藝極限以及完成10萬(wàn)門級(jí)以上的設(shè)計(jì),建立一項(xiàng)新的描述方法。1981年提出了一種新的HDL,稱之為VHSICHardwareDescriptionLanguage,簡(jiǎn)稱為VHDL。IEEE標(biāo)準(zhǔn)★

VHDL語(yǔ)言的主要優(yōu)點(diǎn)

◆是一種多層次的硬件描述語(yǔ)言,覆蓋面廣,描述能力強(qiáng)。即設(shè)計(jì)的原始描述可以是非常簡(jiǎn)練的描述,經(jīng)過(guò)層層細(xì)化求精,最終成為可直接付諸生產(chǎn)的電路級(jí)或版圖參數(shù)描述,整個(gè)過(guò)程都可以在VHDL的環(huán)境下進(jìn)行。

VHDL有良好的可讀性,即可以被計(jì)算機(jī)接受,也容易被理解用VHDL書(shū)寫(xiě)的原文件,即是程序,又是文擋,即是技術(shù)人員之間交換信息的文件,又可作為合同簽約者之間的文件。

◆VHDL本身的生命期長(zhǎng)。因?yàn)閂HDL的硬件描述與工藝技術(shù)無(wú)關(guān),不會(huì)因工藝變化而使描述過(guò)時(shí)。與工藝技術(shù)有關(guān)的參數(shù)可通過(guò)VHDL提供的屬性加以描述,工藝改變時(shí),只需修改相應(yīng)程序中的屬性參數(shù)即可?!?/p>

支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用。一個(gè)大規(guī)模設(shè)計(jì)不可能一個(gè)人獨(dú)立完成,它將由多人,多項(xiàng)目組來(lái)共同完成。VHDL為設(shè)計(jì)的分解和設(shè)計(jì)的再利用提供了有力的支持。

VHDL已成為IEEE承認(rèn)的一個(gè)工業(yè)標(biāo)準(zhǔn),事實(shí)上已成為通用硬件描述語(yǔ)言。

VHDL語(yǔ)言的主要優(yōu)點(diǎn)5.1VHDL程序結(jié)構(gòu)VHDL可以描述什么:一個(gè)系統(tǒng)、一個(gè)單元模塊或一個(gè)門電路都可以。VHDL程序結(jié)構(gòu):無(wú)論VHDL描述的電路復(fù)雜還是簡(jiǎn)單,一段VHDL程序包含五個(gè)部分:實(shí)體entity、結(jié)構(gòu)體architecture、庫(kù)library、配置configuration和包package。實(shí)體entity:描述電路和系統(tǒng)的輸入、輸出端口等外部信息。結(jié)構(gòu)體architecture:描述電路和系統(tǒng)的功能信息,對(duì)系統(tǒng)的結(jié)構(gòu)或行為的具體描述。庫(kù)library:庫(kù)中存放的是已經(jīng)編譯過(guò)的實(shí)體、結(jié)構(gòu)體、配置和包,庫(kù)可以由設(shè)計(jì)者自己生成,也可以由ASIC制造商或其他公司提供。放在VHDL程序段的最前面。配置configuration:完成對(duì)庫(kù)的使用,從庫(kù)中選擇需要的單元完成自己的設(shè)計(jì)方案。包package:存放共享數(shù)據(jù)、常數(shù)和子程序等。VHDL程序結(jié)構(gòu)必須有的兩個(gè)部分:在五個(gè)組成部分中,實(shí)體和結(jié)構(gòu)體是必不可少的,其余的部分可以根據(jù)需要選用。VHDL的基本組成VHDL語(yǔ)言參數(shù)部分——library庫(kù)

接口部分—設(shè)計(jì)實(shí)體描述部分—結(jié)構(gòu)體1.庫(kù)的用途:庫(kù)是一個(gè)集合,專門用來(lái)存放已經(jīng)編譯過(guò)的實(shí)體、結(jié)構(gòu)體,庫(kù)可以由設(shè)計(jì)者自己生成,也可以由其他公司提供。2.庫(kù)的種類:VHDL中有五類庫(kù):IEEE庫(kù)、STD庫(kù)、ASIC庫(kù)、WORK庫(kù)和用戶自定義庫(kù)。IEEE庫(kù):存放IEEE標(biāo)準(zhǔn)1076中的標(biāo)準(zhǔn)包集合,如std_logic_1164,std_logic_arith和std_logic_unsigned等。STD庫(kù):存放VHDL的標(biāo)準(zhǔn)數(shù)據(jù)類型,如Boolean等數(shù)據(jù)類型的定義等,包括輸入/輸出兩個(gè)標(biāo)準(zhǔn)程序包,由于STD庫(kù)是VHDL的標(biāo)準(zhǔn)配置,可以不用進(jìn)行庫(kù)的說(shuō)明,STD庫(kù)對(duì)VHDL程序均是可見(jiàn)的。WORK庫(kù):用于存放用戶設(shè)計(jì)和定義的設(shè)計(jì)單元和程序包,保存當(dāng)前進(jìn)行的設(shè)計(jì).只要在VHDL的應(yīng)用環(huán)境中,都可以隨時(shí)調(diào)用STD庫(kù)和WORK庫(kù),所以不需專門的調(diào)用語(yǔ)句。ASIC庫(kù):存放與邏輯門對(duì)應(yīng)的實(shí)體,目的是為了進(jìn)行門級(jí)仿真。在FPGA/CPLD的設(shè)計(jì)中一般都不需要VITAL庫(kù)的程序包。用戶自定義庫(kù):存放用戶自己定義的實(shí)體集合,使用前必須首先進(jìn)行庫(kù)的說(shuō)明。5.1.1library庫(kù)

3.庫(kù)的說(shuō)明庫(kù)說(shuō)明語(yǔ)句如下:LIBRARYieee;USE

ieee.std_logic_1164.all;在VHDL語(yǔ)言中,庫(kù)的說(shuō)明通常放在實(shí)體描述的最前面。注意:多數(shù)情況下,只有對(duì)庫(kù)進(jìn)行說(shuō)明,設(shè)計(jì)者才能使用庫(kù)集合中已經(jīng)定義的數(shù)據(jù)。USE庫(kù)名.程序包名.項(xiàng)目名USE庫(kù)名.程序包名.ALL調(diào)用程序包語(yǔ)句標(biāo)準(zhǔn)程序包定義程序包4.庫(kù)的使用五類庫(kù)中除了WORK和STD庫(kù),其它三類庫(kù)在使用之前需要進(jìn)行庫(kù)的說(shuō)明,還要說(shuō)明使用庫(kù)中的哪個(gè)包集合。庫(kù)使用舉例:為了使用IEEE庫(kù)中的std_logic_1164、std_logic_arith和std_logic_unsigned程序包,應(yīng)使用下列語(yǔ)句:libraryIEEE; --使用IEEE庫(kù)useIEEE.std_logic_1164.all;--使用IEEE庫(kù)std_logic_1164程序包所有設(shè)計(jì)單元useIEEE.std_logic_arith.all;--使用IEEE庫(kù)std_logic_arith程序包所有設(shè)計(jì)單元useIEEE.std_logic_unsigned.all;--使用IEEE庫(kù)std_logic_unsigned程序包所有設(shè)計(jì)單元注意:如果使用std_logic和std_logic_vector,必須在實(shí)體描述前寫(xiě)出下面的庫(kù)說(shuō)明和使用包集合的說(shuō)明語(yǔ)句:entity實(shí)體:用來(lái)描述設(shè)計(jì)的對(duì)外端口信息,如輸入和輸出端口的描述,也可以描述參數(shù)化的數(shù)值。提供設(shè)計(jì)模塊的公共信息,是VHDL設(shè)計(jì)電路的最基本部分。1.entity實(shí)體描述格式entity實(shí)體名is [generic(類屬表);] [port(端口表);] [declarations說(shuō)明語(yǔ)句;] [begin 實(shí)體語(yǔ)句部分];end[實(shí)體名];[]表示其中的部分是可選項(xiàng)。5.1.2entity實(shí)體kxora1b1c11.entity實(shí)體描述格式VHDL實(shí)體的描述方法:ENTITYkxorISPORT(a1,b1:INstd_logic;c1:OUTstd_logic);ENDkxor;調(diào)用程序包語(yǔ)句標(biāo)準(zhǔn)程序包定義程序包實(shí)體及實(shí)體聲明語(yǔ)句實(shí)體語(yǔ)句的一般格式ENTITY實(shí)體名IS[PORT(端口名)]ENDENTITY實(shí)體名ENTITYkxorISPORT(a1,b1:INstd_logic;ENDkxor;c1:OUTstd_logic);ENTITY、IS、PORT、IN、OUT和END為關(guān)鍵字;ENTITY...END之間表示實(shí)體內(nèi)容;kxor表示實(shí)體的名稱,即電路的符號(hào)名;PORT——端口(引腳)信息關(guān)鍵字,描述了信號(hào)的流向;std_logic表示信號(hào)取值的類型為標(biāo)準(zhǔn)邏輯。設(shè)計(jì)實(shí)體說(shuō)明2.端口表端口表:用來(lái)說(shuō)明設(shè)計(jì)實(shí)體對(duì)象的對(duì)外信息。端口表書(shū)寫(xiě)格式: port(端口名{,端口名}:[方向]子類型[bus][:=初始值] {;端口名{,端口名}:[方向]子類型[bus][:=初始值]});端口名是端口的標(biāo)識(shí)符,端口方向表明數(shù)據(jù)通過(guò)該端口的流動(dòng)方向,端口子類型說(shuō)明端口的數(shù)據(jù)類型。端口很重要:端口是實(shí)體和外界通信的動(dòng)態(tài)信息通道,每個(gè)端口都有端口名、端口方向以及端口子類型。例如:2選1數(shù)據(jù)選擇器端口的VHDL描述如下:entitymux21is --實(shí)體名:mux21port(d0,d1,sel:inbit; --輸入信號(hào):d0,d1,sel,均為bit數(shù)據(jù)類型y:outbit); --輸出信號(hào):y,為bit數(shù)據(jù)類型endmux21; --實(shí)體描述結(jié)束3.類屬表類屬表:描述的是實(shí)體與外界通信的靜態(tài)信息通道。類屬表主要用來(lái)規(guī)定端口的大小,實(shí)體中元件的數(shù)目,實(shí)體的定時(shí)特性等。通常放在端口語(yǔ)句之前。類屬表的書(shū)寫(xiě)格式:generic([常量]名字表:[in]類屬標(biāo)識(shí)[:=初始值];…);例如:generic(wide:integer:=32);--說(shuō)明wide為常數(shù),其數(shù)值為整數(shù)323.端口方向端口方向的四種模式:輸入in、輸出out、雙向inout和緩沖buffer。缺省值是輸入。輸入in:輸入僅允許數(shù)據(jù)由外部流向?qū)嶓w輸入端口。主要用于時(shí)鐘輸入、復(fù)位、使能,單向數(shù)據(jù)輸入等輸入信號(hào)的描述。輸出out:輸出僅允許數(shù)據(jù)從實(shí)體內(nèi)部流向?qū)嶓w輸出端口,輸出模式不能用于反饋,因?yàn)檩敵龆丝谠趯?shí)體內(nèi)部不可讀。通常用于電路的各種輸出,如計(jì)數(shù)器、移位寄存器等輸出信號(hào)描述。雙向inout:雙向模式允許數(shù)據(jù)流入或流出實(shí)體,雙向模式允許用于內(nèi)部反饋。雙向模式可以替代其它任一模式,適合描述雙向數(shù)據(jù)總線等。緩沖buffer:緩沖模式通常用于內(nèi)部有反饋需求的信號(hào)描述。buffer與out類似,只是buffer允許用于內(nèi)部反饋,而out不能用于內(nèi)部反饋。Out與Buffer的區(qū)別Entitytest1isport(a:instd_logic;

b,c:outstd_logic);endtest1;architectureaoftest1isbeginb<=not(a);

c<=b;--Errorenda;Entitytest2isport(a:instd_logic;

b:bufferstd_logic;

c:outstd_logic

);endtest2;architectureaoftest2isbeginb<=not(a);

c<=b;enda;4.常用端口類型常用端口類型:布爾boolean、位bit、位矢量bit_vector、整數(shù)integer、標(biāo)準(zhǔn)邏輯std_logic和標(biāo)準(zhǔn)邏輯矢量std_logic_vector等。布爾boolean:布爾類型的取值為“true”或“false”。位bit:位類型的取值只有“0”或“1”。位矢量bit_vector:位矢量是位類型的集合,基本元素是bit類型。整數(shù)integer:整數(shù)常用來(lái)說(shuō)明常數(shù),不用來(lái)說(shuō)明輸入輸出信號(hào)。標(biāo)準(zhǔn)邏輯std_logic:標(biāo)準(zhǔn)邏輯由IEEE_std_logic_1164程序包支持,其取值有9種:0(信號(hào)0)、1(信號(hào)1)、H(弱信號(hào)1)、L(弱信號(hào)0)、Z(高阻)、X(不定)、W(弱信號(hào)不定)、U(初始值)和—(不可能情況)等。標(biāo)準(zhǔn)邏輯矢量std_logic_vector:標(biāo)準(zhǔn)邏輯矢量是標(biāo)準(zhǔn)邏輯的集合,基本元素是std_logic類型。使用時(shí)注意:如果使用std_logic或std_logic_vector,需要在實(shí)體前使用下述語(yǔ)句進(jìn)行說(shuō)明:libraryIEEE; useIEEE_std_logic_1164.all;ENTITYselIS

PORT(d0,d1,d2,d3:INBIT;s:ININTEGERRANGE0TO3;out1:OUTBIT);ENDsel;d0d1d2d3sout1sel設(shè)計(jì)實(shí)體舉例再例:結(jié)構(gòu)體:是電路和系統(tǒng)的邏輯功能描述部分。所有的結(jié)構(gòu)體均附屬于該實(shí)體,是實(shí)體的說(shuō)明。描述實(shí)體硬件的互連關(guān)系、數(shù)據(jù)的傳輸和變換以及動(dòng)態(tài)行為。即描述設(shè)計(jì)實(shí)體的內(nèi)部結(jié)構(gòu)和對(duì)外部設(shè)計(jì)實(shí)體端口間的邏輯關(guān)系。5.1.3architecture結(jié)構(gòu)體

一個(gè)實(shí)體可以對(duì)應(yīng)多個(gè)結(jié)構(gòu)體,每個(gè)結(jié)構(gòu)體可以代表該硬件的某一方面特性,例如行為特性,結(jié)構(gòu)特性。調(diào)用程序包語(yǔ)句標(biāo)準(zhǔn)程序包定義程序包實(shí)體及實(shí)體聲明語(yǔ)句結(jié)構(gòu)體1結(jié)構(gòu)體2結(jié)構(gòu)體n1.結(jié)構(gòu)體描述格式

architecture結(jié)構(gòu)體名of實(shí)體名is

[說(shuō)明語(yǔ)句]; begin

[并行語(yǔ)句]; end[結(jié)構(gòu)體名];結(jié)構(gòu)體由兩部分組成:begin前的說(shuō)明語(yǔ)句部分和begin后的并行語(yǔ)句部分。結(jié)構(gòu)體名:是該結(jié)構(gòu)體的唯一名稱,of后面跟隨的實(shí)體名表明該結(jié)構(gòu)體對(duì)應(yīng)的是哪個(gè)實(shí)體,is表明結(jié)構(gòu)體的命名結(jié)束。說(shuō)明語(yǔ)句:用于對(duì)結(jié)構(gòu)體內(nèi)部所用到的信號(hào)、常數(shù)和函數(shù)等的定義,其定義只對(duì)結(jié)構(gòu)體內(nèi)部可見(jiàn),即結(jié)構(gòu)體內(nèi)部可以使用。并行語(yǔ)句:描述電路和系統(tǒng)并行發(fā)生的行為。有關(guān)結(jié)構(gòu)體的說(shuō)明語(yǔ)句和并行語(yǔ)句在后面有詳細(xì)的介紹。ARCHITECTUREkxor_arcOFkxorISBEGINc1<=(NOTa1ANDb1)OR(a1AND

NOTb1);ENDkxor_arc;當(dāng)異或門的符號(hào)和外部端口a1、b1和c1確定之后,就要確定實(shí)體的內(nèi)部電路,使之與實(shí)體相對(duì)應(yīng)。kxora1b1c1a1b1c1結(jié)構(gòu)體舉例LIBRARYieee;USEieee.std_logic_1164.all;ENTITYkxorISPORT(a1,b1:INstd_logic;c1:OUTstd_logic);ENDkxor;ARCHITECTUREkxor_arcOFkxorISBEGINc1<=(NOTa1ANDb1)OR(a1AND

NOTb1);ENDkxor_arc;該例的完整程序kxora1b1c1a1b1c1kxora1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1結(jié)構(gòu)體舉例2(自學(xué))舉例:二選一數(shù)據(jù)選擇器的結(jié)構(gòu)體描述。architectureconofmux21is --實(shí)體mux21的結(jié)構(gòu)體con的描述 signaltmp:bit; --說(shuō)明語(yǔ)句:內(nèi)部信號(hào)tmp的定義begin tmp<=(d0andsel)or(d1and(notsel)); --并行語(yǔ)句:關(guān)于數(shù)據(jù)選擇器的功能描述 y<=tmp; --并行語(yǔ)句:內(nèi)部信號(hào)的輸出endcon;在前面實(shí)體部分曾經(jīng)定義了二選一數(shù)據(jù)選擇器的端口,在結(jié)構(gòu)體部分給出了該數(shù)據(jù)選擇器信號(hào)之間邏輯關(guān)系的描述。舉例:將實(shí)體和結(jié)構(gòu)體舉例的兩部分程序聯(lián)在一起,則實(shí)現(xiàn)二選一數(shù)據(jù)選擇器完整的設(shè)計(jì)描述。完整程序如下:entitymux21is --實(shí)體名:mux21port(d0,d1,sel:inbit; --輸入信號(hào):d0,d1,sely:outbit); --輸出信號(hào):yendmux21;architectureconofmux21is --實(shí)體mux21的結(jié)構(gòu)體con的描述signaltmp:bit; --說(shuō)明語(yǔ)句:關(guān)于內(nèi)部信號(hào)tmp的定義begintmp<=(d0andsel)or(d1and(notsel)); --并行語(yǔ)句:關(guān)于數(shù)據(jù)選擇器的功能描述y<=tmp; --并行語(yǔ)句:內(nèi)部信號(hào)的輸出endcon;子程序:是在主程序調(diào)用它以后能將處理結(jié)果返回主程序的程序模塊。子程序可以反復(fù)調(diào)用,使用方便。調(diào)用子程序時(shí)首先需要對(duì)其初始化,再次調(diào)用時(shí)要再次初始化,子程序內(nèi)部的值不能保持。子程序有兩種:過(guò)程(procedure)和函數(shù)(function)。procedure和function有所不同,前者的參數(shù)可以是輸入in、輸出out或雙向inout屬性的參數(shù),其返回值可以是多個(gè),其返回值在聲明語(yǔ)句中說(shuō)明。后者的所有參數(shù)都是in屬性,返回值只有一個(gè),在聲明語(yǔ)句之外說(shuō)明。子程序內(nèi)部語(yǔ)句:是順序語(yǔ)句,有關(guān)順序語(yǔ)句的介紹請(qǐng)參考5.4節(jié)。5.1.4子程序

1.過(guò)程過(guò)程語(yǔ)句的書(shū)寫(xiě)格式: procedure過(guò)程名(參數(shù)1,參數(shù)2,…)is [定義語(yǔ)句]; begin [順序語(yǔ)句]; end過(guò)程名;舉例:實(shí)現(xiàn)輸入數(shù)據(jù)din的循環(huán)左移,根據(jù)輸入s值確定循環(huán)左移的位數(shù)。procedureshift(din,s:instd_logic_vector; --輸入信號(hào)s、din signaldout:outstd_logic_vector)is --輸出信號(hào)dout variablesc:integer; --整數(shù)變量scbeginsc:=conv_integer(s); --左移位數(shù)s的數(shù)據(jù)格式轉(zhuǎn)換foriindin’rangeloop if(sc+i<=din’left)then dout(sc+i)<=din(i); --實(shí)現(xiàn)循環(huán)左移 else dout(sc+i-din’left)<=din(i); endif;endshift;使用過(guò)程之前,需要將初始值傳遞給過(guò)程的輸入?yún)?shù),啟動(dòng)過(guò)程的執(zhí)行。執(zhí)行結(jié)束后,應(yīng)當(dāng)將輸出值拷貝到過(guò)程調(diào)用者定義的變量或信號(hào)中。2.函數(shù)函數(shù)的書(shū)寫(xiě)格式: function函數(shù)名(參數(shù)1,參數(shù)2,…) return數(shù)據(jù)類型名is

[定義語(yǔ)句]; begin

[順序語(yǔ)句]; return[返回變量名]; end[函數(shù)名];由于函數(shù)中所有的參數(shù)都是輸入信號(hào),因此端口方向in可以省略。函數(shù)的輸入值由調(diào)用者拷貝到輸入?yún)?shù)中,如果沒(méi)有特別指定,在function語(yǔ)句中按常數(shù)處理。舉例:返回兩數(shù)中的較小數(shù)值的函數(shù)描述。functionmin(x,y:integer) --函數(shù)min,有兩個(gè)參數(shù)x和yreturnintegeris --返回整數(shù)類型的數(shù)據(jù)begin ifx<ythen --兩數(shù)中較小的數(shù)返回 returnx; else returny; endif;endmin;使用函數(shù)的方法:首先需要將函數(shù)集合到包(package)中,再利用use語(yǔ)句使包對(duì)設(shè)計(jì)成為可見(jiàn)、可使用的,然后,在設(shè)計(jì)結(jié)構(gòu)體中就可以直接使用函數(shù)了。rerurn語(yǔ)句:既可以用于函數(shù)function內(nèi)部,也可以用于過(guò)程procedure內(nèi)部,用來(lái)結(jié)束當(dāng)前函數(shù)或過(guò)程體的執(zhí)行。關(guān)于函數(shù)的使用:讀者可參考書(shū)中第7章7.4節(jié)RC6算法設(shè)計(jì)實(shí)現(xiàn),使用了大量的function,極大地方便了復(fù)雜程序的設(shè)計(jì)描述。5.2VHDL語(yǔ)法規(guī)則VHDL語(yǔ)言與其它高級(jí)語(yǔ)言一樣,編寫(xiě)程序時(shí)也要遵循一定的語(yǔ)法規(guī)則。介紹的VHDL語(yǔ)言規(guī)則有:數(shù)據(jù)對(duì)象、數(shù)據(jù)類型、屬性、基本運(yùn)算符5.2.1數(shù)據(jù)對(duì)象

數(shù)據(jù)對(duì)象有四種類型:常數(shù)constant、信號(hào)signal、變量variable和文件files類型。數(shù)據(jù)對(duì)象的使用:常數(shù)constant、信號(hào)signal、變量variable屬于可綜合的數(shù)據(jù)對(duì)象,文件files類型僅在行為仿真時(shí)使用。1.對(duì)象說(shuō)明常數(shù)說(shuō)明格式: constant常數(shù)名表:數(shù)據(jù)類型[:=表達(dá)式];信號(hào)說(shuō)明格式: signal信號(hào)名表:數(shù)據(jù)類型[:=表達(dá)式];變量說(shuō)明格式: variable變量名表:數(shù)據(jù)類型[:=表達(dá)式];注意:常數(shù)名表、信號(hào)名表和變量名表,用“,”隔開(kāi)多個(gè)標(biāo)識(shí)符。舉例:constanta1,a2:bit; --常數(shù)a1和a2均為bit類型signalout1,out2:std_logic_vector(3downto0);--信號(hào)out1,out2均為std_logic_vector類型variablea,b,c:std_logic; --變量a,b,c均為std_logic類型2.信號(hào)與變量使用時(shí)應(yīng)當(dāng)特別注意:信號(hào)與變量都與一定的物理對(duì)象相對(duì)應(yīng),但是它們有許多不同之處。物理意義不同:信號(hào)對(duì)應(yīng)電路設(shè)計(jì)中一條硬件連接線;變量與硬件沒(méi)有直接對(duì)應(yīng)關(guān)系,變量通常用來(lái)暫存某些值。信號(hào)是全局量,可以用于進(jìn)程之間的聯(lián)系,變量是局部量,只能在進(jìn)程語(yǔ)句、函數(shù)語(yǔ)句和過(guò)程中使用。賦值符號(hào)不同:信號(hào)賦值用“<=”符號(hào);變量賦值用“:=”符號(hào)。定義位置不同:信號(hào)應(yīng)當(dāng)在結(jié)構(gòu)體(architecture)、包(package)、實(shí)體(entity)的說(shuō)明語(yǔ)句定義。變量則在進(jìn)程(process)、函數(shù)(function)和過(guò)程(procedure)的說(shuō)明部分定義。附加延時(shí)不同:信號(hào)賦值語(yǔ)句執(zhí)行時(shí)有可能附加延時(shí)。變量賦值語(yǔ)句執(zhí)行時(shí),沒(méi)有延時(shí)立刻執(zhí)行。下面有兩個(gè)進(jìn)程描述語(yǔ)句舉例,進(jìn)一步說(shuō)明了信號(hào)與變量的不同之處。例如:process(a,b,c,d) --a,b,c,d均定義為信號(hào)begin d<=a; x<=b+d; d<=c; y<=b+d;endprocess;程序執(zhí)行的結(jié)果是:x=b+c;y=b+c。程序分析:信號(hào)d先代入a,接著再代入c,但是并未進(jìn)行處理,當(dāng)進(jìn)程中的所有語(yǔ)句執(zhí)行完畢,信號(hào)d最后代入的值c作為最終的數(shù)值,所以d中的數(shù)值是c。程序執(zhí)行的結(jié)果是:x=b+d=b+c;y=b+d=b+c。例如:process(a,b,c) --a,b,c是信號(hào) variabled:std_logic; --d是變量begin d:=a; x<=b+d; d:=c; y<=b+d;endprocess;程序執(zhí)行的結(jié)果是:x=b+a;y=b+c。程序分析:由于d是變量,沒(méi)有延時(shí)立即執(zhí)行,因此執(zhí)行語(yǔ)句d:=a后,a的值賦給d,所以在執(zhí)行語(yǔ)句x<=b+d后,x=b+a;接著又執(zhí)行語(yǔ)句d:=c,c的值又賦給d,所以執(zhí)行語(yǔ)句y<=b+d之后,y=b+c。程序執(zhí)行的結(jié)果是:x=b+d=b+a;y=b+d=b+c。5.2.2數(shù)據(jù)類型

VHDL的數(shù)據(jù)類型:VHDL中的每個(gè)數(shù)據(jù)對(duì)象都具有特定的數(shù)據(jù)類型,數(shù)據(jù)對(duì)象進(jìn)行的操作類型必須與其數(shù)據(jù)類型相匹配,不匹配時(shí)必須使用轉(zhuǎn)換函數(shù)。VHDL提供的數(shù)據(jù)類型:多種標(biāo)準(zhǔn)數(shù)據(jù)類型以及用戶自定義的數(shù)據(jù)類型。介紹的內(nèi)容:標(biāo)準(zhǔn)數(shù)據(jù)類型、用戶自定義數(shù)據(jù)類型、數(shù)據(jù)類型之間的轉(zhuǎn)換。1.標(biāo)準(zhǔn)數(shù)據(jù)類型標(biāo)準(zhǔn)數(shù)據(jù)類型有10種:這些數(shù)據(jù)類型及其含義如表所示。使用時(shí)應(yīng)當(dāng)注意:不是所有的綜合工具都支持上述10種標(biāo)準(zhǔn)數(shù)據(jù)類型。QuartusII綜合工具不支持實(shí)數(shù)、時(shí)間、錯(cuò)誤等級(jí)和字符串等數(shù)據(jù)類型。標(biāo)準(zhǔn)數(shù)據(jù)類型含義整數(shù)(integer)整數(shù)32位,-2147483647~+2147483647(-(231-1)~+(231-1))實(shí)數(shù)(real)浮點(diǎn)數(shù),-1.0E+38~+1.0E+38位(bit)邏輯“0”或“1”位矢量(bit_vector)位矢量,元素為bit布爾量(boolean)邏輯“true”或邏輯“false”字符(character)ASCII字符時(shí)間(time)時(shí)間單位fs,ps,ns,μs,ms,sec,min,hr錯(cuò)誤等級(jí)(severitylevel)NOTE(注意),MARNING(警告),ERROR(出錯(cuò)),FAILURE(失?。┳匀粩?shù)(natural)正整數(shù)(positive)整數(shù)的子集。自然數(shù)是大于等于0的整數(shù)正整數(shù)是大于0的正整數(shù)字符串(string)字符矢量2.用戶定義的數(shù)據(jù)類型在VHDL語(yǔ)言的使用過(guò)程中,可以由用戶自己定義數(shù)據(jù)類型。用戶定義的數(shù)據(jù)類型書(shū)寫(xiě)格式: type數(shù)據(jù)類型名{,數(shù)據(jù)類型名}is數(shù)據(jù)類型定義;可以由用戶定義的數(shù)據(jù)類型有:枚舉類型、整數(shù)類型、實(shí)數(shù)和浮點(diǎn)數(shù)類型、數(shù)組類型、存取類型、文件類型、記錄類型和物理類型等。這里介紹:QuartusII綜合工具支持的常用用戶定義數(shù)據(jù)類型。(1)整數(shù)類型VHDL已經(jīng)預(yù)定義的整數(shù):從-(231-1)到+(231-1),即從-2147483647到+2147483647。整數(shù)和適用于整數(shù)的運(yùn)算符VHDL已經(jīng)預(yù)先定義,編寫(xiě)VHDL程序時(shí)可以直接使用。用戶定義的整數(shù)類型:自定義的整數(shù)類型可以認(rèn)為是VHDL預(yù)定義整數(shù)的一個(gè)子類。書(shū)寫(xiě)格式:

type數(shù)據(jù)類型名is數(shù)據(jù)類型定義約束范圍;例如:

typeaisintegerrange-63to63;(2)枚舉類型枚舉類型:是一種非常重要的數(shù)據(jù)類型,用于建立抽象的模型。設(shè)計(jì)者用枚舉類型嚴(yán)格地表達(dá)一個(gè)特定操作所需的值,枚舉類型的所有值都由設(shè)計(jì)者自己定義。枚舉類型使用:枚舉類型常用來(lái)定義狀態(tài)機(jī)中的狀態(tài)。枚舉類型格式:type數(shù)據(jù)類型名is(元素,元素,…)例如:typestatesis(idle,decision,read,write);--數(shù)據(jù)states枚舉類型定義,有4種取值。枚舉類型可以用于信號(hào)和變量的定義,例如:signalpresent_state,next_steate:states;--狀態(tài)信號(hào)present_state,next_steate定義variablepresent_state,next_steate:states;--狀態(tài)變量present_state,next_steate定義(3)數(shù)組類型數(shù)組類型:相同類型的數(shù)據(jù)集合形成的數(shù)據(jù)類型就是數(shù)組類型。數(shù)組類型格式: type數(shù)組類型名isarray(范圍)of原數(shù)據(jù)類型名;例如:typebig_wordisarray(0to63)ofstd_logic;--一維數(shù)組的定義除定義一維數(shù)組外,還可以定義兩維數(shù)組。例如:typematrix_typeisarray(0to15)ofstd_logic_vector(0to31);推薦使用:數(shù)組元素的排列即可以用升序(to),也可以用降序(downto)。推薦使用后者。(4)記錄類型記錄類型:數(shù)組類型是同一類型數(shù)據(jù)集合形成的,而記錄類型是將不同類型數(shù)據(jù)和數(shù)據(jù)名組織在一起形成的新類型。記錄類型格式: type數(shù)據(jù)類型名isrecord 元素名:數(shù)據(jù)類型名; 元素名:數(shù)據(jù)類型名; … endrecord;例如:typeopcodeis(add,sub,mul,div); --枚舉類型定義typeinstructionisrecord --記錄類型定義operator:opcode; --枚舉類型元素op1:integer; --整數(shù)類型元素op2:integer; --整數(shù)類型元素endrecord; --結(jié)束記錄類型定義3.數(shù)據(jù)類型的轉(zhuǎn)換在VHDL語(yǔ)言中,數(shù)據(jù)類型的定義是非常嚴(yán)格的,不同數(shù)據(jù)類型的數(shù)據(jù)不能進(jìn)行運(yùn)算和直接代入。為了進(jìn)行運(yùn)算和代入操作,必要時(shí)需要進(jìn)行數(shù)據(jù)類型之間的轉(zhuǎn)換。數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)如表所示,轉(zhuǎn)換函數(shù)通常由VHDL包集合提供,因此在使用轉(zhuǎn)換函數(shù)之前,使用library和use語(yǔ)句,使包集合可以使用。包集合函數(shù)名功能std_logic_1164to_stdlogicvector(a)由bit_vector轉(zhuǎn)換為std_logic_vectorto_bitvector(a)由std_logic_vector轉(zhuǎn)換為bit_vectorto_stdlogic(a)由bit轉(zhuǎn)換為std_logicto_bit(a)由std_logic轉(zhuǎn)換為bitstd_logic_arithconv_std_logic_vector(a,位長(zhǎng))由integer,unsigned,signed轉(zhuǎn)換為std_logic_vectorconv_integer(a)由unsigned,signed轉(zhuǎn)換為integerstd_logic_unsignedconv_integer由std_logic_vector轉(zhuǎn)換為integer例如:由std_logic_vector轉(zhuǎn)換為integer的VHDL程序。libraryIEEE;useIEEE.Std_logic_1164.all; --使用std_logic_1164包集合useIEEE.Std_logic_unsigned.all; --使用std_logic_unsigned包集合Entityadd3is port(data:instd_logic_vector(2downto0); …);endadd3;architecturever1ofadd3issignalin_data:integerrange0to5;…begin

in_data<=con_integer(data); --數(shù)據(jù)類型的轉(zhuǎn)換…endver1;5.2.3屬性

屬性問(wèn)題:屬性提供的是關(guān)于信號(hào)、類型等的指定特性。這里介紹常用的屬性:值類屬性、函數(shù)類屬性、范圍屬性1.值類屬性值類屬性:用于返回?cái)?shù)據(jù)類型或數(shù)組類型的特定值,還可返回?cái)?shù)組的長(zhǎng)度或者類型的最底邊界。值類屬性表示:常用單引號(hào)’指定屬性,單引號(hào)后面跟屬性名,單引號(hào)前面是所附屬性的對(duì)象。常用的值類屬性:’left、’right、’high、’low、’length等。例如:屬性’left生成一個(gè)類型最左邊的值;屬性’right是生成一個(gè)類型最右邊的值;例如:屬性’high生成一個(gè)類型的最大值;屬性’low生成類型的最小值;例如:屬性’length生成限制性數(shù)組中的元素?cái)?shù)。需要注意的是:EDA綜合軟件不同對(duì)預(yù)定義屬性的支持程度也各不相同,使用時(shí)應(yīng)參考特定的綜合工具說(shuō)明。返回值屬性描述Count’left=0’left生成的是類型最左邊的值States’left=idleWord’left=15Count’right=127’right生成的是類型最右邊的值States’right=writeWord’right=0Count’high=127’high生成的是類型最大值States’high=writeWord’high=15Count’low=0’low生成的是類型最小值States’low=idleWord’low=0Count’length=128’length生成的是限制性數(shù)組中元件數(shù)States’length=4Word’length=16舉例: typecountisintegerrange0to127; typestatesis(idle,decision,read,write); typewordisarray(15downto0)ofstd_logic;對(duì)上述數(shù)據(jù)類型求其屬性及其返回值如表所示。2.函數(shù)類屬性最常用的函數(shù)類屬性:’event?!痚vent函數(shù)類屬性:表明若屬性對(duì)象有事件發(fā)生,則’event屬性生成布爾值“true”?!痚vent使用:常用來(lái)檢查時(shí)鐘邊沿是否有效。例如:ifclk’eventandclk=’1’then--判斷是否發(fā)生clk信號(hào)變化且變化為1,即clk的上升沿ifclk’eventandclk=’0’then--判斷是否發(fā)生clk信號(hào)變化且變化為0,即clk的下降沿3.范圍屬性最常用的范圍屬性:’range’range范圍屬性:生成一個(gè)限制性數(shù)組對(duì)象的范圍。例如:signalword:bit_vector(10downto0);word’range=10downto0;5.2.4基本運(yùn)算符

VHDL定義的運(yùn)算符主要有:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、關(guān)聯(lián)運(yùn)算符和其它運(yùn)算符。運(yùn)算符的優(yōu)先級(jí)別:優(yōu)先級(jí)最高的是乘方(**)、取絕對(duì)值(abs)和非(not);其次是乘、除、取模、求余;然后依次是正負(fù)號(hào)、連接符、移位運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符。需要注意的是:操作數(shù)的數(shù)據(jù)類型應(yīng)當(dāng)與操作符所要求的數(shù)據(jù)類型一致。EDA綜合軟件對(duì)運(yùn)算符支持程度各不相同,使用時(shí)應(yīng)參考綜合工具的說(shuō)明。類別運(yùn)算符功能數(shù)據(jù)類型算術(shù)運(yùn)算符+加整數(shù)、實(shí)數(shù)、物理量_減*乘/除MOD取模REM取余**乘方ABS取絕對(duì)值+正_負(fù)類別運(yùn)算符功能數(shù)據(jù)類型邏輯運(yùn)算符AND與邏輯型數(shù)據(jù),如:bit、std_logicOR或NAND與非NOR或非XNOR同或NOT非XOR異或SLL邏輯左移SRL邏輯右移SLA算術(shù)左移SRA算術(shù)右移ROL邏輯循環(huán)左移ROR邏輯循環(huán)右移類別運(yùn)算符功能數(shù)據(jù)類型關(guān)系運(yùn)算符=相等整數(shù)、實(shí)數(shù);std_logic等枚舉類型/=不等<小于>大于<=小于等于>=大于等于賦值運(yùn)算符<=信號(hào)賦值:=變量賦值關(guān)聯(lián)運(yùn)算符=>例化元件時(shí)用于形參到實(shí)參的映射并置運(yùn)算符&連接bit、std_logic5.3VHDL并行語(yǔ)句并行語(yǔ)句:VHDL描述的實(shí)際系統(tǒng)中許多操作都是并行發(fā)生的,VHDL中的并行語(yǔ)句就是用來(lái)描述這種并行發(fā)生的行為。已經(jīng)見(jiàn)過(guò)的并行語(yǔ)句:結(jié)構(gòu)體就是由一至多個(gè)并行語(yǔ)句構(gòu)成的,這些語(yǔ)句相互之間是并行運(yùn)行的,并行語(yǔ)句的書(shū)寫(xiě)順序不代表其執(zhí)行的順序。介紹常用的并行語(yǔ)句:信號(hào)賦值語(yǔ)句、process進(jìn)程語(yǔ)句、black塊語(yǔ)句、component元件例化語(yǔ)句、generate生成語(yǔ)句。5.3.1信號(hào)賦值語(yǔ)句

信號(hào)賦值語(yǔ)句主要有:一般信號(hào)賦值、條件信號(hào)賦值和選擇信號(hào)賦值三種形式。一般信號(hào)賦值語(yǔ)句格式:目的信號(hào)<=敏感信號(hào)表達(dá)式;應(yīng)當(dāng)注意:信號(hào)賦值語(yǔ)句在結(jié)構(gòu)體中,即在進(jìn)程外部使用時(shí),是并行信號(hào)賦值語(yǔ)句,但是,如果在進(jìn)程內(nèi)部使用則是順序信號(hào)賦值語(yǔ)句。例如:architecturebehaofaisbegin out<=a(i); --結(jié)構(gòu)體中,在進(jìn)程外部,為并行信號(hào)賦值endbeha;上述程序的描述與下面程序的描述相互等價(jià)。architecturebehaofaisbeginprocess(a,i)begin out<=a(i); --在進(jìn)程內(nèi)部,為順序信號(hào)賦值endprocess;endbeha;條件信號(hào)賦值語(yǔ)句格式:[標(biāo)號(hào)]目的信號(hào)名<=表達(dá)式1when條件1else 表達(dá)式2when條件2else … 表達(dá)式n;當(dāng)when后面的條件成立時(shí),則對(duì)應(yīng)表達(dá)式的值代入目的信號(hào)。例5.1:使用when_else語(yǔ)句設(shè)計(jì)二選一數(shù)據(jù)選擇器。libraryIEEE;useIEEE.Std_logic_1164.all;entitymux21_2is port(i0,i1,sel:instd_logic;

y:outstd_logic);endmux21_2;architecturever1ofmux21_2isbegin

y<=i0whensel='0'else

i1whensel='1';endver1;選擇信號(hào)賦值語(yǔ)句格式:[標(biāo)號(hào)]with表達(dá)式select目的信號(hào)名<=表達(dá)式1when條件1,

表達(dá)式2when條件2,

表達(dá)式nwhen條件n;當(dāng)when后面的條件成立時(shí),則對(duì)應(yīng)表達(dá)式的值代入目的信號(hào)。例5.2:使用with_select語(yǔ)句設(shè)計(jì)二選一數(shù)據(jù)選擇器。libraryIEEE;useIEEE.Std_logic_1164.all;entitymux21_3is port(i0,i1,sel:instd_logic;

y:outstd_logic);endmux21_3;Architecturever1ofmux21_3isbeginwithselselect

y<=i0when'0',i1when'1','X'whenothers;--當(dāng)條件不能全部列出時(shí),必須使用該語(yǔ)句。endver1;例5.1和例5.2采用不同的語(yǔ)句描述,描述的是相同功能的電路,其仿真結(jié)果也是一樣的。5.3.2process進(jìn)程語(yǔ)句process語(yǔ)句格式: [進(jìn)程標(biāo)號(hào):]process[(敏感信號(hào)表)] [進(jìn)程說(shuō)明部分]; begin [順序語(yǔ)句]; endprocess[進(jìn)程標(biāo)號(hào)];敏感信號(hào)表:表中只要有一個(gè)信號(hào)發(fā)生變化,進(jìn)程就會(huì)啟動(dòng)。進(jìn)程說(shuō)明部分:可以說(shuō)明數(shù)據(jù)類型、子程序、枚舉、變量等。進(jìn)程語(yǔ)句使用:放在結(jié)構(gòu)體begin后的并行語(yǔ)句,但是進(jìn)程begin后的所有語(yǔ)句都是按順序依次執(zhí)行的。結(jié)構(gòu)體中可以有多個(gè)進(jìn)程:一個(gè)結(jié)構(gòu)體中的多個(gè)process語(yǔ)句可以同時(shí)并發(fā)執(zhí)行,進(jìn)程之間的數(shù)據(jù)通信是通過(guò)信號(hào)傳遞實(shí)現(xiàn)的。例5.3:8D觸發(fā)器設(shè)計(jì)libraryIEEE;useIEEE.std_logic_1164.all;entityd8_logicisport(clk:instd_logic;

d:instd_logic_vector(7downto0);

q:outstd_logic_vector(7downto0));endd8_logic;architecturebehaveofd8_logicis --實(shí)體d8_logic的結(jié)構(gòu)體描述beginprocess(clk) --進(jìn)程的敏感信號(hào)是時(shí)鐘信號(hào)clkbeginif(clk'eventandclk='1')then --如果發(fā)生時(shí)鐘的上升沿,執(zhí)行q<=d操作

q<=d;endif;endprocess; --進(jìn)程結(jié)束endbehave; --結(jié)構(gòu)體結(jié)束5.3.3black塊語(yǔ)句塊語(yǔ)句格式: [塊標(biāo)號(hào):]block [塊頭] [說(shuō)明語(yǔ)句]; begin [并行語(yǔ)句]; endblock[塊標(biāo)號(hào)];塊頭:主要用于信號(hào)的映射及參數(shù)的定義,通常通過(guò)generic、generic_map、port和port_map語(yǔ)句實(shí)現(xiàn)。說(shuō)明語(yǔ)句:與結(jié)構(gòu)體的說(shuō)明語(yǔ)句相同。塊語(yǔ)句功能:塊可以看作是結(jié)構(gòu)體的子模塊,或者看作系統(tǒng)的局部電路。例5.4:使用block語(yǔ)句設(shè)計(jì)的半加器和半減器。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;例5.4:使用block語(yǔ)句設(shè)計(jì)的半加器和半減器。entityblock_exampleis port(a,b:instd_Logic;

carry,sum,borrow,difference:outstd_Logic);Endblock_example;architectureaofblock_exampleisbeginhalf_adder:block --半加器begin

sum<=axorb; carry<=aandb;endblockhalf_adder;half_Subtractor:block --半減器begin

difference<=axorb; borrow<=notaandb;

endblockhalf_subtractor;enda;注意:block_example實(shí)體的2輸入4輸出,對(duì)于該實(shí)體結(jié)構(gòu)體中所有block塊,這些信號(hào)都可用。5.3.4component元件例化語(yǔ)句元件語(yǔ)句:分為元件說(shuō)明語(yǔ)句和元件例化語(yǔ)句,元件說(shuō)明和元件例化語(yǔ)句的使用是構(gòu)成層次化設(shè)計(jì)的重要途徑。元件說(shuō)明語(yǔ)句:將預(yù)先設(shè)計(jì)好的實(shí)體定義為一個(gè)底層元件。元件例化語(yǔ)句:將元件說(shuō)明語(yǔ)句定義的元件與另一設(shè)計(jì)實(shí)體中的端口相連接,為該設(shè)計(jì)實(shí)體引入一個(gè)底層設(shè)計(jì)元件,從而形成層次化設(shè)計(jì)。元件語(yǔ)句格式分為兩部分:元件說(shuō)明語(yǔ)句格式和元件例化語(yǔ)句格式。元件說(shuō)明語(yǔ)句格式: component元件名 [generic(類屬表);] [port(信號(hào)表);] endcomponent;元件例化語(yǔ)句格式: [元件標(biāo)號(hào):]元件名portmap(信號(hào)映射);信號(hào)映射:分為位置映射和名稱映射。位置映射:就是把實(shí)際信號(hào)與底層元件的信號(hào)書(shū)寫(xiě)位置一一對(duì)應(yīng),只寫(xiě)實(shí)際信號(hào)名稱,不用寫(xiě)底層元件的信號(hào)名稱。名稱映射格式:形式參數(shù)=>實(shí)際參數(shù)。其中符號(hào)“=>”為關(guān)聯(lián)運(yùn)算符,形式參數(shù)指的是底層元件的信號(hào)名稱,實(shí)際參數(shù)指的是調(diào)用底層元件的信號(hào)名稱。例5.5:完成四位加法器的設(shè)計(jì)。采用方法如下:首先設(shè)計(jì)一位全加器fulladder,再利用component元件語(yǔ)句,調(diào)用全加器fulladder,構(gòu)造四位加法器。全加器fulladder設(shè)計(jì)如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityfulladderis port(a,b,c:instd_logic;

carry,sum:outstd_logic);

endfulladder;architectureaoffulladderisbegin

sum<=axorbxorc;carry<=(aandb)or(aandc)or(bandc);enda;程序說(shuō)明:fulladder實(shí)體是一位全加器,輸入信號(hào)a,b和c,進(jìn)位輸出carry以及和輸出sum,信號(hào)順序?yàn)閍,b,c,carry,sum。由全加器構(gòu)成四位加法器的框圖如圖所示,四位加法器b4_adder程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityb4_adderisport(a,b:instd_logic_vector(3downto0);

s:outstd_logic_vector(3downto0));endb4_adder;architectureaofb4_adderissignalc:std_logic_vector(4downto0);componentfullAdder --元件說(shuō)明語(yǔ)句,形成底層元件port(a,b,c:instd_logic;carry,sum:outstd_logic);endcomponent;beginu0:fulladderportmap(a(0),b(0),c(0),c(1),s(0));--元件例化語(yǔ)句,調(diào)用底層元件u1:fulladderportmap(a(1),b(1),c(1),c(2),s(1));--采用位置映射,建立調(diào)用關(guān)聯(lián)關(guān)系u2:fulladderportmap(a(2),b(2),c(2),c(3),s(2));

u3:fulladderportmap(a(3),b(3),c(3),c(4),s(3));

c(0)<='0';Enda;注意:兩段程序fulladder和b4_adder應(yīng)當(dāng)放在同一個(gè)目錄下,進(jìn)行調(diào)用和管理。5.3.5generate生成語(yǔ)句生成語(yǔ)句應(yīng)用范圍:有些實(shí)際電路往往會(huì)由許多重復(fù)的基本結(jié)構(gòu)組成,生成語(yǔ)句可以簡(jiǎn)化這類電路的VHDL描述。生成語(yǔ)句有兩種格式: 標(biāo)號(hào):for變量in不連續(xù)區(qū)域generate [并行語(yǔ)句]; endgenerate[標(biāo)號(hào)];或者: 標(biāo)號(hào):if條件generate [并行語(yǔ)句]; endgenerate[標(biāo)號(hào)];例5.6:利用已有的D觸發(fā)器構(gòu)成4位移位寄存器,其組成框圖如圖所示。利用生成語(yǔ)句,循環(huán)調(diào)用D觸發(fā)器構(gòu)成4位移位寄存器。例5.6:利用生成語(yǔ)句,循環(huán)調(diào)用已有的D觸發(fā)器構(gòu)成4位移位寄存器。entityshiftis port(sin,clk:inbit;sout:outbit);endshift;architecturenetlist1ofshiftiscomponentdff --元件說(shuō)明,準(zhǔn)備調(diào)用D觸發(fā)器 port(d,clk:inbit;q:outbit);endcomponent;signalz:bit_vector(0to4); --中間信號(hào)的定義beginz(0)<=sin;gf:foriin0to3generate --生成語(yǔ)句,重復(fù)調(diào)用4次u1:dffportmap(z(i),clk,z(i+1)); --元件例化,重復(fù)調(diào)用D觸發(fā)器endgenerate;sout<=z(4);endnetlist1;注意:移位寄存器的輸入信號(hào)和輸出信號(hào)的連接無(wú)法用for_generate語(yǔ)句實(shí)現(xiàn),只有用信號(hào)賦值語(yǔ)句完成,在程序中用紅色標(biāo)出。5.4VHDL順序語(yǔ)句順序語(yǔ)句:按照語(yǔ)句出現(xiàn)的先后順序執(zhí)行,順序語(yǔ)句只能出現(xiàn)在進(jìn)程或子程序中。常用順序語(yǔ)句:信號(hào)賦值語(yǔ)句、變量賦值語(yǔ)句、if語(yǔ)句、case語(yǔ)句、loop語(yǔ)句、next語(yǔ)句、exit語(yǔ)句、return語(yǔ)句、null語(yǔ)句、wait語(yǔ)句等。信號(hào)賦值語(yǔ)句:既可用作并行語(yǔ)句,也可作順序語(yǔ)句使用。信號(hào)賦值語(yǔ)句出現(xiàn)在進(jìn)程、過(guò)程和函數(shù)之外時(shí),為并行語(yǔ)句,否則為順序語(yǔ)句。信號(hào)賦值語(yǔ)句的格式及其使用已經(jīng)在并行語(yǔ)句中介紹,這里不再重復(fù)介紹。5.4.1變量賦值語(yǔ)句

變量賦值語(yǔ)句:變量的說(shuō)明和賦值只能在進(jìn)程、函數(shù)和過(guò)程中。變量賦值語(yǔ)句格式: 目的變量:=表達(dá)式;變量賦值語(yǔ)句含義:將表達(dá)式的值代入目的變量中,兩者的類型應(yīng)保持一致。使用變量賦值語(yǔ)句注意:變量類似于一般高級(jí)語(yǔ)言的局部變量,只在局部范圍內(nèi)使用。VHDL中的變量只在進(jìn)程或子程序內(nèi)部使用,變量值無(wú)法傳遞到進(jìn)程和子程序的外部。5.4.2if語(yǔ)句

if語(yǔ)句:根據(jù)所指定的條件來(lái)確定執(zhí)行哪些語(yǔ)句,因此if語(yǔ)句可以實(shí)現(xiàn)多選擇控制。if語(yǔ)句格式: if條件then 順序語(yǔ)句; {elsif條件then 順序語(yǔ)句;} [else 順序語(yǔ)句]; endif;if語(yǔ)句中條件:為布爾表達(dá)式,如果滿足條件,則執(zhí)行關(guān)鍵詞then后面的順序語(yǔ)句;如果所有條件都不滿足,則執(zhí)行else后面的順序語(yǔ)句,endif結(jié)束操作。例5.7:用if語(yǔ)句設(shè)計(jì)四選一數(shù)據(jù)選擇器。libraryieee;useieee.std_logic_1164.all;entitymux41isport(d0,d1,d2,d3:instd_logic;s:instd_logic_vector(1downto0);

x:outstd_logic);endmux41;architecturearchmuxofmux41isbeginprocess(s,d0,d1,d2,d3)begin ifs="00"thenx<=d0; elsifs="01"thenx<=d1; elsifs="10"thenx<=d2; elsex<=d3; end

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論