![EDA技術(shù) 第08講 VHDL04 并行語(yǔ)句3_第1頁(yè)](http://file4.renrendoc.com/view/d28d3bfdce7c384005da290bc155bbec/d28d3bfdce7c384005da290bc155bbec1.gif)
![EDA技術(shù) 第08講 VHDL04 并行語(yǔ)句3_第2頁(yè)](http://file4.renrendoc.com/view/d28d3bfdce7c384005da290bc155bbec/d28d3bfdce7c384005da290bc155bbec2.gif)
![EDA技術(shù) 第08講 VHDL04 并行語(yǔ)句3_第3頁(yè)](http://file4.renrendoc.com/view/d28d3bfdce7c384005da290bc155bbec/d28d3bfdce7c384005da290bc155bbec3.gif)
![EDA技術(shù) 第08講 VHDL04 并行語(yǔ)句3_第4頁(yè)](http://file4.renrendoc.com/view/d28d3bfdce7c384005da290bc155bbec/d28d3bfdce7c384005da290bc155bbec4.gif)
![EDA技術(shù) 第08講 VHDL04 并行語(yǔ)句3_第5頁(yè)](http://file4.renrendoc.com/view/d28d3bfdce7c384005da290bc155bbec/d28d3bfdce7c384005da290bc155bbec5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八講VHDL之四
3.5VHDL中的并行語(yǔ)句
1第四章硬件描述語(yǔ)言VHDL3.1硬件描述語(yǔ)言概述3.2VHDL程序基本結(jié)構(gòu)3.3VHDL的基本數(shù)據(jù)類(lèi)型及運(yùn)算操作符3.4VHDL中的順序語(yǔ)句3.5VHDL中的并行語(yǔ)句3.6程序包與庫(kù)3.7類(lèi)屬3.8子程序3.9基本邏輯電路設(shè)計(jì)3.10狀態(tài)機(jī)的VHDL設(shè)計(jì)2順序語(yǔ)句(SequentialStaements)VHDL語(yǔ)句并行語(yǔ)句(ConcurrentStatements)賦值語(yǔ)句轉(zhuǎn)向控制語(yǔ)句(If、Case、Loop、Next、Exit)等待語(yǔ)句(wait)子程序調(diào)用語(yǔ)句斷言語(yǔ)句(assert)空操作語(yǔ)句(null)進(jìn)程語(yǔ)句并行信號(hào)賦值語(yǔ)句元件聲明/例化語(yǔ)句塊語(yǔ)句生成語(yǔ)句并行過(guò)程調(diào)用語(yǔ)句3并行語(yǔ)句進(jìn)程語(yǔ)句并行信號(hào)賦值語(yǔ)句元件聲明/例化語(yǔ)句塊語(yǔ)句生成語(yǔ)句
并行過(guò)程調(diào)用語(yǔ)句4VHDL設(shè)計(jì)共享VHDL設(shè)計(jì)庫(kù)VHDL程序包VHDL子程序與并行過(guò)程調(diào)用5庫(kù)、程序包庫(kù)(LIBRARY)包集合(PACKAGE)6庫(kù)(LIBRARY)庫(kù)是用來(lái)放置可編譯的設(shè)計(jì)單元(庫(kù)單元)的地方,通過(guò)其目錄可查詢(xún)和調(diào)用??梢园褞?kù)看成是一種用來(lái)存儲(chǔ)預(yù)先完成的程序包和數(shù)據(jù)集合體的倉(cāng)庫(kù)。提高設(shè)計(jì)效率以及使設(shè)計(jì)遵循某些統(tǒng)一的語(yǔ)言標(biāo)準(zhǔn)或數(shù)據(jù)格式。庫(kù)單元:可以是預(yù)先定義好的數(shù)據(jù)類(lèi)型、子程序等設(shè)計(jì)單元的集合體(程序包);也可以是預(yù)先設(shè)計(jì)好的各種設(shè)計(jì)實(shí)體(元件庫(kù)程序包)。7IEEE庫(kù)STD庫(kù)ASIC矢量庫(kù)WORK庫(kù)用戶(hù)定義庫(kù)
VHDL中的庫(kù)8
IEEE庫(kù):常用的資源庫(kù)。IEEE庫(kù)包含經(jīng)過(guò)IEEE正式認(rèn)可的STD_LOGIC_1164包集合和某些公司提供的支持工業(yè)標(biāo)準(zhǔn)的程序包,如STD_LOGIC_ARITH(算術(shù)運(yùn)算包集合)等。大部分基于數(shù)字系統(tǒng)設(shè)計(jì)的程序包都是以此程序包中設(shè)定的標(biāo)準(zhǔn)為基礎(chǔ)的。STD庫(kù):VHDL語(yǔ)言標(biāo)準(zhǔn)定義了兩個(gè)標(biāo)準(zhǔn)程序包,即STANDARD和TEXTIO程序包,它們都被收入在STD庫(kù)中。只要在VHDL應(yīng)用環(huán)境中,可隨時(shí)調(diào)用這兩個(gè)程序包中的所有內(nèi)容,即在編譯和綜合過(guò)程中,VHDL的每一項(xiàng)設(shè)計(jì)都自動(dòng)地將其包含進(jìn)去了。由于STD庫(kù)符合VHDL語(yǔ)言標(biāo)準(zhǔn),在應(yīng)用中不必如IEEE庫(kù)那樣以顯式表達(dá)出來(lái)。9ASIC矢量庫(kù)。在VHDL語(yǔ)言中,為了進(jìn)行門(mén)級(jí)仿真,各公司可提供面向ASIC的邏輯門(mén)庫(kù)。在該庫(kù)中存放著與邏輯門(mén)一一對(duì)應(yīng)的實(shí)體。為了使用面向ASIC的庫(kù),對(duì)庫(kù)進(jìn)行說(shuō)明是必要的。WORK庫(kù)。WORK庫(kù)是現(xiàn)行作業(yè)庫(kù)。設(shè)計(jì)者所描述的VHDL語(yǔ)句不需要任何說(shuō)明,將都存放在WORK庫(kù)中。WORK庫(kù)對(duì)所有設(shè)計(jì)都隱含可見(jiàn),因此在使用該庫(kù)時(shí)無(wú)需進(jìn)行任何說(shuō)明。用戶(hù)定義庫(kù)。由用戶(hù)自己創(chuàng)建并定義的庫(kù)。設(shè)計(jì)者可以把自己經(jīng)常使用的非標(biāo)準(zhǔn)(一般是自己開(kāi)發(fā)的)包集合和實(shí)體等匯集成在一起定義成一個(gè)庫(kù),作為對(duì)VHDL標(biāo)準(zhǔn)庫(kù)的補(bǔ)充。用戶(hù)定義庫(kù)在使用時(shí)同樣要首先進(jìn)行說(shuō)明。10上述5類(lèi)庫(kù)中,除了STD庫(kù)和WORK庫(kù)之外的其它庫(kù)均為資源庫(kù)。資源庫(kù)是存放常規(guī)元件和標(biāo)準(zhǔn)模塊的庫(kù),使用時(shí)需預(yù)先說(shuō)明。11庫(kù)說(shuō)明語(yǔ)句的語(yǔ)法形式為:
LIBRARY庫(kù)名;--說(shuō)明用什么庫(kù)USE
包集合名;--說(shuō)明用庫(kù)中哪個(gè)包及包中項(xiàng)目LIBRARY語(yǔ)句和USE語(yǔ)句的作用范圍:僅限于緊跟起后的實(shí)體和結(jié)構(gòu)體。含有多個(gè)設(shè)計(jì)實(shí)體的更大的系統(tǒng),每一個(gè)設(shè)計(jì)實(shí)體都必須有自己完整的庫(kù)說(shuō)明語(yǔ)句和USE語(yǔ)句。ALL表示使用程序包中的所有項(xiàng)目。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;12VHDL中的兩個(gè)符合IEEE的標(biāo)準(zhǔn)庫(kù)“STD”和“ieee”
庫(kù)名程序包名包中定義的內(nèi)容StdstandardVHDL類(lèi)型,如BIT,BIT_VECTOR
ieeeStd_logic_1164定義Std_logic,Std_logic_vector
ieeeNumeric_std定義了一組基于Std_logic_1164中定義的類(lèi)型的算術(shù)運(yùn)算符,如“+”,“-”,SHL,SHR
ieeeStd_logic_arith定義有符號(hào)/無(wú)符號(hào)數(shù)類(lèi)型,以及基于這些類(lèi)型上的算術(shù)運(yùn)算ieeeStd_logic_signed定義了基于Std_logic與Std_logic_vector類(lèi)型上的有符號(hào)數(shù)的算術(shù)運(yùn)算ieeeStd_logic_unsigned定義了基于Std_logic與Std_logic_vector類(lèi)型上的無(wú)符號(hào)數(shù)的算術(shù)運(yùn)算13包集合(PACKAGE)為了使已定義的常數(shù)、數(shù)據(jù)類(lèi)型、元件調(diào)用說(shuō)明以及子程序能被更多的VHDL設(shè)計(jì)實(shí)體方便地訪問(wèn)和共享,可將它們收集在一個(gè)VHDL程序包中。多個(gè)程序包可以并入一個(gè)VHDL庫(kù)中,使之適用于更一般的訪問(wèn)和調(diào)用范圍。14程序包的內(nèi)容主要由如下四種基本結(jié)構(gòu)組成,一個(gè)程序包中至少應(yīng)包含其中中的一種。
常數(shù)說(shuō)明:預(yù)定義系統(tǒng)的總線寬度等。
數(shù)據(jù)類(lèi)型說(shuō)明:說(shuō)明在整個(gè)設(shè)計(jì)中通用的數(shù)據(jù)類(lèi)型。
元件定義:主要定義在VHDL設(shè)計(jì)中參與元件例化的文件(已完成的設(shè)計(jì)實(shí)體)對(duì)外的接口界面。
子程序說(shuō)明:說(shuō)明在設(shè)計(jì)中任一處可調(diào)用的子程序。15包集合的語(yǔ)法結(jié)構(gòu):
PACKAGE包集合名
IS [包集合說(shuō)明];END
包集合名;
PACKAGEBODY
包集合名
IS[包體內(nèi)容];ENDBODY;包首用來(lái)聲明包中的類(lèi)型、元件、函數(shù)和子程序;而包體則用來(lái)存放說(shuō)明中的函數(shù)和子程序。程序包體程序包首16例:描述三電平邏輯的包集合PACKAGElogicIS
TYPEthree_level_logicIS(’0’,’1’,’Z’);--三電平邏輯CONSTANTunknown_value:three_level_logic
:=’0’;FUNCTIONinvert(input:three_level_logic)RETURNthree_level_logic;ENDlogic;PACKAGEBODYlogicIS
FUNCTIONinvert(input:hree_level_logic)
RETURNhree_level_logic
IS
BEGIN
CASEinputIS
WHEN’0’=>RETURN’1’;
WHEN’1’=>RETURN’0’;
WHEN’Z’=>RETURN’Z’;
ENDCASE;
ENDinvert;ENDBODY;171.程序包首程序包首的說(shuō)明部分可收集多個(gè)不同的VHDL設(shè)計(jì)所需的公共信息,其中包括數(shù)據(jù)類(lèi)型說(shuō)明、信號(hào)說(shuō)明、子程序說(shuō)明及元件說(shuō)明等。程序包結(jié)構(gòu)中,程序包首可以獨(dú)立定義和使用。18【例】PACKAGEPAC1IS --程序包首開(kāi)始TYPEBYTEISRANGE0TO255;
--定義數(shù)據(jù)類(lèi)型BYTESUBTYPENIBBLEISBYTERANGE0TO15;--定義子類(lèi)型NIBBLECONSTANTBYTE_FF:BYTE:=255;
--定義常數(shù)SIGNALADDEND:NIBBLE;--定義信號(hào)COMPONENTBYTE_ADDER --定義元件PORT(A,B:INBYTE;ENDCOMPONENT;FUNCTIONMY_FUNCTION(A:INBYTE)RETURNBYTE;
--定義函數(shù)ENDPAC1;
--程序包首結(jié)束19--使用這個(gè)程序包中的所有定義:LIBRARYWORK;
--此句可省去USEWORK.PAC1.ALL;ENTITY…ARCHITECTURE……20PACKAGESEVENIS --定義程序包
SUBTYPESEGMENTSISBIT_VECTOR(0TO6);
TYPEBCDISintegerRANGE0TO9;ENDSEVEN;USEWORK.SEVEN.ALL;ENTITYDECODERIS
PORT(INPUT:BCD;DRIVE:OUTSEGMENTS);ENDDECODER;ARCHITECTUREARTOFDECODERISBEGINWITHINPUTSELECTDRIVE<=B“1111110”WHEN0,
B“0110000”WHEN1,【例】在現(xiàn)行WORK庫(kù)中定義程序包并立即使用的示例。21
B“1101101”WHEN2,
B“1111001”WHEN3,
B“0110011”WHEN4,
B“1011011”WHEN5,
B“1011111”WHEN6,
B“1110000”WHEN7,
B“1111111”WHEN8,
B“1111011”WHEN9,
B“0000000”WHENOTHERS;ENDARCHITECTUREART;此例是一個(gè)4位BCD數(shù)向7段譯碼顯示碼轉(zhuǎn)換的VHDL描述。在程序包SEVEN中定義了兩個(gè)新的數(shù)據(jù)類(lèi)型SEGMENTS和BCD。在DECODER的實(shí)體描述中使用了這兩個(gè)數(shù)據(jù)類(lèi)型。22例:設(shè)計(jì)CPU,ALU一個(gè)塊、寄存器堆一塊,而移位寄存器是另一個(gè)塊。23LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcpuISPORT(clk,interrupt:INstd_logic;
addr:OUTstd_logic_vector(31downto0);
data:INOUTstd_logic_vector(31downto0));ENDcpu;24ARCHITECTUREcpu_blkOFcpuISSIGNALibus,dbus:std_logic_vector(31downto0);
BEGIN
ALU:BLOCKSIGNALqbus:std_logic_vector(31downto0);BEGIN--alubehaviorstatements
ENDBLOCKALU;REG8:BLOCKSIGNALzbus:std_logic_vector(31downto0);BEGIN
REG1:BLOCKSIGNALqbus:std_logic_vector(31downto0);BEGIN--reg1behaviorstatements
ENDBLOCKREG1;
--noreREG8statements
ENDBLOCKREG8;ENDcpu_blk;25LIBRARYIEEE;USEieee.std_logic_1164.ALL;PACKAGEcpubitISTYPEbitWISARRAY(31DOWNTO0)
OF
std_logic;ENDcpubit;還可以如何定義bit32?SUBTYPEbit32ISstd_logic_vector(31downto0);若前面增加程序包首說(shuō)明:26LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.cpubit.ALL;ENTITYcpuISPORT(clk,interrupt:INstd_logic;
addr:OUTbitW;
data:INOUTbitW);ENDcpu;27ARCHITECTUREcpu_blkOFcpuISSIGNALibus,dbus
:bitW;
BEGIN
ALU:BLOCKSIGNALqbus:bitW;BEGIN--alubehaviorstatements
ENDBLOCKALU;REG8:BLOCKSIGNALzbus:bitW;BEGIN
REG1:BLOCKSIGNALqbus:bitW;BEGIN--reg1behaviorstatements
ENDBLOCKREG1;
--noreREG8statements
ENDBLOCKREG8;ENDcpu_blk;282.程序包體
程序包體用于定義在程序包首中已定義的子程序的子程序體。程序包體說(shuō)明部分的組成可以是USE語(yǔ)句(允許對(duì)其他程序包的調(diào)用)、子程序定義、子程序體、數(shù)據(jù)類(lèi)型說(shuō)明、子類(lèi)型說(shuō)明和常數(shù)說(shuō)明等。
對(duì)于沒(méi)有子程序說(shuō)明的程序包體可以省去。程序包常用來(lái)封裝屬于多個(gè)設(shè)計(jì)單元分享的信息,程序包定義的信號(hào)、變量不能在設(shè)計(jì)實(shí)體之間共享。
常用的預(yù)定義的程序包有4種。291)STD_LOGIC_1164程序包它是IEEE庫(kù)中最常用的程序包,是IEEE的標(biāo)準(zhǔn)程序包。其中包含了一些數(shù)據(jù)類(lèi)型、子類(lèi)型和函數(shù)的定義。該程序包中用得最多和最廣的是定義了滿足工業(yè)標(biāo)準(zhǔn)的兩個(gè)數(shù)據(jù)類(lèi)型STD_LOGIC和STD_LOGIC_VECTOR,它們非常適合于FPGA/CPLD器件中多值邏輯設(shè)計(jì)結(jié)構(gòu)。302)STD_LOGIC_ARITH程序包它預(yù)先編譯在IEEE庫(kù)中,是Synopsys公司的程序包。此程序包在STD_LOGIC_1164程序包的基礎(chǔ)上擴(kuò)展了三個(gè)數(shù)據(jù)類(lèi)型UNSIGNED、SIGNED和SMALL_INT,并為其定義了相關(guān)的算術(shù)運(yùn)算符和轉(zhuǎn)換函數(shù)。313)STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包都是Synopsys公司的程序包,預(yù)先編譯在IEEE庫(kù)中。這些程序包重載了可用于INTEGER型及STD_LOGIC和STD_LOGIC_VECTOR型混合運(yùn)算的運(yùn)算符,并定義了一個(gè)由STD_LOGIC_VECTOR型到INTEGER型的轉(zhuǎn)換函數(shù)。程序包STD_LOGIC_ARITH、STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED雖然未成為IEEE標(biāo)準(zhǔn),但已成為事實(shí)上的工業(yè)標(biāo)準(zhǔn),絕大多數(shù)的VHDL綜合器和仿真器都支持它們。324)STANDARD和TEXTIO程序包這兩個(gè)程序包是STD庫(kù)中的預(yù)編譯程序包。STANDARD程序包中定義了許多基本的數(shù)據(jù)類(lèi)型、子類(lèi)型和函數(shù)。它是VHDL標(biāo)準(zhǔn)程序包,實(shí)際應(yīng)用中已隱性地打開(kāi)了。TEXTIO程序包定義了支持文本文件操作的許多類(lèi)型和子程序。在使用前,需加語(yǔ)句USESTD.TEXTIO.ALL。
TEXTIO程序包主要供仿真器使用??梢杂梦谋揪庉嬈鹘⒁粋€(gè)數(shù)據(jù)文件,文件中包含仿真時(shí)需要的數(shù)據(jù),然后仿真時(shí)用TEXTIO程序包中的子程序存取這些數(shù)據(jù)。綜合器中,此程序包被忽略。33【例】用“程序包-元件例化-結(jié)構(gòu)化描述法”實(shí)現(xiàn)4位二進(jìn)制等值比較電路設(shè)計(jì)第一步:新建一個(gè)VHD文件,錄入程序包文件34第二步:構(gòu)造底層元件3536不需再元件聲明,可直接例化第三步:構(gòu)造頂層文件37類(lèi)屬(GENERIC)說(shuō)明語(yǔ)句庫(kù)(LIBRARY)包集合(PACKAGE)38類(lèi)屬(GENERIC)說(shuō)明語(yǔ)句類(lèi)屬參量是一種端口界面常數(shù),常以一種說(shuō)明的形式放在實(shí)體或塊結(jié)構(gòu)體前的說(shuō)明部分。類(lèi)屬為所說(shuō)明的環(huán)境提供了一種靜態(tài)信息通道,類(lèi)屬的值可以由設(shè)計(jì)實(shí)體外部提供。因此,設(shè)計(jì)者可從外面通過(guò)類(lèi)屬參量的重新設(shè)定而改變一個(gè)設(shè)計(jì)實(shí)體或一個(gè)元件的內(nèi)部電路結(jié)構(gòu)和規(guī)模,這樣原設(shè)計(jì)就成為一種通用元件。39格式如下:GENERIC([CONSTANT]參數(shù)名:數(shù)據(jù)類(lèi)型[:=靜態(tài)表達(dá)式],……);類(lèi)屬參量以關(guān)鍵詞GENERIC引導(dǎo)一個(gè)類(lèi)屬參量表,在表中提供時(shí)間參數(shù)或總線寬度等靜態(tài)信息。類(lèi)屬表說(shuō)明用于確定設(shè)計(jì)實(shí)體和其外部環(huán)境通信的參數(shù),傳遞靜態(tài)的信息。40ENTITY
black_box
IS
Generic(constantwidth:integer:=16;);PORT(
clk,rst:IN std_logic; d:INstd_logic_vector(width-1DOWNTO0); q:OUTstd_logic_vector(width-1DOWNTO0); co:OUTstd_logic);END
black_box;類(lèi)屬參量【例】41【例】2輸入與門(mén)的實(shí)體描述。
ENTITYAND2ISGENERIC(RISEW:TIME:=1ns;FALLW:TIME:=1ns);
PORT(A1,A0:INSTD_LOGIC;
Z0:OUTSTD_LOGIC);
ENDENTITYAND2;在類(lèi)屬說(shuō)明中定義參數(shù)RISEW為上沿寬度,F(xiàn)ALLW為下沿寬度,默認(rèn)為1ns,這兩個(gè)參數(shù)用于仿真模塊的設(shè)計(jì)。42【例】使用類(lèi)屬構(gòu)造n(n>1)位的通用鎖存器。
--n位鎖存器LATCHn的邏輯描述LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYLATCHnISGeneric(size:integer:=4);
PORT(ENA:INSTD_LOGIC;D:INSTD_LOGIC_vector(size-1downto0);
Q:OUTSTD_LOGIC_vector(size-1downto0)
);ENDENTITYLATCHn;ARCHITECTUREONEOFLATCHIS
43
BEGINPROCESS(D,ENA)BEGINIFENA=‘1’THEN
Q<=D;
ENDIF;ENDPROCESS;ENDARCHITECTUREONE;44--LATCH12的邏輯描述…ENTITY
LATCH12IS
PORT(D:INSTD_LOGIC_VECTOR(6DOWNTO0);
OEN,G:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(6DOWNTO0);ENDENTITYLATCH12;ARCHITECTUREONEOFLATCH12ISCOMPONENTLATCHGeneric(size:integer:=4);PORT(ENA:INSTD_LOGIC;D:INSTD_LOGIC_vector(size-1downto0);
Q:OUTSTD_LOGIC_vector(size-1downto0)
);
ENDCOMPONENT;
45SIGNALSIG:STD_LOGIC_VECTOR(6DOWNTO0);BEGINu0:LATCHnPORTMAP(G,D(4DOWNTO0)
,SIG(4DOWNTO0));u1:LATCHngenericmap(2)PORTMAP(G,D(5DOWNTO4)
,SIG(5DOWNTO4));u2:LATCHngenericmap(2)PORTMAP(G,D(11DOWNTO6)
,SIG(11DOWNTO6));Q<=SIG
WHENOEN=0ELSE
“ZZZZZZZZ”;ENDARCHITECTUREONE;46子程序(SUBPROGRAM)子程序和進(jìn)程(Process)一樣,采用順序描述來(lái)定義算法??梢栽诮Y(jié)構(gòu)體的不同部分調(diào)用子程序完成重復(fù)的計(jì)算應(yīng)用,非常實(shí)用。和進(jìn)程不同的是:子程序不可以直接從結(jié)構(gòu)體的其他部分對(duì)信號(hào)進(jìn)行讀寫(xiě)操作,所有的通信都必須通過(guò)子程序的接口完成。和元件例化語(yǔ)句不同的是,當(dāng)子程序被實(shí)體或者其他子程序調(diào)用的時(shí)候,并不會(huì)產(chǎn)生新的設(shè)計(jì)層次。47子程序函數(shù)(FUNCTION)過(guò)程(PROCEDURE)函數(shù)一般只用以計(jì)算數(shù)值,參量只能是IN信號(hào)與常量;而過(guò)程的參量可以為IN,OUT,INOUT方式(注意:不能為BUFFER方式)。函數(shù)只能返回一個(gè)值;過(guò)程沒(méi)有返回值,但是可以通過(guò)改變過(guò)程參數(shù)值的方法向過(guò)程的調(diào)用者傳遞信息。函數(shù)通常是表達(dá)式的一部分,而過(guò)程一般被看作一種語(yǔ)句結(jié)構(gòu)。48注意:綜合后的子程序?qū)⒂成溆谀繕?biāo)芯片中的一個(gè)相應(yīng)的電路模塊,且每一次調(diào)用都將在硬件結(jié)構(gòu)中產(chǎn)生具有相同結(jié)構(gòu)的不同的模塊,這一點(diǎn)與在普通的軟件中調(diào)用子程序有很大的不同。因此,要密切關(guān)注和嚴(yán)格控制子程序的調(diào)用次數(shù),每調(diào)用一次子程序都意味著增加了一個(gè)硬件電路模塊。49函數(shù)的語(yǔ)法格式:函數(shù)首(一般放在程序包的說(shuō)明部分):
FUNCTION函數(shù)名(輸入?yún)?shù)表)RETURN數(shù)據(jù)類(lèi)型;
函數(shù)體:
FUNCTION函數(shù)名(輸入?yún)?shù)表)RETURN數(shù)據(jù)類(lèi)型IS[說(shuō)明語(yǔ)句];
BEGIN
順序處理語(yǔ)句;
RETURN返回變量名;
ENDFUNCTION函數(shù)名;
函數(shù)(Function)其中輸入?yún)?shù)表中的每個(gè)參數(shù)均應(yīng)表示為:參數(shù)名:數(shù)據(jù)類(lèi)型;501.函數(shù)首
由函數(shù)名、參數(shù)表和返回值的數(shù)據(jù)類(lèi)型組成。函數(shù)名可是普通標(biāo)識(shí)符,也可是運(yùn)算符(須加雙引號(hào))。函數(shù)的參數(shù)表用來(lái)定義輸入值,它可是信號(hào)或常數(shù),默認(rèn)為常數(shù)。函數(shù)首的作用只是作為程序包的有關(guān)此函數(shù)的一個(gè)接口界面。要將一個(gè)已編制好的函數(shù)并入程序包,函數(shù)首必須放在程序包的說(shuō)明部分,而函數(shù)體需放在程序包的包體內(nèi)。如果只是在一個(gè)結(jié)構(gòu)體中定義并調(diào)用函數(shù),則僅需函數(shù)體即可。512.函數(shù)體函數(shù)體包括對(duì)數(shù)據(jù)類(lèi)型、常數(shù)、變量等的局部說(shuō)明,以及用以完成規(guī)定算法或轉(zhuǎn)換的順序語(yǔ)句,并以關(guān)鍵詞ENDFUNCTION以及函數(shù)名結(jié)尾。一旦函數(shù)被調(diào)用,就將執(zhí)行這部分語(yǔ)句。52舉例:
使用函數(shù)實(shí)現(xiàn)7人兩輪表決電路,具體規(guī)則如下:
第一輪,將前6人分成兩個(gè)3人組,每組各自進(jìn)行多數(shù)表決;第7人具有最高表決權(quán),他只參加第二輪的表決;第二輪,由第一輪兩組的代表(帶著全組表決信息)以及第7個(gè)人組成用VHDL語(yǔ)言實(shí)現(xiàn)libraryieee;useieee.std_logic_1164.all;entitysevenisport(in0,in1,in2,in3,in4,in5,in6:inbit;out1:outbit);end;53architecturebhofsevenissignalx:bit_vector(1downto0);functionvote3(a,b,c:bit)returnbitisbeginreturn((aandb)or(aandc)or(bandc));endfunctionvote3;beginx(0)<=vote3
(in0,in1,in2);x(1)<=vote3
(in3,in4,in5);out1<=vote3(in6,x(0),x(1));end;54VHDL允許以相同的函數(shù)名定義函數(shù),即重載函數(shù)。要求函數(shù)中定義的操作數(shù)具有不同的數(shù)據(jù)類(lèi)型,以便調(diào)用時(shí)用以分辨不同功能的同名函數(shù)。以運(yùn)算符重載式函數(shù)最為常用。這種函數(shù)為不同數(shù)據(jù)類(lèi)型間的運(yùn)算帶來(lái)極大的方便,也就是說(shuō),通過(guò)重新定義運(yùn)算符的方式,允許被重載的運(yùn)算符能夠?qū)π碌臄?shù)據(jù)類(lèi)型進(jìn)行操作,或者允許不同的數(shù)據(jù)類(lèi)型之間用此運(yùn)算符進(jìn)行運(yùn)算。重載函數(shù)(OVERLOADEDFUNCTION)55【例】重載函數(shù)使用實(shí)例LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--注意此程序包的功能!ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;
Q:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDCNT4;ARCHITECTUREONEOFCNT4ISBEGIN
PROCESS(CLK)56
BEGINIFCLK'EVENTANDCLK=‘1’THENIFQ=15THEN--Q兩邊的數(shù)據(jù)類(lèi)型不一致,程序自動(dòng)調(diào)用了重載函數(shù)
Q<=“0000”;
ELSEQ<=Q+1;
--這里,程序自動(dòng)調(diào)用了加號(hào)“+”的重載函數(shù)
ENDIF;
ENDIF;
ENDPROCESS;ENDARCHITECTUREONE;57packagemychangeisfunctionbit_int(a:bit)returninteger;function"+"(a,b:bit)returninteger;function"+"(a:integer;b:bit)returninteger;endmychange;程序包首【例】實(shí)現(xiàn)7人單輪表決電路設(shè)計(jì)函數(shù)首58packagebodymychangeisfunctionbit_int(a:bit)returnintegerisvariableresult:integer;beginif(a='1')thenresult:=1;elseresult:=0;endif;returnresult;endbit_int;function"+"(a,b:bit)returnintegerisbeginreturn(bit_int(a)+bit_int(b));end"+";程序包體函數(shù)體59function"+"(a:integer;b:bit)returnintegerisbeginreturn(a+bit_int(b));end"+";endmychange;60libraryieee;useieee.std_logic_1164.all;usework.mychange.all;entityseven1isport(in0,in1,in2,in3,in4,in5,in6:inbit;out1:outbit);end;主程序部分61architecturebhofseven1isbeginprocess(in0,in1,in2,in3,in4,in5,in6)variablex:integer:=0;beginx:=bit_int(in6)+bit_int(in5)+bit_int(in4)+bit_int(in3)+bit_int(in2)+bit_int(in1)+bit_int(in0);ifx>=4thenout1<='1';elseout1<='0';endif;endprocess;end;還可以如何表達(dá)?x:=in6+in5)+in4+in3+in2+in1+in0;62過(guò)程(PROCEDURE)過(guò)程由過(guò)程首和過(guò)程體兩部分組成,過(guò)程首不是必須的,過(guò)程體可以獨(dú)立存在和使用。過(guò)程的語(yǔ)法格式:過(guò)程首:
PROCEDURE過(guò)程名(參數(shù)表);
過(guò)程體:
PROCEDURE過(guò)程名(參數(shù)表)IS[說(shuō)明語(yǔ)句];
BEGIN
順序處理語(yǔ)句;
ENDPROCEDURE過(guò)程名;631.過(guò)程首過(guò)程首由過(guò)程名和參數(shù)表組成。參數(shù)表用于對(duì)常數(shù)、變量和信號(hào)三類(lèi)數(shù)據(jù)對(duì)象目標(biāo)作出說(shuō)明,并用關(guān)鍵詞IN、OUT和INOUT定義這些參數(shù)的工作模式,即信息的流向。64
【例】PROCEDUREPRO1(VARIABLEA,B:INOUTREAL);PROCEDUREPRO2(CONSTANTA1:ININTEGER;
VARIABLEB1:OUTINTEGER);PROCEDUREPRO3(SIGNALSIG:INOUTBIT);
注意:如果只定義了IN模式而未定義目標(biāo)參量類(lèi)型,則默認(rèn)為常量;若只定義了INOUT或OUT,則默認(rèn)目標(biāo)參量類(lèi)型是變量。652.過(guò)程體過(guò)程體是由順序語(yǔ)句組成的,過(guò)程的調(diào)用即啟動(dòng)了對(duì)過(guò)程體的順序語(yǔ)句的執(zhí)行。過(guò)程體中的說(shuō)明部分只是局部的,其中的各種定義只能適用于過(guò)程體內(nèi)部。66根據(jù)調(diào)用環(huán)境的不同,過(guò)程調(diào)用有兩種方式,即順序語(yǔ)句方式和并行語(yǔ)句方式。在一般的順序語(yǔ)句自然執(zhí)行過(guò)程中,一個(gè)過(guò)程被執(zhí)行,則屬于順序語(yǔ)句方式;當(dāng)某個(gè)過(guò)程處于并行語(yǔ)句環(huán)境中時(shí),其過(guò)程體中定義的任一IN或INOUT的目標(biāo)參量發(fā)生改變時(shí),將啟動(dòng)過(guò)程的調(diào)用,這時(shí)的調(diào)用是屬于并行語(yǔ)句方式的。過(guò)程與函數(shù)一樣可以重復(fù)調(diào)用或嵌套式調(diào)用。綜合器一般不支持含有WAIT語(yǔ)句的過(guò)程。67【例】PROCEDUREPRG1(VARIABLEVALUE:INOUTBIT_VECTOR(0TO3))ISBEGINCASEVALUEISWHEN“0000”=>VALUE:=“0101”;WHEN“0101”=>VALUE:=“0000”;WHENOTHERS=>VALUE:=“1111”;ENDCASE;ENDPROCEDUREPRG1;
這個(gè)過(guò)程對(duì)具有雙向模式變量的值VALUE作了一個(gè)數(shù)據(jù)轉(zhuǎn)換運(yùn)算。68PROCEDURECOMP(A,R:INREAL;
M:ININTEGER;
V1,V2:OUTREAL)ISVARIABLECNT:INTEGER;BEGINV1:=1.6*A; --賦初始值V2:=1.0; --賦初始值Q1:FORCNTIN1TOMLOOP V2:=V2*A;EXITQ1WHENV2>R;--當(dāng)V2>R,跳出循環(huán)LOOPENDLOOPQ1;ENDPROCEDURECOMP;【例】69在以上過(guò)程COMP的參量表中,定義A和R為輸入模式,數(shù)據(jù)類(lèi)型為實(shí)數(shù);M為輸入模式,數(shù)據(jù)類(lèi)型為整數(shù)。這三個(gè)參量都沒(méi)有以顯式定義它們的目標(biāo)參量類(lèi)型,顯然它們的默認(rèn)類(lèi)型都是常數(shù)。由于V2、V1定義為輸出模式的實(shí)數(shù),因此默認(rèn)類(lèi)型是變量。在過(guò)程COMP的LOOP語(yǔ)句中,對(duì)V2進(jìn)行循環(huán)計(jì)算直
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 61846:2025 EN-FR Ultrasonics – Therapeutic focused short pressure pulse sources – Characteristics of fields
- 辦公家具購(gòu)買(mǎi)合同書(shū)
- 消防器材維修合同
- 養(yǎng)殖場(chǎng)轉(zhuǎn)讓協(xié)議
- 汽車(chē)后市場(chǎng)汽車(chē)配件供應(yīng)鏈管理方案
- 有機(jī)肥購(gòu)買(mǎi)合同書(shū)
- 婚慶策劃服務(wù)合同及免責(zé)條款
- 西北農(nóng)業(yè)大學(xué)合作協(xié)議
- 工會(huì)興趣小組活動(dòng)方案
- 調(diào)研報(bào)告委托協(xié)議
- 了解綠化廢棄物的分類(lèi)和處理方法
- 節(jié)后復(fù)工安全教育培訓(xùn)內(nèi)容【5篇】
- EPC項(xiàng)目投標(biāo)人承包人工程經(jīng)濟(jì)的合理性分析、評(píng)價(jià)
- 項(xiàng)目投標(biāo)BIM方案(投標(biāo)專(zhuān)用)
- 2024年中考數(shù)學(xué)專(zhuān)題訓(xùn)練 專(zhuān)題10 截長(zhǎng)補(bǔ)短模型綜合應(yīng)用(知識(shí)解讀)
- 專(zhuān)利分析評(píng)議報(bào)告
- 財(cái)務(wù)合規(guī)管理培訓(xùn)課件
- 建設(shè)用地報(bào)批服務(wù)投標(biāo)方案(技術(shù)方案)
- 史賽克關(guān)節(jié)鏡系統(tǒng)
- 大豆玉米帶狀復(fù)合種植技術(shù)
- 2024屆高考語(yǔ)文一輪復(fù)習(xí):現(xiàn)代詩(shī)歌 專(zhuān)練(含答案)
評(píng)論
0/150
提交評(píng)論