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

下載本文檔

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

文檔簡介

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

硬件描述語言

ABEL◆

AHDL

VerilogHDL◆

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

VHDL語言的主要優(yōu)點

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

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

◆VHDL本身的生命期長。因為VHDL的硬件描述與工藝技術(shù)無關(guān),不會因工藝變化而使描述過時。與工藝技術(shù)有關(guān)的參數(shù)可通過VHDL提供的屬性加以描述,工藝改變時,只需修改相應(yīng)程序中的屬性參數(shù)即可。◆

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

VHDL已成為IEEE承認的一個工業(yè)標準,事實上已成為通用硬件描述語言。

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

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

3.庫的說明庫說明語句如下:LIBRARYieee;USE

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

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

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

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

[說明語句]; begin

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

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

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

[定義語句]; begin

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

數(shù)據(jù)對象有四種類型:常數(shù)constant、信號signal、變量variable和文件files類型。數(shù)據(jù)對象的使用:常數(shù)constant、信號signal、變量variable屬于可綜合的數(shù)據(jù)對象,文件files類型僅在行為仿真時使用。1.對象說明常數(shù)說明格式: constant常數(shù)名表:數(shù)據(jù)類型[:=表達式];信號說明格式: signal信號名表:數(shù)據(jù)類型[:=表達式];變量說明格式: variable變量名表:數(shù)據(jù)類型[:=表達式];注意:常數(shù)名表、信號名表和變量名表,用“,”隔開多個標識符。舉例:constanta1,a2:bit; --常數(shù)a1和a2均為bit類型signalout1,out2:std_logic_vector(3downto0);--信號out1,out2均為std_logic_vector類型variablea,b,c:std_logic; --變量a,b,c均為std_logic類型2.信號與變量使用時應(yīng)當特別注意:信號與變量都與一定的物理對象相對應(yīng),但是它們有許多不同之處。物理意義不同:信號對應(yīng)電路設(shè)計中一條硬件連接線;變量與硬件沒有直接對應(yīng)關(guān)系,變量通常用來暫存某些值。信號是全局量,可以用于進程之間的聯(lián)系,變量是局部量,只能在進程語句、函數(shù)語句和過程中使用。賦值符號不同:信號賦值用“<=”符號;變量賦值用“:=”符號。定義位置不同:信號應(yīng)當在結(jié)構(gòu)體(architecture)、包(package)、實體(entity)的說明語句定義。變量則在進程(process)、函數(shù)(function)和過程(procedure)的說明部分定義。附加延時不同:信號賦值語句執(zhí)行時有可能附加延時。變量賦值語句執(zhí)行時,沒有延時立刻執(zhí)行。下面有兩個進程描述語句舉例,進一步說明了信號與變量的不同之處。例如:process(a,b,c,d) --a,b,c,d均定義為信號begin d<=a; x<=b+d; d<=c; y<=b+d;endprocess;程序執(zhí)行的結(jié)果是:x=b+c;y=b+c。程序分析:信號d先代入a,接著再代入c,但是并未進行處理,當進程中的所有語句執(zhí)行完畢,信號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是信號 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是變量,沒有延時立即執(zhí)行,因此執(zhí)行語句d:=a后,a的值賦給d,所以在執(zhí)行語句x<=b+d后,x=b+a;接著又執(zhí)行語句d:=c,c的值又賦給d,所以執(zhí)行語句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中的每個數(shù)據(jù)對象都具有特定的數(shù)據(jù)類型,數(shù)據(jù)對象進行的操作類型必須與其數(shù)據(jù)類型相匹配,不匹配時必須使用轉(zhuǎn)換函數(shù)。VHDL提供的數(shù)據(jù)類型:多種標準數(shù)據(jù)類型以及用戶自定義的數(shù)據(jù)類型。介紹的內(nèi)容:標準數(shù)據(jù)類型、用戶自定義數(shù)據(jù)類型、數(shù)據(jù)類型之間的轉(zhuǎn)換。1.標準數(shù)據(jù)類型標準數(shù)據(jù)類型有10種:這些數(shù)據(jù)類型及其含義如表所示。使用時應(yīng)當注意:不是所有的綜合工具都支持上述10種標準數(shù)據(jù)類型。QuartusII綜合工具不支持實數(shù)、時間、錯誤等級和字符串等數(shù)據(jù)類型。標準數(shù)據(jù)類型含義整數(shù)(integer)整數(shù)32位,-2147483647~+2147483647(-(231-1)~+(231-1))實數(shù)(real)浮點數(shù),-1.0E+38~+1.0E+38位(bit)邏輯“0”或“1”位矢量(bit_vector)位矢量,元素為bit布爾量(boolean)邏輯“true”或邏輯“false”字符(character)ASCII字符時間(time)時間單位fs,ps,ns,μs,ms,sec,min,hr錯誤等級(severitylevel)NOTE(注意),MARNING(警告),ERROR(出錯),FAILURE(失?。┳匀粩?shù)(natural)正整數(shù)(positive)整數(shù)的子集。自然數(shù)是大于等于0的整數(shù)正整數(shù)是大于0的正整數(shù)字符串(string)字符矢量2.用戶定義的數(shù)據(jù)類型在VHDL語言的使用過程中,可以由用戶自己定義數(shù)據(jù)類型。用戶定義的數(shù)據(jù)類型書寫格式: type數(shù)據(jù)類型名{,數(shù)據(jù)類型名}is數(shù)據(jù)類型定義;可以由用戶定義的數(shù)據(jù)類型有:枚舉類型、整數(shù)類型、實數(shù)和浮點數(shù)類型、數(shù)組類型、存取類型、文件類型、記錄類型和物理類型等。這里介紹:QuartusII綜合工具支持的常用用戶定義數(shù)據(jù)類型。(1)整數(shù)類型VHDL已經(jīng)預(yù)定義的整數(shù):從-(231-1)到+(231-1),即從-2147483647到+2147483647。整數(shù)和適用于整數(shù)的運算符VHDL已經(jīng)預(yù)先定義,編寫VHDL程序時可以直接使用。用戶定義的整數(shù)類型:自定義的整數(shù)類型可以認為是VHDL預(yù)定義整數(shù)的一個子類。書寫格式:

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

typeaisintegerrange-63to63;(2)枚舉類型枚舉類型:是一種非常重要的數(shù)據(jù)類型,用于建立抽象的模型。設(shè)計者用枚舉類型嚴格地表達一個特定操作所需的值,枚舉類型的所有值都由設(shè)計者自己定義。枚舉類型使用:枚舉類型常用來定義狀態(tài)機中的狀態(tài)。枚舉類型格式:type數(shù)據(jù)類型名is(元素,元素,…)例如:typestatesis(idle,decision,read,write);--數(shù)據(jù)states枚舉類型定義,有4種取值。枚舉類型可以用于信號和變量的定義,例如:signalpresent_state,next_steate:states;--狀態(tài)信號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語言中,數(shù)據(jù)類型的定義是非常嚴格的,不同數(shù)據(jù)類型的數(shù)據(jù)不能進行運算和直接代入。為了進行運算和代入操作,必要時需要進行數(shù)據(jù)類型之間的轉(zhuǎn)換。數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)如表所示,轉(zhuǎn)換函數(shù)通常由VHDL包集合提供,因此在使用轉(zhuǎn)換函數(shù)之前,使用library和use語句,使包集合可以使用。包集合函數(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,位長)由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屬性

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

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

信號賦值語句主要有:一般信號賦值、條件信號賦值和選擇信號賦值三種形式。一般信號賦值語句格式:目的信號<=敏感信號表達式;應(yīng)當注意:信號賦值語句在結(jié)構(gòu)體中,即在進程外部使用時,是并行信號賦值語句,但是,如果在進程內(nèi)部使用則是順序信號賦值語句。例如:architecturebehaofaisbegin out<=a(i); --結(jié)構(gòu)體中,在進程外部,為并行信號賦值endbeha;上述程序的描述與下面程序的描述相互等價。architecturebehaofaisbeginprocess(a,i)begin out<=a(i); --在進程內(nèi)部,為順序信號賦值endprocess;endbeha;條件信號賦值語句格式:[標號]目的信號名<=表達式1when條件1else 表達式2when條件2else … 表達式n;當when后面的條件成立時,則對應(yīng)表達式的值代入目的信號。例5.1:使用when_else語句設(shè)計二選一數(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;選擇信號賦值語句格式:[標號]with表達式select目的信號名<=表達式1when條件1,

表達式2when條件2,

表達式nwhen條件n;當when后面的條件成立時,則對應(yīng)表達式的值代入目的信號。例5.2:使用with_select語句設(shè)計二選一數(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;--當條件不能全部列出時,必須使用該語句。endver1;例5.1和例5.2采用不同的語句描述,描述的是相同功能的電路,其仿真結(jié)果也是一樣的。5.3.2process進程語句process語句格式: [進程標號:]process[(敏感信號表)] [進程說明部分]; begin [順序語句]; endprocess[進程標號];敏感信號表:表中只要有一個信號發(fā)生變化,進程就會啟動。進程說明部分:可以說明數(shù)據(jù)類型、子程序、枚舉、變量等。進程語句使用:放在結(jié)構(gòu)體begin后的并行語句,但是進程begin后的所有語句都是按順序依次執(zhí)行的。結(jié)構(gòu)體中可以有多個進程:一個結(jié)構(gòu)體中的多個process語句可以同時并發(fā)執(zhí)行,進程之間的數(shù)據(jù)通信是通過信號傳遞實現(xiàn)的。例5.3:8D觸發(fā)器設(shè)計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 --實體d8_logic的結(jié)構(gòu)體描述beginprocess(clk) --進程的敏感信號是時鐘信號clkbeginif(clk'eventandclk='1')then --如果發(fā)生時鐘的上升沿,執(zhí)行q<=d操作

q<=d;endif;endprocess; --進程結(jié)束endbehave; --結(jié)構(gòu)體結(jié)束5.3.3black塊語句塊語句格式: [塊標號:]block [塊頭] [說明語句]; begin [并行語句]; endblock[塊標號];塊頭:主要用于信號的映射及參數(shù)的定義,通常通過generic、generic_map、port和port_map語句實現(xiàn)。說明語句:與結(jié)構(gòu)體的說明語句相同。塊語句功能:塊可以看作是結(jié)構(gòu)體的子模塊,或者看作系統(tǒng)的局部電路。例5.4:使用block語句設(shè)計的半加器和半減器。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;例5.4:使用block語句設(shè)計的半加器和半減器。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實體的2輸入4輸出,對于該實體結(jié)構(gòu)體中所有block塊,這些信號都可用。5.3.4component元件例化語句元件語句:分為元件說明語句和元件例化語句,元件說明和元件例化語句的使用是構(gòu)成層次化設(shè)計的重要途徑。元件說明語句:將預(yù)先設(shè)計好的實體定義為一個底層元件。元件例化語句:將元件說明語句定義的元件與另一設(shè)計實體中的端口相連接,為該設(shè)計實體引入一個底層設(shè)計元件,從而形成層次化設(shè)計。元件語句格式分為兩部分:元件說明語句格式和元件例化語句格式。元件說明語句格式: component元件名 [generic(類屬表);] [port(信號表);] endcomponent;元件例化語句格式: [元件標號:]元件名portmap(信號映射);信號映射:分為位置映射和名稱映射。位置映射:就是把實際信號與底層元件的信號書寫位置一一對應(yīng),只寫實際信號名稱,不用寫底層元件的信號名稱。名稱映射格式:形式參數(shù)=>實際參數(shù)。其中符號“=>”為關(guān)聯(lián)運算符,形式參數(shù)指的是底層元件的信號名稱,實際參數(shù)指的是調(diào)用底層元件的信號名稱。例5.5:完成四位加法器的設(shè)計。采用方法如下:首先設(shè)計一位全加器fulladder,再利用component元件語句,調(diào)用全加器fulladder,構(gòu)造四位加法器。全加器fulladder設(shè)計如下: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;程序說明:fulladder實體是一位全加器,輸入信號a,b和c,進位輸出carry以及和輸出sum,信號順序為a,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 --元件說明語句,形成底層元件port(a,b,c:instd_logic;carry,sum:outstd_logic);endcomponent;beginu0:fulladderportmap(a(0),b(0),c(0),c(1),s(0));--元件例化語句,調(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)當放在同一個目錄下,進行調(diào)用和管理。5.3.5generate生成語句生成語句應(yīng)用范圍:有些實際電路往往會由許多重復(fù)的基本結(jié)構(gòu)組成,生成語句可以簡化這類電路的VHDL描述。生成語句有兩種格式: 標號:for變量in不連續(xù)區(qū)域generate [并行語句]; endgenerate[標號];或者: 標號:if條件generate [并行語句]; endgenerate[標號];例5.6:利用已有的D觸發(fā)器構(gòu)成4位移位寄存器,其組成框圖如圖所示。利用生成語句,循環(huán)調(diào)用D觸發(fā)器構(gòu)成4位移位寄存器。例5.6:利用生成語句,循環(huán)調(diào)用已有的D觸發(fā)器構(gòu)成4位移位寄存器。entityshiftis port(sin,clk:inbit;sout:outbit);endshift;architecturenetlist1ofshiftiscomponentdff --元件說明,準備調(diào)用D觸發(fā)器 port(d,clk:inbit;q:outbit);endcomponent;signalz:bit_vector(0to4); --中間信號的定義beginz(0)<=sin;gf:foriin0to3generate --生成語句,重復(fù)調(diào)用4次u1:dffportmap(z(i),clk,z(i+1)); --元件例化,重復(fù)調(diào)用D觸發(fā)器endgenerate;sout<=z(4);endnetlist1;注意:移位寄存器的輸入信號和輸出信號的連接無法用for_generate語句實現(xiàn),只有用信號賦值語句完成,在程序中用紅色標出。5.4VHDL順序語句順序語句:按照語句出現(xiàn)的先后順序執(zhí)行,順序語句只能出現(xiàn)在進程或子程序中。常用順序語句:信號賦值語句、變量賦值語句、if語句、case語句、loop語句、next語句、exit語句、return語句、null語句、wait語句等。信號賦值語句:既可用作并行語句,也可作順序語句使用。信號賦值語句出現(xiàn)在進程、過程和函數(shù)之外時,為并行語句,否則為順序語句。信號賦值語句的格式及其使用已經(jīng)在并行語句中介紹,這里不再重復(fù)介紹。5.4.1變量賦值語句

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

if語句:根據(jù)所指定的條件來確定執(zhí)行哪些語句,因此if語句可以實現(xiàn)多選擇控制。if語句格式: if條件then 順序語句; {elsif條件then 順序語句;} [else 順序語句]; endif;if語句中條件:為布爾表達式,如果滿足條件,則執(zhí)行關(guān)鍵詞then后面的順序語句;如果所有條件都不滿足,則執(zhí)行else后面的順序語句,endif結(jié)束操作。例5.7:用if語句設(shè)計四選一數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論