子程序調(diào)用語句
4.1.4 子程序調(diào)用語句
子程序是一個VHDL程序模塊,它是利用順序語句來定義和完成算法的,應(yīng)用它能更有效地完成重復(fù)性的設(shè)計工作。子程序不能從所在的結(jié)構(gòu)體的其他塊或進程結(jié)構(gòu)中直接讀取信號值或者向信號賦值,而只能通過子程序調(diào)用及與子程序的界面端口進行通信。
子程序有兩種類型,即過程(PROCEDURE)和函數(shù)(FUNCTION)。
1)過程
過程的語句格式是:
過程由過程首和過程體兩部分組成,過程首不是必須的,過程體可以獨立存在和使用。即在進程或結(jié)構(gòu)體中不必定義過程首,而在程序包中必須定義過程首。
(1)過程首
過程首由過程名和參數(shù)表組成。參數(shù)表用于對常數(shù)、變量和信號三類數(shù)據(jù)對象目標(biāo)作出說明,并用關(guān)鍵詞IN、OUT和INOUT定義這些參數(shù)的工作模式,即信息的流向。以下是三個過程首的定義示例:
一般的,可在參量表中定義三種流向模式,即IN、OUT和INOUT。如果只定義了IN模式而未定義目標(biāo)參量類型,則默認(rèn)為常量;若只定義了INOUT或OUT,則默認(rèn)目標(biāo)參量類型是變量。
(2)過程體
過程體是由順序語句組成的,過程的調(diào)用即啟動了對過程體的順序語句的執(zhí)行。過程體中的說明部分只是局部的,其中的各種定義只能適用于過程體內(nèi)部。
(3)過程調(diào)用
根據(jù)調(diào)用環(huán)境的不同,過程調(diào)用有兩種方式,即順序語句方式和并行語句方式。在一般的順序語句自然執(zhí)行過程中,一個過程被執(zhí)行,則屬于順序語句方式;當(dāng)某個過程處于并行語句環(huán)境中時,其過程體中定義的任一IN或INOUT的目標(biāo)參量發(fā)生改變時,將啟動過程的調(diào)用,這時的調(diào)用是屬于并行語句方式的。這里介紹順序語句調(diào)用方式。
過程調(diào)用就是執(zhí)行一個給定名字和參數(shù)的過程。調(diào)用過程的語句格式如下:
其中,括號中的實參表達(dá)式稱為實參,它可以是一個具體的數(shù)值,也可以是一個標(biāo)識符,是當(dāng)前調(diào)用程序中過程形參的接受體。在此調(diào)用格式中,形參名即為當(dāng)前欲調(diào)用的過程中已說明的參數(shù)名,即與實參表達(dá)式相聯(lián)系的形參名。被調(diào)用中的形參名與調(diào)用語句中的實參表達(dá)式的對應(yīng)關(guān)系有位置關(guān)聯(lián)法和名字關(guān)聯(lián)法兩種,位置關(guān)聯(lián)可以省去形參名。
一個過程的調(diào)用有三個步驟:
①將IN和INOUT模式的實參值賦給欲調(diào)用的過程中與它們對應(yīng)的形參;
②執(zhí)行這個過程;
③將過程中IN和INOUT模式的形參值賦還給對應(yīng)的實參。
【例4.15】
本例是一個取三個輸入位矢量最大值的功能描述,它在結(jié)構(gòu)體中的進程語句中使用了兩個過程調(diào)用語句。
(4)重載過程
兩個或兩個以上有相同的過程名和互不相同的參數(shù)數(shù)量及數(shù)據(jù)類型的過程稱為重載過程。對于重載過程,靠參量類型來辨別究竟調(diào)用哪一個過程。
【例4.16】
2)函數(shù)
在VHDL中有多種函數(shù)形式,如在庫中現(xiàn)成的具有專用功能的預(yù)定義函數(shù)和用于不同目的的用戶自定義函數(shù)。函數(shù)的語言表達(dá)格式如下:
一般的,函數(shù)定義由兩部分組成,即函數(shù)首和函數(shù)體。
(1)函數(shù)首
函數(shù)首是由函數(shù)名、參數(shù)表和返回值的數(shù)據(jù)類型三部分組成的。函數(shù)首的名稱即為函數(shù)的名稱,需放在關(guān)鍵詞FUNCTION之后,它可以是普通的標(biāo)識符,也可以是運算符(這時必須加上雙引號)。函數(shù)的參數(shù)表是用來定義輸入值的,它可以是信號或常數(shù),參數(shù)名需放在關(guān)鍵詞CONSTANT或SIGNAL之后,若沒有特別說明,則參數(shù)被默認(rèn)為常數(shù)。如果要將一個已編制好的函數(shù)并入程序包,函數(shù)首必須放在程序包的說明部分,而函數(shù)體需放在程序包的包體內(nèi)。如果只是在一個結(jié)構(gòu)體中定義并調(diào)用函數(shù),則僅需函數(shù)體即可。由此可見,函數(shù)首的作用只是作為程序包的有關(guān)此函數(shù)的一個接口界面。
(2)函數(shù)體
函數(shù)體包括對數(shù)據(jù)類型、常數(shù)、變量等的局部說明,以及用以完成規(guī)定算法或轉(zhuǎn)換的順序語句,并以關(guān)鍵詞END FUNCTION以及函數(shù)名結(jié)尾。一旦函數(shù)被調(diào)用,就將執(zhí)行這部分語句。
(3)函數(shù)調(diào)用
函數(shù)調(diào)用與過程調(diào)用是十分相似的,不同之處是,調(diào)用函數(shù)將返還一個指定數(shù)據(jù)類型的值,函數(shù)的參量只能是輸入值。
【例4.17】
本例在結(jié)構(gòu)體內(nèi)定義了一個完成某種算法的函數(shù),并在進程PROCESS中調(diào)用了此函數(shù),整個函數(shù)沒有函數(shù)首。在進程中,輸入端口矢量a被列為敏感信號,當(dāng)a的3個位輸入元素a(0)、a(1)和a(2)中任何一位發(fā)生變化時,將啟動對函數(shù)sam的調(diào)用,并將函數(shù)的返回值賦給m輸出。
(4)函數(shù)重載
VHDL允許以相同的函數(shù)名定義函數(shù),即重載函數(shù)。但這時要求函數(shù)中定義的操作數(shù)具有不同的數(shù)據(jù)類型,以便調(diào)用時用以分辨不同功能的同名函數(shù)。
VHDL不允許不同數(shù)據(jù)類型的操作數(shù)間進行直接操作或運算。為此,在具有不同數(shù)據(jù)類型操作數(shù)構(gòu)成的同名函數(shù)中,可定義運算符重載函數(shù),這種函數(shù)為不同數(shù)據(jù)類型間的運算帶來極大的方便。
例4.18中以加號“+”為函數(shù)名的函數(shù)即為運算符重載函數(shù)。VHDL的IEEE庫中的STD_LOGIC_UNSIGNED程序包中預(yù)定義的操作符如“+”、“-”、“*”、“=”、“>”、“>=”、“<”、“<=”、“/=”、“AND”和“MOD”等,對相應(yīng)的數(shù)據(jù)類型INTEGER、STD_LOGIC 和STD_LOGIC_VECTOR的操作作了重載,賦予新的數(shù)據(jù)類型操作功能,也就是說,通過重新定義運算符的方式,允許被重載的運算符能夠?qū)π碌臄?shù)據(jù)類型進行操作,或者允許不同的數(shù)據(jù)類型之間用此運算符進行運算。
【例4.18】
例4.18給出了程序包STD_LOGIC_UNSIGNED中的部分函數(shù)結(jié)構(gòu),其說明部分只列出了四個函數(shù)的函數(shù)首。在程序包體部分只列出了對應(yīng)的部分內(nèi)容,程序包體部分的UNSIGNED()函數(shù)是從IEEE.STD_LOGIC_ARITH庫中調(diào)用的,在程序包體中的最大整型數(shù)檢出函數(shù)MAXIMUM只有函數(shù)體,沒有函數(shù)首,這是因為它只在程序包體內(nèi)調(diào)用。
實用中,如果已用“USE”語句打開了程序包STD_LOGIC_UNSIGNED,這時,如果設(shè)計實體中有一個STD_LOGIC_VECTOR類型和一個整數(shù)相加,程序就會自動調(diào)用第一個函數(shù),并返回STD_LOGIC_VECTOR類型的值。若是一個STD_LOGIC_VECTOR與STD_LOGIC數(shù)據(jù)類型的數(shù)相加,則調(diào)用第三個函數(shù),并以STD_LOGIC_VECTOR類型的值返回。例4.19為重載函數(shù)使用實例,其功能時實現(xiàn)4位二進制加法計數(shù)器。
【例4.19】
免責(zé)聲明:以上內(nèi)容源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。