VHDL的主要描述語(yǔ)句_第1頁(yè)
VHDL的主要描述語(yǔ)句_第2頁(yè)
VHDL的主要描述語(yǔ)句_第3頁(yè)
VHDL的主要描述語(yǔ)句_第4頁(yè)
VHDL的主要描述語(yǔ)句_第5頁(yè)
已閱讀5頁(yè),還剩232頁(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)介

VHDL的主要描述語(yǔ)句6.1順序描述語(yǔ)句6.2并發(fā)描述語(yǔ)句6.3其他語(yǔ)句和有關(guān)規(guī)定的說(shuō)明習(xí)題與思考題

順序描述語(yǔ)句只能出現(xiàn)在進(jìn)程或子程序中,由它定義進(jìn)程或子程序所執(zhí)行的算法。順序描述語(yǔ)句中所涉及的系統(tǒng)行為有時(shí)序流、控制、條件和迭代等。順序描述語(yǔ)句的功能操作有算術(shù)、邏輯運(yùn)算,信號(hào)和變量的賦值,子程序調(diào)用等。順序描述語(yǔ)句像在一般高級(jí)語(yǔ)言中一樣,其語(yǔ)句是按出現(xiàn)的次序加以執(zhí)行的。

6.1順序描述語(yǔ)句

在VHDL中,順序描述語(yǔ)句主要有以下幾種:

·WAIT語(yǔ)句;

·斷言語(yǔ)句;

·信號(hào)代入語(yǔ)句;

·變量賦值語(yǔ)句;

·IF語(yǔ)句;

·CASE語(yǔ)句;

·LOOP語(yǔ)句;

·NEXT語(yǔ)句;

·EXIT語(yǔ)句;

·過(guò)程調(diào)用語(yǔ)句;

·NULL語(yǔ)句。

NULL(空)語(yǔ)句表示只占位置的一種空處理操作,但是它可以為所對(duì)應(yīng)信號(hào)賦予一個(gè)空值,表示該驅(qū)動(dòng)器被關(guān)閉。該語(yǔ)句在下面不作介紹,其余語(yǔ)句將通過(guò)具體實(shí)例作詳細(xì)介紹。

6.1.1WAIT語(yǔ)句

進(jìn)程在仿真運(yùn)行中總是處于下述兩種狀態(tài)之一:執(zhí)行或掛起。進(jìn)程狀態(tài)的變化受等待語(yǔ)句的控制,當(dāng)進(jìn)程執(zhí)行到等待語(yǔ)句時(shí),會(huì)被掛起,并設(shè)置好再次執(zhí)行的條件。WAIT語(yǔ)句可以設(shè)置4種不同的條件:無(wú)限等待、時(shí)間到、條件滿足以及敏感信號(hào)量變化。

這幾類條件可以混用,其書(shū)寫(xiě)格式如下:

WAIT (無(wú)限等待)

WAITON (敏感信號(hào)量變化)

WAITUNTIL (條件滿足)

WAITFOR (時(shí)間到)

1.WAITON語(yǔ)句

WAITON語(yǔ)句的完整書(shū)寫(xiě)格式如下:

WAITON信號(hào)[,信號(hào)];

WAITON語(yǔ)句后面跟著的是一個(gè)或多個(gè)信號(hào)量。例如:

WAITONa,b;

該語(yǔ)句表明:它等待信號(hào)量a或b發(fā)生變化。a或者b中只要有一個(gè)信號(hào)量發(fā)生變化,進(jìn)程就結(jié)束掛起狀態(tài),而繼續(xù)執(zhí)行WAITON語(yǔ)句后繼的語(yǔ)句。WAITON可以再次啟動(dòng)進(jìn)程的執(zhí)行,其條件是指定的信號(hào)量必須有一個(gè)新的變化。

【例6-1】WAITON可以再次啟動(dòng)進(jìn)程的條件。

例6-1中的兩個(gè)進(jìn)程的描述是完全等價(jià)的,只是WAITON和PROCESS中所使用的敏感信號(hào)量的書(shū)寫(xiě)方法有區(qū)別。在使用WAITON語(yǔ)句的進(jìn)程中,敏感信號(hào)量應(yīng)寫(xiě)在進(jìn)程中的WAITON語(yǔ)句后面;在不使用WAITON語(yǔ)句的進(jìn)程中,敏感信號(hào)量只應(yīng)在進(jìn)程開(kāi)頭的PROCESS后跟的括號(hào)中說(shuō)明。需要注意的是,如果PROCESS語(yǔ)句已有敏感信號(hào)量說(shuō)明,那么在進(jìn)程中再不能使用WAITON語(yǔ)句。例如,例6-2的描述是非法的。

【例6-2】PROCESS語(yǔ)句已有敏感信號(hào)量說(shuō)明的情況。

2.WAITUNTIL語(yǔ)句

WAITUNTIL語(yǔ)句的完整書(shū)寫(xiě)格式如下:

WAITUNTIL表達(dá)式;

WAITUNTIL語(yǔ)句后面跟的是布爾表達(dá)式,當(dāng)進(jìn)程執(zhí)行到該語(yǔ)句時(shí)將被掛起,直到表達(dá)式返回一個(gè)“真”值,進(jìn)程才被再次啟動(dòng)。

該語(yǔ)句在表達(dá)式中將建立一個(gè)隱式的敏感信號(hào)量表。當(dāng)表中的任何一個(gè)信號(hào)量發(fā)生變化時(shí),立即對(duì)表達(dá)式進(jìn)行一次評(píng)估。如果評(píng)估結(jié)果使表達(dá)式返回一個(gè)“真”值,則進(jìn)程脫離等待狀態(tài),繼續(xù)執(zhí)行下一個(gè)語(yǔ)句。例如:

WAITUNTIL((x*10)<100);

在這個(gè)例子中,當(dāng)信號(hào)量x的值大于或等于10時(shí),進(jìn)程執(zhí)行到該語(yǔ)句將被掛起;當(dāng)x的值小于10時(shí),進(jìn)程再次被啟動(dòng),繼續(xù)執(zhí)行WAIT語(yǔ)句的后繼語(yǔ)句。

3.WAITFOR語(yǔ)句

WAITFOR語(yǔ)句的完整書(shū)寫(xiě)格式如下:

WAITFOR時(shí)間表達(dá)式;

W

AITFOR語(yǔ)句后面跟的是時(shí)間表達(dá)式。當(dāng)進(jìn)程執(zhí)行到該語(yǔ)句時(shí)將被掛起,直到指定的等待時(shí)間到時(shí),進(jìn)程再開(kāi)始執(zhí)行WAITFOR語(yǔ)句后繼的語(yǔ)句。例如:

WAITFOR20ns;

WAITFOR(a*(b+c));

在上例的第一個(gè)語(yǔ)句中,時(shí)間表達(dá)式是一個(gè)常數(shù)值20ns,當(dāng)進(jìn)程執(zhí)行到該語(yǔ)句時(shí)將等待20?ns。一旦20?ns時(shí)間到,進(jìn)程將執(zhí)行WAITFOR語(yǔ)句的后繼語(yǔ)句。

在上述第二個(gè)語(yǔ)句中,F(xiàn)OR后面是一個(gè)時(shí)間表達(dá)式,a*(b+c)是時(shí)間量。WAITFOR語(yǔ)句在等待過(guò)程中要對(duì)表達(dá)式進(jìn)行一次計(jì)算,計(jì)算結(jié)果返回的值就作為該語(yǔ)句的等待時(shí)間。例如,a?=

2,b?=

50

ns,c?=

70

ns,那么WAITFOR(a*(b+c))這個(gè)語(yǔ)句將等待240?ns。也就是說(shuō),該語(yǔ)句和WAITFOR240ns是等價(jià)的。

4.多條件WAIT語(yǔ)句

在前面已敘述的3個(gè)WAIT語(yǔ)句中,等待的條件都是單一的,要么是信號(hào)量,要么是布爾量,要么是時(shí)間量。實(shí)際上,WAIT語(yǔ)句還可以同時(shí)使用多個(gè)等待條件。

例如:

WAITONnmi,interruptUNTIL((nmi=TRUE)OR(interrupt=TRUE))FOR5ms;

上述語(yǔ)句等待的是以下3個(gè)條件:

(1)信號(hào)量nmi和interrupt中任何一個(gè)有一次新的變化;

(2)信號(hào)量nmi或interrput中任何一個(gè)取值為“真”;

(3)該語(yǔ)句已等待5?ms。

只要上述3個(gè)條件中一個(gè)或多個(gè)條件滿足,進(jìn)程就再次啟動(dòng),繼續(xù)執(zhí)行WAIT語(yǔ)句的后繼語(yǔ)句。

應(yīng)該注意的是,在多條件等待時(shí),表達(dá)式的值至少應(yīng)包含一個(gè)信號(hào)量的值。例如:

WAITUNTIL(interrupt=TRUE)OR(old_clk=‘1’);

如果該語(yǔ)句的interrupt和old_clk兩個(gè)都是變量,而不是信號(hào)量,那么即使兩個(gè)變量的值有新的改變,該語(yǔ)句也不會(huì)對(duì)表達(dá)式進(jìn)行評(píng)估和計(jì)算(事實(shí)上,在掛起的進(jìn)程中變量的值是不可能改變的)。這樣,該等待語(yǔ)句將變成無(wú)限的等待語(yǔ)句,包含該等待語(yǔ)句的進(jìn)程就不能再啟動(dòng)。在多種等待條件中,只有信號(hào)量變化才能引起等待語(yǔ)句表達(dá)式的一次新的評(píng)價(jià)和計(jì)算。

5.超時(shí)等待

往往存在這樣一種情況:在設(shè)計(jì)的程序模塊中,等待語(yǔ)句所等待的條件在實(shí)際執(zhí)行時(shí)不能保證一定會(huì)碰到。在這種情況下,等待語(yǔ)句通常要加一項(xiàng)超時(shí)等待項(xiàng),以防止該等待語(yǔ)句進(jìn)入無(wú)限期的等待狀態(tài)。但是,如果采用這種方法,則應(yīng)作適當(dāng)?shù)奶幚恚駝t就會(huì)產(chǎn)生錯(cuò)誤的行為。

【例6-3】超時(shí)等待示例。

在例6-3中,一個(gè)構(gòu)造體內(nèi)包含有兩個(gè)進(jìn)程。這兩個(gè)進(jìn)程通過(guò)兩個(gè)信號(hào)量sendA和sendB進(jìn)行通信。盡管例6-3實(shí)際上并不做任何事情,但是它可以說(shuō)明為什么等待語(yǔ)句會(huì)處于無(wú)限期的等待狀態(tài),也就是通常所說(shuō)的“死鎖”狀態(tài)。

在仿真的最初階段,所有的進(jìn)程都將會(huì)執(zhí)行一次。進(jìn)程通常在仿真啟動(dòng)的執(zhí)行點(diǎn)得到啟動(dòng)。在本例中,進(jìn)程A在仿真啟動(dòng)點(diǎn)啟動(dòng),而在執(zhí)行到下述語(yǔ)句時(shí)被掛起:

WAITUNTILsendB='1';

此時(shí),進(jìn)程B同樣在啟動(dòng)點(diǎn)被啟動(dòng),而在執(zhí)行到下述語(yǔ)句時(shí)被掛起:

WAITUNTILsendA=‘1’;

B進(jìn)程啟動(dòng)以后不會(huì)停留在第一條等待語(yǔ)句WAITUNTILsendA='0'?上。這是因?yàn)樵摌?gòu)造體中的第一條語(yǔ)句是sendA<='0'。它使B進(jìn)程中的第一條等待語(yǔ)句已滿足了等待條件,可以繼續(xù)執(zhí)行后繼的語(yǔ)句。此后,B進(jìn)程向下執(zhí)行將“0”代入sendB,而后停留在B進(jìn)程的第二條等待語(yǔ)句上。

這樣,兩個(gè)進(jìn)程就處于相互等待狀態(tài),兩個(gè)進(jìn)程都不能繼續(xù)執(zhí)行,因?yàn)閮蓚€(gè)進(jìn)程各自等待的條件都需要對(duì)方繼續(xù)執(zhí)行。如果在每一個(gè)等待語(yǔ)句中插入一個(gè)超時(shí)等待項(xiàng),那么就可以允許進(jìn)程繼續(xù)執(zhí)行,而不至于進(jìn)入死鎖狀態(tài)。為了檢測(cè)出進(jìn)程沒(méi)有遇到等待條件而繼續(xù)向下執(zhí)行的情況,在等待語(yǔ)句后面可以加一條ASSERT(斷言)語(yǔ)句。

在例6-4中,每個(gè)等待語(yǔ)句的超時(shí)表達(dá)式用1?ms說(shuō)明。如果等待語(yǔ)句的等待時(shí)間超過(guò)了1?ms,則進(jìn)程將執(zhí)行下一條ASSERT語(yǔ)句。ASSERT語(yǔ)句的判斷條件為“假”,就向操作人員提供錯(cuò)誤信息輸出,從而有助于操作人員了解在進(jìn)程中發(fā)生了超時(shí)等待。

6.1.2斷言語(yǔ)句

斷言(ASSERT)語(yǔ)句主要用于程序仿真、調(diào)試中的人-機(jī)會(huì)話,它可以給出一個(gè)文字串作為警告和錯(cuò)誤信息。ASSERT語(yǔ)句的書(shū)寫(xiě)格式如下:

ASSERT條件[REPORT輸出信息][SEVERITY級(jí)別];

當(dāng)執(zhí)行ASSERT語(yǔ)句時(shí),就會(huì)對(duì)條件進(jìn)行判別。如果條件為“真”,則向下執(zhí)行另一個(gè)語(yǔ)句;如果條件為“假”,則輸出錯(cuò)誤信息和錯(cuò)誤嚴(yán)重程度的級(jí)別。在REPORT后面跟的是設(shè)計(jì)者所寫(xiě)的文字串,通常是說(shuō)明錯(cuò)誤的原因,文字串應(yīng)用雙引號(hào)"

"?括起來(lái)。

例如,在例6-4A進(jìn)程中的第一個(gè)等待語(yǔ)句后面跟的ASSERT語(yǔ)句如下:

ASSERT(sendB=‘1’)

REPORT“sendBtimedoutat‘1’

SEVERITYERROR;

該斷言語(yǔ)句的條件是信號(hào)量sendB

=

'1'。如果執(zhí)行到該語(yǔ)句時(shí),信號(hào)量sendB

=

'0',則說(shuō)明條件不滿足,就會(huì)輸出REPORT后跟的文字串。該文字串說(shuō)明出現(xiàn)了超時(shí)等待錯(cuò)誤。SEVERITY后跟的錯(cuò)誤級(jí)別告訴操作人員其出錯(cuò)級(jí)別為ERROR。ASSERT語(yǔ)句為程序的仿真和調(diào)試帶來(lái)了極大的方便。

6.1.3信號(hào)代入語(yǔ)句

信號(hào)代入語(yǔ)句的情況在第4章中已有詳述,這里只作歸納性的介紹。

信號(hào)代入語(yǔ)句的書(shū)寫(xiě)格式如下:

目的信號(hào)量<=信號(hào)量表達(dá)式;

該語(yǔ)句表明:將右邊信號(hào)量表達(dá)式的值賦予左邊的目的信號(hào)量。例如:

a<=b;

該語(yǔ)句表示將信號(hào)量b的當(dāng)前值賦予目的信號(hào)量a。需要再次指出的是,代入語(yǔ)句的符號(hào)“<=”和關(guān)系操作的小于等于符“<=”是一致的,要正確判別不同的操作關(guān)系,應(yīng)注意上下文的含義和說(shuō)明。另外,代入符號(hào)兩邊信號(hào)量的類型和位長(zhǎng)度應(yīng)該是一致的。

6.1.4變量賦值語(yǔ)句

變量賦值語(yǔ)句的書(shū)寫(xiě)格式如下:

目的變量?:=?表達(dá)式;

該語(yǔ)句表明:目的變量的值將由表達(dá)式所表達(dá)的新值替代,但是兩者的類型必須相同。目的變量的類型、范圍及初值在事先應(yīng)已給出過(guò)。右邊的表達(dá)式可以是變量、信號(hào)或字符。該變量和一般高級(jí)語(yǔ)言中的變量是類似的。

例如:

a:=2;

b:=3.0;

c:=d+e;

變量值只在進(jìn)程或子程序中使用,它無(wú)法傳遞到進(jìn)程之外。因此,它類似于一般高級(jí)語(yǔ)言的局部變量,只在局部范圍內(nèi)有效。93版引入了共享變量,共享變量可在全局范圍內(nèi)使用。

6.1.5IF語(yǔ)句

IF語(yǔ)句是根據(jù)所指定的條件來(lái)確定執(zhí)行哪些語(yǔ)句的,其書(shū)寫(xiě)格式通常可以分成以下3種類型。

1.IF語(yǔ)句的門閂控制

用作門閂控制的IF語(yǔ)句的書(shū)寫(xiě)格式如下:

IF條件THEN

順序處理語(yǔ)句

ENDIF;

當(dāng)程序執(zhí)行到該IF語(yǔ)句時(shí),就要判斷IF語(yǔ)句所指定的條件是否成立。如果條件成立,則IF語(yǔ)句所包含的順序處理語(yǔ)句將被執(zhí)行;如果條件不成立,則程序?qū)⑻^(guò)IF語(yǔ)句所包含的順序處理語(yǔ)句,而向下執(zhí)行IF語(yǔ)句后繼的語(yǔ)句。這里的條件起門閂的控制作用。

【例6-5】IF語(yǔ)句的門閂控制示例。

IF(a=‘1’)THEN

c<=b;

ENDIF;

該IF語(yǔ)句所描述的是一個(gè)門閂電路。例6-5中,a是門閂控制信號(hào)量;b是輸入信號(hào)量;c是輸出信號(hào)量。當(dāng)門閂控制信號(hào)量a為?'1'?時(shí),輸入信號(hào)量b的任何值的變化都將被賦予輸出信號(hào)量c。也就是說(shuō),c值與b值永遠(yuǎn)是相等的。當(dāng)a≠'1'?時(shí),c<=b語(yǔ)句不被執(zhí)行,c將維持原始值,而不管信號(hào)量b的值發(fā)生什么變化。

在例6-6中,IF語(yǔ)句的條件是時(shí)鐘信號(hào)clk發(fā)生變化,且時(shí)鐘信號(hào)clk='1'。只是在這個(gè)時(shí)候q端輸出復(fù)現(xiàn)d端輸入的信號(hào)值。當(dāng)該條件不滿足時(shí),q端維持原來(lái)的輸出值。

2.IF語(yǔ)句的二選擇控制

當(dāng)IF語(yǔ)句用作二選擇控制時(shí)的書(shū)寫(xiě)格式如下:

IF條件THEN

順序處理語(yǔ)句;

ELSE

順序處理語(yǔ)句;

ENDIF;

在這種格式的IF語(yǔ)句中,當(dāng)IF語(yǔ)句所指定的條件滿足時(shí),將執(zhí)行THEN和ELSE之間所界定的順序處理語(yǔ)句;當(dāng)IF語(yǔ)句所指定的條件不滿足時(shí),將執(zhí)行ELSE和ENDIF之間所界定的順序處理語(yǔ)句。也就是說(shuō),用條件來(lái)選擇兩條不同程序執(zhí)行的路徑。

這種描述的典型邏輯電路實(shí)例是二選一電路。

【例6-7】二選一電路的輸入為a和b,選擇控制端為sel,輸出端為c時(shí),用IF語(yǔ)句描述該電路行為的程序如下:

3.IF語(yǔ)句的多選擇控制

IF語(yǔ)句的多選擇控制又稱IF語(yǔ)句的嵌套,其書(shū)寫(xiě)格式如下:

IF條件THEN

順序處理語(yǔ)句;

ELSIF條件THEN

順序處理語(yǔ)句;

ELSIF條件THEN

順序處理語(yǔ)句;

ELSE

順序處理語(yǔ)句;

ENDIF;

在這種多選擇控制的IF語(yǔ)句中,設(shè)置了多個(gè)條件,當(dāng)滿足所設(shè)置的多個(gè)條件之一時(shí),執(zhí)行該條件后跟的順序處理語(yǔ)句;如果所有設(shè)置的條件都不滿足,則執(zhí)行ELSE和ENDIF之間的順序處理語(yǔ)句。這種描述的典型邏輯電路實(shí)例是多選一電路。

【例6-8】四選一電路的描述。

IF語(yǔ)句不僅可以用于選擇器的設(shè)計(jì),還可以用于比較器、譯碼器等凡是可以進(jìn)行條件控制的邏輯電路設(shè)計(jì)。

需要注意的是,IF語(yǔ)句的條件判斷輸出是布爾量,即是“真”(TRUE)或“假”(FALSE)。因此在IF語(yǔ)句的條件表達(dá)式中只能使用關(guān)系運(yùn)算操作(=、/=、<、>、<=、>=)及邏輯運(yùn)算操作的組合表達(dá)式。

6.1.6CASE語(yǔ)句

CASE語(yǔ)句用來(lái)描述總線或編碼、譯碼的行為,從許多不同語(yǔ)句的序列中選擇其中之一來(lái)執(zhí)行。雖然IF語(yǔ)句也有類似的功能,但是CASE語(yǔ)句的可讀性比IF語(yǔ)句要強(qiáng)得多,程序的閱讀者很容易找出條件式和動(dòng)作的對(duì)應(yīng)關(guān)系。CASE語(yǔ)句的書(shū)寫(xiě)格式如下:

CASE表達(dá)式IS

WHEN條件表達(dá)式=>順序處理語(yǔ)句;

ENDCASE;

上述CASE語(yǔ)句中的條件表達(dá)式可以有如下4種不同的表示形式:

WHEN值=>順序處理語(yǔ)句;

WHEN值|值|值|…|值=>順序處理語(yǔ)句;

WHEN值TO值=>順序處理語(yǔ)句;

WHENOTHERS=>順序處理語(yǔ)句;

當(dāng)CASE和IS之間的表達(dá)式的取值滿足指定的條件表達(dá)式的值時(shí),程序?qū)?zhí)行后跟的由符號(hào)=>所指的順序處理語(yǔ)句。條件表達(dá)式的值可以是一個(gè)值,也可以是多個(gè)值的“或”關(guān)系,還可以是一個(gè)取值范圍或者表示其他所有的缺省值。

【例6-9】當(dāng)條件表達(dá)式取值為某一值時(shí),CASE語(yǔ)句的使用實(shí)例。

例6-9表明,選擇器的行為描述不僅可以用IF語(yǔ)句,還可以用CASE語(yǔ)句。但是它們兩者還是有區(qū)別的。首先在IF語(yǔ)句中,先處理最起始的條件,如果不滿足,則再處理下一個(gè)條件;在CASE語(yǔ)句中,沒(méi)有值的順序號(hào),所有值是并行處理的。因此,在WHEN項(xiàng)中已用過(guò)的值,如果在后面WHEN項(xiàng)中再次使用,那么在語(yǔ)法上是錯(cuò)誤的。也就是說(shuō),值不能重復(fù)使用。另外,應(yīng)該將表達(dá)式的所有取值都一一列舉出來(lái),如果不列舉出表達(dá)式的所有取值,那么在語(yǔ)法上也是錯(cuò)誤的。

在例6-10中,indata是矢量型數(shù)據(jù),除了取值為“0”和“1”之外,還有可能取值為“X”、“Z”和“U”。盡管這些取值在邏輯電路綜合時(shí)沒(méi)有用,但是,在CASE中卻必須把所有可能取的值都描述出來(lái),故在本例中應(yīng)加WHENOTHERS項(xiàng),使得它包含y輸出的所有缺省值。當(dāng)WHEN后跟的值不同,但是輸出相同時(shí),可以用符號(hào)“1”來(lái)描述。例如,例6-10中WHENOTHERS項(xiàng)也可以寫(xiě)成:

WHEN"UZX"|"ZXU"|"UUZ"|…|"UUU"=>y<="XXXXXXXX";

所有“U”、“Z”、“X”三種狀態(tài)的排列表示不同的取值。但是所有這些排列使三-八譯碼器的輸出值是一致的。因此,WHEN后面可以用OTHERS符號(hào)來(lái)列舉所有可能的取值。

同樣,當(dāng)輸入值在某一個(gè)連續(xù)范圍內(nèi),其對(duì)應(yīng)的輸出值相同時(shí),若用CASE語(yǔ)句,則在WHEN后面可以用“TO”來(lái)表示一個(gè)取值的范圍。例如,對(duì)自然數(shù)取值范圍為1~9,則可表示為WHEN1TO9=>…。

應(yīng)該再次提醒的是,WHEN后跟的“=>”符號(hào)不是關(guān)系運(yùn)算操作符,它在這里僅僅描述值和對(duì)應(yīng)執(zhí)行語(yǔ)句的對(duì)應(yīng)關(guān)系。

在進(jìn)行組合邏輯電路設(shè)計(jì)時(shí),往往會(huì)碰到任意項(xiàng),即在實(shí)際正常工作時(shí)不可能出現(xiàn)的那些輸入狀態(tài)。在利用卡諾圖對(duì)邏輯進(jìn)行化簡(jiǎn)時(shí),可以把這些項(xiàng)看作“1”或者“0”,從而使邏輯電路得到簡(jiǎn)化。

例6-11中的WHENOTHERS語(yǔ)句和例6-10中的WHENOTHERS語(yǔ)句盡管最后都將“X”值代入y,但是其含義是不一樣的。例6-10中,在正常情況下,所有的輸入狀態(tài)從000到111都在CASE語(yǔ)句的OTHERS之前羅列出來(lái)了,因此在邏輯綜合時(shí)就不會(huì)有什么不利影響。例6-11中,輸入的所有狀態(tài)并未在CASE語(yǔ)句的OTHERS之前都羅列出來(lái)。例如,當(dāng)某一項(xiàng)輸入同時(shí)出現(xiàn)兩個(gè)或兩個(gè)以上“0”時(shí),y輸出值就將變?yōu)椤癤”(可能是“0”,也可能是“1”)。如果邏輯綜合時(shí),可以認(rèn)為這些是不可能的輸出項(xiàng),那么就可以大大簡(jiǎn)化邏輯電路的設(shè)計(jì)。在仿真時(shí)如果出現(xiàn)了不確定的“X”值,則可以檢查是否出現(xiàn)了不正確的輸入。

如果用CASE語(yǔ)句描述具有兩個(gè)以上“0”的情況,并使它們針對(duì)某一特定的y輸出,例如OTHERS改寫(xiě)為

WHENOTHERS=>y<=“111”;

那么在邏輯電路綜合時(shí),就會(huì)使電路的規(guī)模和復(fù)雜性大大增加。

在目前VHDL的標(biāo)準(zhǔn)中還沒(méi)有能對(duì)輸入任意項(xiàng)進(jìn)行處理的方法。優(yōu)先級(jí)編碼器的真值表如表6-1所示。表中,標(biāo)有“—”符號(hào)的輸入項(xiàng)為任意項(xiàng),也就是說(shuō)標(biāo)有“—”的位其值可以取“1”,也可以取“0”。

如果想用CASE語(yǔ)句來(lái)描述優(yōu)先級(jí)編碼電路,則必須用到下述語(yǔ)句:

WHEN“XXXXXXX0”=>y<=“111”;

WHEN“XXXXXX01”=>y<=“110”;

顯然,這樣的描述語(yǔ)句在VHDL中還未制定出來(lái),因此不能使用這種非法的語(yǔ)句。此時(shí)利用IF語(yǔ)句則能正確地描述優(yōu)先級(jí)編碼器的功能。

在例6-12中,IF語(yǔ)句首先判別input(0)是否為“0”,然后依順序判別下去。如果該程序中首先判別input(6)是否為“0”,則然后判別input(5)是否為“0”,這樣一直判別到input(0)是否為“0”。盡管每種情況所使用的條件是一樣的,而且每種條件也只用到一次,但是其結(jié)果卻是不一樣的。例6-12中所采用的判別順序是正確的,它正確地反映了優(yōu)先級(jí)編碼器的功能;由input(6)?到input(0)?進(jìn)行判別的順序是錯(cuò)誤的,它不能正確反映優(yōu)先級(jí)編碼器的功能,其原因請(qǐng)讀者自己思考。

通常在CASE語(yǔ)句中,WHEN語(yǔ)句可以顛倒次序而不致于發(fā)生錯(cuò)誤;在IF語(yǔ)句中,顛倒條件判別的次序往往會(huì)使綜合的邏輯功能發(fā)生變化。這一點(diǎn)希望讀者切記。

在大多數(shù)情況下,能用CASE語(yǔ)句描述的邏輯電路同樣也可以用IF語(yǔ)句來(lái)描述,例如,例6-8用IF語(yǔ)句描述的四選一電路和例6-9用CASE語(yǔ)句描述的四選一電路。

目前IEEE正在對(duì)任意項(xiàng)描述的VHDL標(biāo)準(zhǔn)進(jìn)行深入探討,相信在不久的將來(lái),像優(yōu)先級(jí)編碼器那樣的邏輯電路也完全可以用CASE語(yǔ)句進(jìn)行描述。

6.1.7LOOP語(yǔ)句

LOOP語(yǔ)句與其他高級(jí)語(yǔ)言中的循環(huán)語(yǔ)句一樣,使程序能進(jìn)行有規(guī)則的循環(huán),循環(huán)的次數(shù)受迭代算法控制。在VHDL中,LOOP語(yǔ)句常用來(lái)描述位片邏輯及迭代電路的行為。

LOOP語(yǔ)句的書(shū)寫(xiě)格式一般有兩種。

1.FOR循環(huán)變量

這種LOOP語(yǔ)句的書(shū)寫(xiě)格式如下:

[標(biāo)號(hào)]:FOR循環(huán)變量IN離散范圍LOOP

順序處理語(yǔ)句;

ENDLOOP[標(biāo)號(hào)];

LOOP語(yǔ)句中的循環(huán)變量的值在每次循環(huán)中都將發(fā)生變化,而IN后跟的離散范圍則表示循環(huán)變量在循環(huán)過(guò)程中依次取值的范圍。例如:

ASUM:FORiIN1TO9LOOP

sum=i+sum; --sum初始值為0

ENDLOOPASUM;

在該例中,i是循環(huán)變量,它可取值1,2,…,9,共9個(gè)值。也就是說(shuō),sum=i+sum的算式應(yīng)循環(huán)計(jì)算9次。該程序?qū)?~9的數(shù)進(jìn)行累加計(jì)算。

在例6-13中有以下幾點(diǎn)需要說(shuō)明:

(1)

tmp是變量,它只能在進(jìn)程內(nèi)部說(shuō)明,因?yàn)樗且粋€(gè)局部量。

(2)

FOR-LOOP語(yǔ)句中的i無(wú)論在信號(hào)說(shuō)明和變量說(shuō)明中都未涉及,它是一個(gè)循環(huán)變量。如前例所述,它是一個(gè)整數(shù)變量。信號(hào)和變量都不能代入到此循環(huán)變量中。

(3)如果tmp變量值要從進(jìn)程內(nèi)部輸出,則必須將它代入信號(hào)量,信號(hào)量是全局的,可以將值帶出進(jìn)程。在例6-13中,tmp的值通過(guò)信號(hào)y帶出進(jìn)程。

2.WHILE條件

這種LOOP語(yǔ)句的書(shū)寫(xiě)格式如下:

[標(biāo)號(hào)]:WHILE條件LOOP

順序處理語(yǔ)句;

ENDLOOP[標(biāo)號(hào)];

在該LOOP語(yǔ)句中,如果條件為“真”,則進(jìn)行循環(huán);如果條件為“假”,則結(jié)束循環(huán)。

例如:

i:=1;

sum:=0;

sbcd:WHILE(i<10)LOOP

sum:=i+sum;

i:=i+1;

ENDLOOPsbcd;

該例和FOR-LOOP語(yǔ)句示例的行為是一樣的,都是對(duì)1~9的數(shù)求累加和的運(yùn)算。這里利用了i<10的條件使程序結(jié)束循環(huán),而循環(huán)控制變量i的遞增是通過(guò)算式i:=i+1來(lái)實(shí)現(xiàn)的。

【例6-14】將例6-13中的8位奇偶校驗(yàn)電路的行為用WHILE條件的LOOP語(yǔ)句來(lái)描述。

雖然FOR-LOOP和WHILE-LOOP語(yǔ)句都可以用來(lái)進(jìn)行邏輯綜合,但是一般不太采用WHILE-LOOP語(yǔ)句來(lái)進(jìn)行RTL描述。

6.1.8NEXT語(yǔ)句

在LOOP語(yǔ)句中,NEXT語(yǔ)句用來(lái)跳出本次循環(huán),其書(shū)寫(xiě)格式如下:

NEXT

[標(biāo)號(hào)][WHEN條件];

NEXT語(yǔ)句執(zhí)行時(shí)將停止本次迭代,而轉(zhuǎn)入下一次新的迭代。NEXT后跟的“標(biāo)號(hào)”表明下一次迭代的起始位置,而“WHEN條件”則表明NEXT語(yǔ)句執(zhí)行的條件。如果NEXT語(yǔ)句后面既無(wú)“標(biāo)號(hào)”,也無(wú)“WHEN條件”,那么只要執(zhí)行到該語(yǔ)句就立即無(wú)條件地跳出本次循環(huán),從LOOP語(yǔ)句的起始位置進(jìn)入下一次循環(huán),即進(jìn)行下一次迭代。

【例6-15】NEXT語(yǔ)句示例。

當(dāng)LOOP語(yǔ)句嵌套時(shí),通常NEXT語(yǔ)句應(yīng)標(biāo)有“標(biāo)號(hào)”和“WHEN條件”。例如,有一個(gè)LOOP嵌套的程序如下:

在上例中,當(dāng)i=j時(shí),NEXT語(yǔ)句被執(zhí)行,程序?qū)膬?nèi)循環(huán)中跳出,而再?gòu)南乱淮瓮庋h(huán)中開(kāi)始執(zhí)行。

由此可知,NEXT語(yǔ)句實(shí)際上是用于LOOP語(yǔ)句的內(nèi)部循環(huán)控制語(yǔ)句。

6.1.9EXIT語(yǔ)句

EXIT語(yǔ)句也是LOOP語(yǔ)句中使用的循環(huán)控制語(yǔ)句。與NEXT語(yǔ)句不同的是,執(zhí)行

EXIT語(yǔ)句將結(jié)束循環(huán)狀態(tài),而從LOOP語(yǔ)句中跳出,結(jié)束LOOP語(yǔ)句的正常執(zhí)行。EXIT語(yǔ)句的書(shū)寫(xiě)格式如下:

EXIT[標(biāo)號(hào)][WHEN條件];

如果EXIT后面沒(méi)有跟“標(biāo)號(hào)”和“WHEN條件”,則程序執(zhí)行到該語(yǔ)句時(shí)就無(wú)條件地從LOOP語(yǔ)句中跳出,結(jié)束循環(huán)狀態(tài),繼續(xù)執(zhí)行LOOP語(yǔ)句后繼的語(yǔ)句。

在該例中,int_a通常代入大于0的正數(shù)值。如果int_a的取值為負(fù)值或零,則將出現(xiàn)錯(cuò)誤狀態(tài),算式不能計(jì)算。也就是說(shuō),int_a小于或等于0時(shí),IF語(yǔ)句將返回“真”值,EXIT語(yǔ)句得到執(zhí)行,LOOP語(yǔ)句執(zhí)行結(jié)束,程序?qū)⑾蛳聢?zhí)行LOOP語(yǔ)句后繼的語(yǔ)句。

EXIT語(yǔ)句具有3種基本的書(shū)寫(xiě)格式。第一種書(shū)寫(xiě)格式是EXIT語(yǔ)句沒(méi)有“循環(huán)標(biāo)號(hào)”或“WHEN條件”。當(dāng)條件為“真”,執(zhí)行EXIT語(yǔ)句時(shí),程序?qū)慈缦马樞驁?zhí)行:執(zhí)行EXIT,程序?qū)H僅從當(dāng)前所屬的LOOP語(yǔ)句中退出。如果EXIT語(yǔ)句位于一個(gè)內(nèi)循環(huán)LOOP語(yǔ)句中,即該LOOP語(yǔ)句嵌在任何其他一個(gè)LOOP語(yǔ)句中,那么執(zhí)行EXIT,程序僅僅退出內(nèi)循環(huán),而仍然留在外循環(huán)的LOOP語(yǔ)句中。

第二種書(shū)寫(xiě)格式是EXIT語(yǔ)句后跟LOOP語(yǔ)句的標(biāo)號(hào)。此時(shí),執(zhí)行EXIT語(yǔ)句,程序?qū)⑻了f(shuō)明的標(biāo)號(hào)。

第三種書(shū)寫(xiě)格式是EXIT語(yǔ)句后跟“WHEN條件”語(yǔ)句。當(dāng)程序執(zhí)行到該語(yǔ)句時(shí),只有在所說(shuō)明的條件為“真”的情況下,才跳出循環(huán)的LOOP語(yǔ)句。此時(shí),不管EXIT語(yǔ)句是否有標(biāo)號(hào)說(shuō)明,都將執(zhí)行下一條語(yǔ)句。如果有標(biāo)號(hào)說(shuō)明,則下一條要執(zhí)行的語(yǔ)句將是標(biāo)號(hào)所說(shuō)明的語(yǔ)句;如果無(wú)標(biāo)號(hào)說(shuō)明,則下一條要執(zhí)行的語(yǔ)句是循環(huán)外的下一條語(yǔ)句。

EXIT語(yǔ)句是一條很有用的控制語(yǔ)句。當(dāng)程序需要處理保護(hù)、出錯(cuò)和警告狀態(tài)時(shí),它能提供一個(gè)快捷、簡(jiǎn)便的方法。

6.2并發(fā)描述語(yǔ)句

在VHDL中能進(jìn)行并發(fā)處理的語(yǔ)句有:進(jìn)程(PROCESS)語(yǔ)句、并發(fā)信號(hào)代入(ConcurrentSignalAssignment)語(yǔ)句、條件信號(hào)代入(ConditionalSignalAssignment)語(yǔ)句、選擇信號(hào)代入(SelectiveSignalAssignment)語(yǔ)句、并發(fā)過(guò)程調(diào)用(ConcurrentProcedureCall)語(yǔ)句和塊(BLOCK)語(yǔ)句。

6.2.1進(jìn)程語(yǔ)句

進(jìn)程(PROCESS)語(yǔ)句在前面已多次提到,并在眾多實(shí)例中得到了廣泛的使用。進(jìn)程語(yǔ)句是一種并發(fā)處理語(yǔ)句,在一個(gè)構(gòu)造體中多個(gè)PROCESS語(yǔ)句可以同時(shí)并發(fā)運(yùn)行。因此,PROCESS語(yǔ)句是VHDL中描述硬件系統(tǒng)并發(fā)行為的最基本語(yǔ)句。

PROCESS語(yǔ)句歸納起來(lái)具有如下幾個(gè)特點(diǎn):

(1)它可以與其他進(jìn)程并發(fā)運(yùn)行,并可存取構(gòu)造體或?qū)嶓w名中所定義的信號(hào);

(2)進(jìn)程結(jié)構(gòu)中的所有語(yǔ)句都是按順序執(zhí)行的;

(3)為啟動(dòng)進(jìn)程,在進(jìn)程結(jié)構(gòu)中必須包含一個(gè)顯式的敏感信號(hào)量表或者包含一個(gè)WAIT語(yǔ)句;

(4)進(jìn)程之間的通信是通過(guò)信號(hào)量傳遞來(lái)實(shí)現(xiàn)的。

后面要提到的一些并發(fā)語(yǔ)句實(shí)質(zhì)上是一種進(jìn)程的縮寫(xiě)形式,它們?nèi)钥梢詺w屬于進(jìn)程語(yǔ)句。

6.2.2并發(fā)信號(hào)代入語(yǔ)句

在5.1節(jié)中已詳述了代入語(yǔ)句的功能和相關(guān)問(wèn)題,這里重提代入語(yǔ)句,并且冠以“并發(fā)信號(hào)”的詞句,主要是為了強(qiáng)調(diào)該語(yǔ)句的并發(fā)性。代入語(yǔ)句(信號(hào)代入語(yǔ)句)可以在進(jìn)程內(nèi)部使用,此時(shí)它作為順序語(yǔ)句形式出現(xiàn);代入語(yǔ)句(并發(fā)信號(hào)代入語(yǔ)句)也可以在構(gòu)造體的進(jìn)程之外使用,此時(shí)它作為并發(fā)語(yǔ)句形式出現(xiàn)。一個(gè)并發(fā)信號(hào)代入語(yǔ)句實(shí)際上是一個(gè)進(jìn)程的縮寫(xiě)。

例如:

由信號(hào)代入語(yǔ)句的功能可知,當(dāng)代入符號(hào)“<=”右邊的信號(hào)值發(fā)生任何變化時(shí),代入操作就會(huì)立即發(fā)生,新的值將賦予代入符號(hào)“<=”左邊的信號(hào)。從進(jìn)程語(yǔ)句的描述來(lái)看,在PROCESS語(yǔ)句的括號(hào)中列出了敏感信號(hào)量表,上例中是a和i。由PROCESS語(yǔ)句的功能可知,仿真時(shí)進(jìn)程一直在監(jiān)視敏感信號(hào)量表中的敏感信號(hào)量a和i。一旦任何一個(gè)敏感信號(hào)量發(fā)生新的變化,將使其值有一個(gè)新的改變,進(jìn)程將得到啟動(dòng),代入語(yǔ)句將被執(zhí)行,新的值將從output信號(hào)量輸出。

由上面的敘述可知,并發(fā)信號(hào)代入語(yǔ)句和進(jìn)程語(yǔ)句在這種情況下確實(shí)是等效的。

并發(fā)信號(hào)代入語(yǔ)句在仿真時(shí)刻同時(shí)運(yùn)行,它表征了各個(gè)獨(dú)立器件的各自的獨(dú)立操作。例如:

a<=b+c;

d<=e*f;

第一個(gè)語(yǔ)句描述了一個(gè)加法器的行為,第二個(gè)語(yǔ)句描述了一個(gè)乘法器的行為。在實(shí)際硬件系統(tǒng)中,加法器和乘法器是獨(dú)立并行工作的?,F(xiàn)在第一個(gè)語(yǔ)句和第二個(gè)語(yǔ)句都是并發(fā)信號(hào)代入語(yǔ)句,在仿真時(shí)刻,這兩個(gè)語(yǔ)句是并發(fā)處理的,從而真實(shí)地模擬了實(shí)際硬件系統(tǒng)中的加法器和乘法器的工作。

并發(fā)信號(hào)代入語(yǔ)句可以仿真加法器、乘法器、除法器、比較器及各種邏輯電路的輸出。因此,在代入符號(hào)“<=”的右邊可以用算術(shù)運(yùn)算表達(dá)式,也可以用邏輯運(yùn)算表達(dá)式,還可以用關(guān)系操作表達(dá)式來(lái)表示。

6.2.3條件信號(hào)代入語(yǔ)句

條件信號(hào)代入語(yǔ)句也是并發(fā)描述語(yǔ)句,它可以根據(jù)不同條件將不同的多個(gè)表達(dá)式之一的值代入信號(hào)量,其書(shū)寫(xiě)格式如下:

在每個(gè)表達(dá)式后面都跟有用“WHEN”所指定的條件,如果滿足該條件,則該表達(dá)式的值代入目的信號(hào)量;如果不滿足條件,則再判別下一個(gè)表達(dá)式所指定的條件。最后一個(gè)表達(dá)式可以不跟條件。在上述表達(dá)式所指明的條件都不滿足時(shí),將該表達(dá)式的值代入目標(biāo)信號(hào)量。

條件信號(hào)代入語(yǔ)句與前述IF語(yǔ)句的不同之處就在于:后者只能在進(jìn)程內(nèi)部使用(因?yàn)樗鼈兪琼樞蛘Z(yǔ)句),而且與IF語(yǔ)句相比,條件信號(hào)代入語(yǔ)句中的ELSE是一定要有的,IF語(yǔ)句則可以有,也可以沒(méi)有。另外,與IF語(yǔ)句不同的是,條件信號(hào)代入語(yǔ)句不能進(jìn)行嵌套,因此,受制于沒(méi)有自身值代入的描述,不能生成鎖存電路。用條件信號(hào)代入語(yǔ)句所描述的電路與邏輯電路的工作情況比較貼近,這樣往往要求設(shè)計(jì)者具有較多的硬件電路知識(shí),從而使一般設(shè)計(jì)者難于掌握。一般來(lái)說(shuō),只有當(dāng)用進(jìn)程語(yǔ)句、IF語(yǔ)句和CASE語(yǔ)句難于描述時(shí),才使用條件信號(hào)代入語(yǔ)句。

6.2.4選擇信號(hào)代入語(yǔ)句

選擇信號(hào)代入語(yǔ)句類似于CASE語(yǔ)句,它對(duì)表達(dá)式進(jìn)行測(cè)試,當(dāng)表達(dá)式取值不同時(shí),將使不同的值代入目的信號(hào)量。選擇信號(hào)代入語(yǔ)句的書(shū)寫(xiě)格式如下:

【例6-18】四選一電路用選擇信號(hào)代入語(yǔ)句所描述的程序如下:

例6-18中的選擇信號(hào)代入語(yǔ)句根據(jù)sel的當(dāng)前不同值來(lái)完成i0、i1、i2、i3及剩余情況的選擇功能。選擇信號(hào)代入語(yǔ)句在進(jìn)程外使用。當(dāng)被選擇的信號(hào)(例如sel)發(fā)生變化時(shí),該語(yǔ)句就會(huì)啟動(dòng)執(zhí)行。由此可見(jiàn),選擇信號(hào)的并發(fā)代入,可以在進(jìn)程外實(shí)現(xiàn)CASE語(yǔ)句進(jìn)程的功能。

【例6-19】四選一電路用CASE語(yǔ)句所描述的程序如下:

對(duì)照例6-18和例6-19可以看到,兩者功能是完全一樣的,所不同的僅僅是描述方法有區(qū)別而已。

6.2.5并發(fā)過(guò)程調(diào)用語(yǔ)句

并發(fā)過(guò)程調(diào)用語(yǔ)句可以出現(xiàn)在構(gòu)造體中,它是一種可以在進(jìn)程之外執(zhí)行的過(guò)程調(diào)用語(yǔ)句。有關(guān)過(guò)程的結(jié)構(gòu)及書(shū)寫(xiě)方法在3.2節(jié)中已詳述,這里僅就調(diào)用時(shí)應(yīng)注意的幾個(gè)問(wèn)題作一說(shuō)明。

(1)并發(fā)過(guò)程調(diào)用語(yǔ)句是一個(gè)完整的語(yǔ)句,在它的前面可以加標(biāo)號(hào);

(2)并發(fā)過(guò)程調(diào)用語(yǔ)句應(yīng)帶有IN、OUT或者INOUT參數(shù),它們應(yīng)列于過(guò)程名后跟的括號(hào)內(nèi);

(3)并發(fā)過(guò)程調(diào)用可以有多個(gè)返回值,但這些返回值必須通過(guò)過(guò)程中所定義的輸出參數(shù)帶回。

該例中的Vector_to_int并發(fā)過(guò)程調(diào)用是對(duì)位矢量z進(jìn)行數(shù)制轉(zhuǎn)換,使之變成十進(jìn)制的整數(shù)q;x_flag是標(biāo)志位,當(dāng)標(biāo)志位為“真”時(shí)表明轉(zhuǎn)換失敗,當(dāng)標(biāo)志位為“假”時(shí)表明轉(zhuǎn)換成功。

這種并發(fā)過(guò)程調(diào)用語(yǔ)句實(shí)際上是一個(gè)過(guò)程調(diào)用進(jìn)程的簡(jiǎn)寫(xiě)。如3.2節(jié)所述,過(guò)程調(diào)用語(yǔ)句可以出現(xiàn)在進(jìn)程語(yǔ)句中,如果該進(jìn)程的作用就是進(jìn)行過(guò)程調(diào)用,完成該過(guò)程的操作功能,那么兩者是完全等效的。由此可知,上例的并發(fā)過(guò)程調(diào)用語(yǔ)句和下面的過(guò)程調(diào)用進(jìn)程是完全等效的,因?yàn)閮烧叨际菫榱送瓿晌皇噶恐琳麛?shù)的轉(zhuǎn)換。

在構(gòu)造體中的并發(fā)過(guò)程調(diào)用語(yǔ)句也由過(guò)程信號(hào)敏感量的變化而得到啟動(dòng),例如上例的位矢量z的變化將使Vector_to_int語(yǔ)句得到啟動(dòng),并執(zhí)行之。執(zhí)行結(jié)果將拷貝到x_flag和q中,構(gòu)造體中的其他語(yǔ)句就可以使用該結(jié)果。

另外,還存在這樣一個(gè)問(wèn)題,盡管某一個(gè)目標(biāo)量并未編入過(guò)程的自變量表中,但是過(guò)程中目標(biāo)量的值卻發(fā)生了變化。例如,過(guò)程中某一語(yǔ)句的代入操作可能使構(gòu)造體中的一個(gè)信號(hào)量的值發(fā)生變化,而這個(gè)信號(hào)量并未編入過(guò)程的自變量表中。再如,如果有兩個(gè)信號(hào)并未在過(guò)程的自變量表中說(shuō)明,但是在現(xiàn)行過(guò)程的過(guò)程調(diào)用中發(fā)生了代入操作,則這樣的信號(hào)量的代入操作都會(huì)帶來(lái)問(wèn)題。因此在編寫(xiě)過(guò)程語(yǔ)句時(shí)應(yīng)很好地注意這個(gè)問(wèn)題,不要使類似的問(wèn)題發(fā)生。

6.2.6塊語(yǔ)句

在3.2節(jié)中已經(jīng)介紹,塊(BLOCK)語(yǔ)句是一個(gè)并發(fā)語(yǔ)句,它所包含的一系列語(yǔ)句也是并發(fā)語(yǔ)句,而且塊語(yǔ)句中的并發(fā)語(yǔ)句的執(zhí)行與次序無(wú)關(guān)。為便于BLOCK語(yǔ)句的使用,這里再詳細(xì)介紹一下BLOCK語(yǔ)句的書(shū)寫(xiě)格式。BLOCK語(yǔ)句的書(shū)寫(xiě)格式如下:

其中,“塊頭”主要用于信號(hào)的映射及參數(shù)的定義,通常通過(guò)GENERIC語(yǔ)句、GENERIC_MAP語(yǔ)句、PORT語(yǔ)句和PORT_MAP語(yǔ)句來(lái)實(shí)現(xiàn)?!罢f(shuō)明語(yǔ)句”與構(gòu)造體的說(shuō)明語(yǔ)句相同,主要是對(duì)該塊所要用到的客體加以說(shuō)明。可說(shuō)明的項(xiàng)目有以下幾種:

(1)

USE子句;

(2)子程序說(shuō)明及子程序體;

(3)類型說(shuō)明;

(4)常數(shù)說(shuō)明;

(5)信號(hào)說(shuō)明;

(6)元件說(shuō)明。

BLOCK語(yǔ)句常用于構(gòu)造體的結(jié)構(gòu)化描述。

【例6-20】如果想設(shè)計(jì)一個(gè)CPU芯片,為簡(jiǎn)化起見(jiàn),假設(shè)這個(gè)CPU只由ALU模塊和REG8(寄存器)模塊組成。ALU模塊和REG8模塊的行為分別由兩個(gè)BLOCK語(yǔ)句來(lái)描述。每個(gè)模塊相當(dāng)于CPU電原理圖中的子原理圖(REG8模塊又由8個(gè)子塊REG1,REG2,…,REG8構(gòu)成)。在每個(gè)塊內(nèi)有局部信號(hào)、數(shù)據(jù)類型、常數(shù)等說(shuō)明。任何一個(gè)客體可以在構(gòu)造體中說(shuō)明,也可以在塊中說(shuō)明。

程序如下:

在例6-20中,CPU模塊有4個(gè)端口用作與外面的接口。其中,clk、interrupt是輸入端口;addr是輸出端口;data是雙向端口。該實(shí)體的構(gòu)造體中的所有BLOCK對(duì)這些信號(hào)都是用顯式說(shuō)明的,全都可以在BLOCK內(nèi)使用。

信號(hào)ibus和dbus是構(gòu)造體cpu_blk中的局部信號(hào)量,它只能在構(gòu)造體cpu_blk中使用,在構(gòu)造體cpu_blk之外不能使用。只要是在cpu_blk構(gòu)造體內(nèi),無(wú)論在哪一個(gè)BLOCK塊中這些信號(hào)量都是可以使用的。另外,由于BLOCK塊是可以嵌套的,因此內(nèi)層BLOCK塊能夠使用外層BLOCK塊所說(shuō)明的信號(hào),而外層BLOCK塊卻不能夠使用內(nèi)層BLOCK塊中所說(shuō)明的信號(hào)。

例如,例6-20中的qbus信號(hào)只在ALU塊中說(shuō)明。因此,它是ALU塊的局部信號(hào)量,所有ALU塊中的語(yǔ)句都可以使用qbus信號(hào),但是在ALU塊之外則不能使用該信號(hào),如REG8塊就不能使用qbus信號(hào)。再如,zbus信號(hào)是REG8塊所說(shuō)明的局部信號(hào)量,REG1塊是嵌套在REG8塊中的內(nèi)層塊,所以REG1塊可以使用zbus信號(hào)。

在REG1塊的信號(hào)說(shuō)明項(xiàng)中也有一個(gè)稱為qbus的信號(hào),該信號(hào)與BLOCK塊中所說(shuō)明的信號(hào)具有相同的名字,那么這樣做會(huì)不會(huì)引起問(wèn)題呢?事實(shí)上,編譯器將分別對(duì)這兩個(gè)信號(hào)進(jìn)行處理。這在語(yǔ)法上雖然是合法的,但是容易引起混淆。兩個(gè)信號(hào)分別在各自的說(shuō)明區(qū)域中加以說(shuō)明,同樣也僅僅在這些范圍中有效。因此,可以這樣認(rèn)為,它們是具有相同信號(hào)名的各自獨(dú)立的信號(hào),每個(gè)qbus只能在所說(shuō)明的BLOCK塊區(qū)域中使用。

此外,還有一種應(yīng)該注意的情況如下:

在上述實(shí)例中,信號(hào)qbus在兩個(gè)塊中都做了說(shuō)明。應(yīng)注意的是,這兩個(gè)塊是嵌套關(guān)系,一個(gè)塊包含另一個(gè)塊?,F(xiàn)在先來(lái)看一下BLK2塊對(duì)信號(hào)qbus的操作。第一種類型的操作是BLK2中的語(yǔ)句對(duì)BLK2中所說(shuō)明的局部信號(hào)量qbus進(jìn)行的操作;第二種類型的操作是BLK2中的語(yǔ)句對(duì)BLK1中所說(shuō)明的局部信號(hào)量qbus進(jìn)行的操作(由于BLK1包含BLK2,因此這種操作是允許的)。由此可見(jiàn),BLK1塊所說(shuō)明的信號(hào)可以看作BLK2塊內(nèi)部說(shuō)明的信號(hào)。如果名字相同,則可以在信號(hào)名字前面加塊名字前綴。例如,在本例中BLK1塊的qbus可以用BLK1_qbus來(lái)表示。

通常,這種同名信號(hào)會(huì)使編程發(fā)生混亂。出現(xiàn)這個(gè)問(wèn)題的起因是:在有限的時(shí)間內(nèi),如果不對(duì)信號(hào)說(shuō)明進(jìn)行詳細(xì)分析,則不能保證正確地使用qbus信號(hào)。

以上所提到的只是塊本身范圍所涉及的問(wèn)題。但是,塊是一個(gè)獨(dú)立的子結(jié)構(gòu),它可以包含PORT和GENERIC語(yǔ)句。這樣就允許設(shè)計(jì)者通過(guò)這兩個(gè)語(yǔ)句將塊內(nèi)的信號(hào)變化傳遞給塊的外部信號(hào),同樣也可以將塊外部的信號(hào)變化傳遞給塊的內(nèi)部。

PORT和GENERIC語(yǔ)句的這種性能將允許在一個(gè)新的設(shè)計(jì)中重復(fù)使用BLOCK塊。例如,在上例的CPU的設(shè)計(jì)中,如果需要擴(kuò)展ALU部分的功能,則可設(shè)計(jì)一個(gè)新的ALU模塊,使其完成新的所需要的功能。在新的CPU模塊中,PORT名和GENERIC名與原來(lái)的不一致,此時(shí),在塊中采用PORT和GENERIC映射就可以順利解決這個(gè)問(wèn)題。也就是說(shuō),在上例的基礎(chǔ)上,在設(shè)計(jì)中映射信號(hào)名并產(chǎn)生參數(shù),就可以建立一個(gè)新的ALU模塊,如例6-21所示。

【例6-21】在一個(gè)新的設(shè)計(jì)中重復(fù)使用BLOCK塊示例。

從例6-21中可以看出,除了端口和端口映射語(yǔ)句之外,ALU的說(shuō)明部分和前面例子中所述的是一樣的。端口語(yǔ)句說(shuō)明了端口號(hào)和方向,還說(shuō)明了端口的數(shù)據(jù)類型。端口映射語(yǔ)句映射了帶有信號(hào)的新的端口或者BLOCK塊外部的端口。例如,本例中端口abus被映射到cpu_blk構(gòu)造體內(nèi)說(shuō)明的局部信號(hào)ibus;端口bbus被映射到dbus;端口d_out和ctbus被映射到實(shí)體外部的端口。

映射實(shí)現(xiàn)了端口和外部信號(hào)之間的連接,使連接到端口的信號(hào)值發(fā)生變化,由原來(lái)的值變成一個(gè)新的值。如果這種變化發(fā)生在ibus上,則ibus上出現(xiàn)的新的值將被傳送到ALU塊內(nèi),使得abus端口得到新的值。當(dāng)然,其他有映射關(guān)系的端口也應(yīng)如此。

6.3其他語(yǔ)句和有關(guān)規(guī)定的說(shuō)明

6.3.1命名規(guī)則和注解的標(biāo)記在VHDL中大寫(xiě)字母和小寫(xiě)字母是沒(méi)有區(qū)別的,這一點(diǎn)在前面的說(shuō)明和程序?qū)嵗幸呀?jīng)可以看到。也就是說(shuō),在所有的語(yǔ)句中寫(xiě)大寫(xiě)字母也可以,寫(xiě)小寫(xiě)字母也可以,混合起來(lái)寫(xiě)也可以。但是,有兩種情況例外,即用單引號(hào)括起來(lái)的字符常數(shù)和用雙引號(hào)括起來(lái)的字符,這時(shí)大寫(xiě)字母和小寫(xiě)字母是有區(qū)別的。例如,在STD_LOGIC和STD_LOGIC_VECTOR代入不定值?'X'?時(shí)應(yīng)注意。

在VHDL中所使用的名字(名稱),如信號(hào)名、實(shí)體名、構(gòu)造體名、變量名等,在命名時(shí)應(yīng)遵守如下規(guī)則:

(1)名字的最前面應(yīng)該是英文字母;

(2)能使用的字符只有英文字母、數(shù)字和?‘_’;

(3)不能連續(xù)使用?'_'?符號(hào),在名字的最后也不能使用?'_'?符號(hào)。

例如:

像其他高級(jí)語(yǔ)言一樣,VHDL的程序有注釋欄目,可以對(duì)所編寫(xiě)的語(yǔ)句進(jìn)行注釋。注釋從“--”符號(hào)開(kāi)始,到該項(xiàng)末尾(回車、換行符)結(jié)束。注釋文字雖然不作為VHDL的語(yǔ)句予以處理,但是有時(shí)也用于其他工具和接口。

6.3.2ATTRIBUTE(屬性)描述與定義語(yǔ)句

VHDL有屬性預(yù)定義功能,該功能有許多重要的應(yīng)用,例如檢出時(shí)鐘邊沿、完成定時(shí)檢查、獲得未約束的數(shù)據(jù)類型的范圍等。ATTRIBUTE語(yǔ)句可以從所指定的客體中獲得關(guān)心的數(shù)據(jù)或信息。例如:

TYPEnumberISINTEGERRANGE9DOWNTO0;

如果i為一個(gè)整數(shù)變量,那么利用屬性描述語(yǔ)句就可以得到設(shè)計(jì)者感興趣的數(shù)據(jù)。

例如,要想得到number的最大值,那么可以用下述變量賦值語(yǔ)句得到:

i:=number'HIGH; --i=9

如果想得到number的最小值,同樣可以利用下述變量賦值語(yǔ)句得到:

i:=number'LOW; --i=0

通過(guò)預(yù)定義屬性描述語(yǔ)句可以得到客體的有關(guān)值、功能、類型和范圍(區(qū)間)。

預(yù)定義的屬性類型有以下幾種:

(1)數(shù)值類屬性;

(2)函數(shù)類屬性;

(3)信號(hào)類屬性;

(4)數(shù)據(jù)類型類屬性;

(5)數(shù)據(jù)區(qū)間類屬性;

(6)用戶自定義屬性。

下面對(duì)各類屬性的具體應(yīng)用作一說(shuō)明。

1.?dāng)?shù)值類屬性

數(shù)值類屬性用來(lái)得到數(shù)組、塊或者一般數(shù)據(jù)的有關(guān)值。例如,可以用來(lái)得到數(shù)組的長(zhǎng)度、數(shù)據(jù)的最低限制等。在數(shù)值類屬性中還可以再分成一般數(shù)據(jù)的數(shù)值屬性、數(shù)組的數(shù)值屬性和塊的數(shù)值屬性3個(gè)子類。

1)一般數(shù)據(jù)的數(shù)值屬性

一般數(shù)據(jù)的數(shù)值屬性有以下4種:

(1)

T‘

LEFT——得到數(shù)據(jù)類或子類區(qū)間的最左端的值。

(2)

T’

RIGHT——得到數(shù)據(jù)類或子類區(qū)間的最右端的值。

(3)

T‘

HIGH——得到數(shù)據(jù)類或子類區(qū)間的高端值。

(4)

T'

LOW——得到數(shù)據(jù)類或子類區(qū)間的低端值。

一般數(shù)據(jù)的數(shù)值屬性的書(shū)寫(xiě)格式如下:

客體'

屬性名

上述T'

LOW中,T為客體,T代表一般數(shù)據(jù)類或子類的名稱,符號(hào)“'”緊跟在客體的后面,符號(hào)“'”的后面是屬性名,本例中屬性名為L(zhǎng)OW。

LEFT表示數(shù)據(jù)類或子類區(qū)間的左端。也就是說(shuō),它表示約束區(qū)間最左的入口點(diǎn)。例如,區(qū)間左端為0,區(qū)間右端為9:

TYPEnumberIS0To9;

顯然,RIGHT表示數(shù)據(jù)類或子類區(qū)間的右端,也就是約束區(qū)的最右端的入口點(diǎn)。

HIGH表示數(shù)據(jù)類或子類區(qū)間的高端,也就是約束區(qū)間的最大值;LOW表示數(shù)據(jù)類或子類區(qū)間的低端,也就是約束區(qū)間的最小值。按此表示方法,就可以寫(xiě)出如下關(guān)系式:

i?:=?number'LEFT; --i?=?0

i?:=?number'RIGHT; --i?=?9

i?:=?number'HIGH; --i?=?9

i?:=?number'LOW; --i?=?0

需要注意的是,變量i的數(shù)據(jù)類型應(yīng)與賦值區(qū)間的數(shù)據(jù)類型相同。例如,上例的number是正整數(shù),那么i也應(yīng)該是正整數(shù)。

從例6-22中可以看出,不同的屬性可以得到不同的關(guān)于數(shù)據(jù)類的信息。如果數(shù)據(jù)類的區(qū)間用(aTOb)來(lái)定義,那么b>a,此時(shí)?'LEFT屬性的值通常等于?'LOW屬性的值;相反,如果數(shù)據(jù)類的區(qū)間用(bDOWNTOa)來(lái)定義,那么b>a,此時(shí)?'LEFT屬性的值與?'HIGH屬性的值相對(duì)應(yīng)。

數(shù)值類屬性不光適用于數(shù)字類型,而且適用于任何標(biāo)量類型。

在例6-23中,信號(hào)tim1和tim2代入的是sec和year,分別是區(qū)間的左端值和右端值。這一點(diǎn)很容易在類型說(shuō)明中得到驗(yàn)證。但是,如何說(shuō)明用?'HIGH和?'LOW屬性來(lái)得到枚舉類數(shù)據(jù)的數(shù)值屬性呢?實(shí)際上,這里的?'HIGH和?'LOW表示的是數(shù)據(jù)類的位置序號(hào)值的大小。對(duì)于整數(shù)和實(shí)數(shù)來(lái)說(shuō),數(shù)值的位置序號(hào)值與數(shù)本身的值相等;對(duì)于枚舉類型的數(shù)據(jù)來(lái)說(shuō),在說(shuō)明中較早出現(xiàn)的數(shù)據(jù)其位置序號(hào)值低于較后出現(xiàn)的數(shù)據(jù)。例如,在例6-23中sec的位置序號(hào)為0,因?yàn)樗钕仍陬愋驼f(shuō)明中說(shuō)明,同樣,min的位置序號(hào)為1,hous的位置序號(hào)為2。這樣,位置序號(hào)大的其屬性為?'HIGH;位置序號(hào)小的其屬性為?'LOW。

信號(hào)tim5到tim8代入的是reverse_tim類數(shù)據(jù)的屬性值。該類數(shù)據(jù)的區(qū)間用DOWNTO來(lái)加以說(shuō)明。此時(shí),用屬性?'HIGH和?'RIGHT得到的將不是同一個(gè)值(在用TO來(lái)說(shuō)明區(qū)間時(shí),兩者的屬性值是相同的),其原因就在于區(qū)間內(nèi)的數(shù)據(jù)說(shuō)明顛倒了。在例6-23中,對(duì)reverse_tim數(shù)據(jù)類型來(lái)說(shuō),month的位置序號(hào)大于min的位置序號(hào)。

2)數(shù)組的數(shù)值屬性

數(shù)組的數(shù)值屬性只有一個(gè),即?'LENGTH。在給定數(shù)組類型后,用該屬性將得到一個(gè)數(shù)組的長(zhǎng)度值。該屬性可用于任何標(biāo)量類數(shù)組和多維的標(biāo)量類區(qū)間的數(shù)組。例6-24就是一個(gè)簡(jiǎn)單應(yīng)用的示例。

在例6-24中,len1代入的是數(shù)組bit4的元素個(gè)數(shù);len2代入的是數(shù)組bit_strange的元素個(gè)數(shù)。

該屬性同樣也可以用于枚舉類型的區(qū)間,如例6-25所示。

例6-25中的andsd和andmd是兩個(gè)復(fù)合型常數(shù),它們是t_4val類型數(shù)據(jù)的“與”函數(shù)的真值表。第一個(gè)常數(shù)andsd用數(shù)組的數(shù)組來(lái)表示其相“與”的值。第二個(gè)常數(shù)andmd用多維數(shù)組來(lái)表示它的取值。在andsd中,“X”和“X”相“與”為“X”,“X”和“0”相“與”為“0”,“X”和“1”相“與”為“X”,“X”和“Z”相“與”為“X”,其他狀態(tài)值也是根據(jù)邏輯“與”的功能得到的。

如果現(xiàn)在將屬性?'LENGTH用于這些類型的數(shù)據(jù),那么就可以得到例6-26注解中所注明的數(shù)值。

在例6-26中,t_4valx1是一個(gè)包含4個(gè)元素的數(shù)組,數(shù)組的區(qū)間用t_4val類型數(shù)據(jù)的‘LOW和?’HIGH屬性來(lái)說(shuō)明,因此t_4valx1的長(zhǎng)度值應(yīng)為4。同理,len2也將得到4。這是因?yàn)閠_valx2的區(qū)間是從數(shù)組元素t_4valx1的?‘LOW到?’HIGH,共有4個(gè)元素(一個(gè)數(shù)組為另一個(gè)數(shù)組的元素)。

代入len3和len4的是多維數(shù)組t_4valmd的?'LENGTH的屬性值。由于多維數(shù)組有多個(gè)區(qū)間,因此在對(duì)某個(gè)區(qū)間取屬性值時(shí),在屬性?'LENGTH后面應(yīng)標(biāo)注區(qū)間號(hào),如例6-26中的?'LENGTH(1)和?'LENGTH(2)。如果不作特別說(shuō)明,那么屬性?'LENGTH得到的將是第一個(gè)區(qū)間的長(zhǎng)度值。

3)塊的數(shù)值屬性

塊的數(shù)值屬性有兩種:'STRUCTURE和?'BEHAVIOR。這兩種屬性用于塊(BLOCK)和構(gòu)造體,通過(guò)它們可以得到塊和構(gòu)造體是怎樣的一個(gè)設(shè)計(jì)模塊的信息。如果塊有標(biāo)號(hào)說(shuō)明,或者構(gòu)造體有構(gòu)造體名說(shuō)明,而且在塊和構(gòu)造體中不存在COMPONENT語(yǔ)句,那么用屬性'BEHAVIOR將得到“TRUE”的信息;如果在塊和構(gòu)造體中只有COMPONENT語(yǔ)句或被動(dòng)進(jìn)程,那么用屬性?'STRUCTURE將得到“TRUE”的信息。

在例6-27中,移位寄存器模塊由4個(gè)D觸發(fā)器基本單元串聯(lián)而成。在對(duì)應(yīng)于shifter實(shí)體的構(gòu)造體中,還包含有一個(gè)用于檢出時(shí)鐘clk跳變的被動(dòng)進(jìn)程checktime?,F(xiàn)在對(duì)這樣的構(gòu)造體施加屬性?'BEHAVIOR和?'STRUCTURE,就可以得到如下所描述的信息。

structural'BEHAVIOR --得到“假”

structural'STRUCTURE --得到“真”

由上述描述可知,實(shí)際上屬性?'BEHAVIOR和?'STRUCTURE用來(lái)驗(yàn)證所說(shuō)明的塊或構(gòu)造體是用結(jié)構(gòu)描述方式來(lái)描述的模塊還是用行為描述方式來(lái)描述的模塊。這對(duì)設(shè)計(jì)人員檢查程序是非常有用的。另外,例6-27中的checktime是被動(dòng)進(jìn)程。所謂被動(dòng)進(jìn)程,可以這么認(rèn)為,它是一個(gè)無(wú)源的進(jìn)程。如果在進(jìn)程中包含有代入語(yǔ)句,那么該進(jìn)程就不是被動(dòng)進(jìn)程了,它變成了一個(gè)有源進(jìn)程或者稱主動(dòng)進(jìn)程。如果checktime進(jìn)程包含有代入語(yǔ)句,那么用屬性?'STRUCTURE得到的信息將不是“真”,而是“假”了。

2.函數(shù)類屬性

所謂函數(shù)類屬性,是指屬性以函數(shù)的形式,讓設(shè)計(jì)人員得到有關(guān)數(shù)據(jù)類型、數(shù)組、信號(hào)的某些信息。當(dāng)函數(shù)類屬性以表達(dá)式形式使用(例如?'POS(x))時(shí),首先應(yīng)指定一個(gè)輸入的自變量值(如x),函數(shù)調(diào)用后將得到一個(gè)返回的值。該返回的值可能是枚舉數(shù)據(jù)的位置序號(hào),也可能是信號(hào)有某種變化的指示,還可能是數(shù)組區(qū)間中的某一個(gè)值。

函數(shù)類屬性有數(shù)據(jù)類型屬性函數(shù)、數(shù)組屬性函數(shù)和信號(hào)屬性函數(shù)3種。

1)數(shù)據(jù)類型屬性函數(shù)

用數(shù)據(jù)類型屬性函數(shù)可以得到有關(guān)數(shù)據(jù)類型的各種信息。例如,給出某類數(shù)據(jù)值的位置,那么利用位置函數(shù)屬性就可以得到該位置的數(shù)值。另外,利用其他相應(yīng)屬性還可以得到某些值的左鄰值和右鄰值等。

對(duì)數(shù)據(jù)類型屬性函數(shù)再進(jìn)行細(xì)分,可以得到以下6種屬性函數(shù):

(1)

'POS(x)——得到輸入x值的位置序號(hào);

(2)

'VAL(x)——得到輸入位置序號(hào)x的值;

(3)

'SUCC(x)——得到輸入x值的下一個(gè)值;

(4)

'PRED(x)——得到輸入x值的前一個(gè)值;

(5)

'LEFTOF(x)——得到鄰接輸入x值左邊的值;

(6)

'RIGHTOF(x)——得到鄰接輸入x值右邊的值。

數(shù)據(jù)類型屬性函數(shù)的一個(gè)典型應(yīng)用是將枚舉或物理類型的數(shù)據(jù)轉(zhuǎn)換成整數(shù)。

包集合ohms_law定義了3種物理類型的數(shù)據(jù),即current(電流)、voltage(電壓)和resistance

(電阻)。例6-28的作用是將物理類型的數(shù)據(jù)轉(zhuǎn)換成整數(shù)(conve,convi→int_r),而后再由整數(shù)轉(zhuǎn)換成物理類型的數(shù)據(jù)(int_r→r)。從這個(gè)轉(zhuǎn)換和再轉(zhuǎn)換的過(guò)程可以看出,它實(shí)際完成了由電壓和電流值計(jì)算電阻值的運(yùn)算過(guò)程。當(dāng)端口i和e中的任何一個(gè)發(fā)生變化時(shí),ohm_proc進(jìn)程就被啟動(dòng),根據(jù)新的電流(i)和電壓(e)值計(jì)算得到新的電阻(r)值。

進(jìn)程的第一條語(yǔ)句將輸入電流值(i)的位置序號(hào)賦予變量convi。例如,輸入電流值為10

mA,那么賦予變量convi的值為10。

進(jìn)程的第二條語(yǔ)句將輸入電壓值(e)的位置序號(hào)賦予變量conve。電壓的基本單位是mV,因此,電壓值的位置序號(hào)與輸入電壓的?mV數(shù)相等。

進(jìn)程的第三條語(yǔ)句是計(jì)算整數(shù)conve和convi的商,得到的是一個(gè)int_r整數(shù)值。該整數(shù)值與要得到的電阻的阻值是相等的,但int_r不是物理量數(shù)據(jù),要轉(zhuǎn)換成物理量數(shù)據(jù)還需進(jìn)行一次整數(shù)至物理量的轉(zhuǎn)換,這就是進(jìn)程中的第四條語(yǔ)句。

進(jìn)程的第四條語(yǔ)句將位置序號(hào)轉(zhuǎn)換成數(shù)值,即利用屬性?‘VAL將位置序號(hào)int_r轉(zhuǎn)換成用歐姆表示的電阻值。

前面詳述了屬性?'POS和?'VAL的使用方法,下面再舉例說(shuō)明一下屬性?'SUCC、'PRED、'RIGHTOF和?'LEFTOF。

需要注意的是,當(dāng)一個(gè)枚舉類型數(shù)據(jù)的極限值被傳遞給屬性?'SUCC和?'PRED時(shí),如本例中假設(shè):

y

:=sec;

x

:=time'PRED(y);

第二個(gè)表達(dá)式將引起運(yùn)行錯(cuò)誤。這是因?yàn)樵诿杜e數(shù)據(jù)time中,最小的值是sec,time'PRED(y)要求提供比sec更小的值,已超出了定義范圍。

2)數(shù)組屬性函數(shù)

利用數(shù)組屬性函數(shù)可得到數(shù)組的區(qū)間。在對(duì)數(shù)組的每一個(gè)元素進(jìn)行操作時(shí),必須知道數(shù)組的區(qū)間。數(shù)組屬性函數(shù)可分為以下4種:

·'LEFT(n)——得到索引號(hào)為n的區(qū)間的左端位置號(hào)。在這里n實(shí)際上是多維數(shù)組中所定義的多維區(qū)間的序號(hào)。當(dāng)n缺省時(shí),就代表對(duì)一維區(qū)間進(jìn)行操作。

·'RIGHT(n)——得到索引號(hào)為n的區(qū)間的右端位置號(hào)。

·'HIGH(n)——得到索引號(hào)為n的區(qū)間的高端位置號(hào)。

·'LOW(n)——得到索引號(hào)為n的區(qū)間的低端位置號(hào)。

上述屬性與數(shù)值數(shù)據(jù)類屬性一樣,在遞增區(qū)間和遞減區(qū)間存在著不同的對(duì)應(yīng)關(guān)系。

在遞增區(qū)間,存在如下關(guān)系:

·'LEFT='LOW,數(shù)組?'LEFT=數(shù)組?'LOW。

·'RIGHT='HIGHT,數(shù)組?'RIGHT=數(shù)組?'HIGHT。

在遞減區(qū)間,存在如下關(guān)系:

·'LEFT='HIGHT。

·'RIGHT='LOW。

例6-30描述的是一個(gè)輸入/輸出整數(shù)的隨機(jī)存儲(chǔ)器。該RAM有512個(gè)整數(shù)單元,由兩條控制線進(jìn)行數(shù)據(jù)輸入/輸出控制:一條是片選線cs,另一條是讀/寫(xiě)線r_wb。

該程序包含一條IF語(yǔ)句,用來(lái)將RAM的各單元初始化為“0”值。布爾量ram_init用來(lái)指示RAM是否已被初始化。如果ram_init為“假”,則表明RAM未被初始化;如果ram_init為“真”,則表明RAM已被初始化。

在進(jìn)程首次執(zhí)行時(shí),變量ram_init將是“假”狀態(tài),因此IF語(yǔ)句被執(zhí)行。IF語(yǔ)句內(nèi)部的LOOP語(yǔ)句循環(huán)對(duì)每一個(gè)單元進(jìn)行初始化,使用函數(shù)數(shù)組屬性?'LOW和?'HIGH來(lái)控制初始化的循環(huán)區(qū)間。

該循環(huán)語(yǔ)句只要被執(zhí)行一次,所有RAM單元就被初始化,并將ram_init置為“真”。設(shè)置變量ram_init為“真”,可防止程序再次對(duì)RAM進(jìn)行初始化。

程序中的其他語(yǔ)句用于描述RAM的讀/寫(xiě)功能,并檢查在輸入端口的值是否是正確的值。

3)信號(hào)屬性函數(shù)

信號(hào)屬性函數(shù)用來(lái)得到信號(hào)的行為信息。例如,信號(hào)的值是否有變化,從最后一次變化到現(xiàn)在經(jīng)過(guò)了多長(zhǎng)時(shí)間,信號(hào)變化前的值為多少等。

信號(hào)屬性函數(shù)共有以下5種:

·s'EVENT——如果在當(dāng)前一個(gè)相當(dāng)小的時(shí)間間隔內(nèi)事件發(fā)生了,那么函數(shù)將返回一個(gè)為“真”的布爾量;否則就返回“假”。

·s'ACTIVE——如果在當(dāng)前一個(gè)相當(dāng)小的時(shí)間間隔內(nèi)信號(hào)發(fā)生了改變,那么函數(shù)將返回一個(gè)為“真”的布爾量;否則就返回“假”。

·s'LAST_EVENT——該屬性函數(shù)將返回一個(gè)時(shí)間值,即從信號(hào)前一個(gè)事件發(fā)生到現(xiàn)在所經(jīng)過(guò)的時(shí)間。

·s'LAST_VALUE——該屬性函數(shù)將返回一個(gè)值,該值是信號(hào)最后一次改變以前的值。

·s'LAST_ACTIVE——該屬性函數(shù)返回一個(gè)時(shí)間值,即從信號(hào)前一次改變到現(xiàn)在的時(shí)間。

(1)屬性'EVENT和?'LAST_VALUE。屬性'EVENT通常用于確定時(shí)鐘信號(hào)的邊沿,用它可以檢查信號(hào)是否處于某一個(gè)特殊值,以及信號(hào)是否剛好已發(fā)生變化。

在例6-31中描述了D觸發(fā)器的工作原理,當(dāng)D觸發(fā)器的時(shí)鐘脈沖的上升沿到來(lái)時(shí),其D輸入端的值就被傳送到輸出端Q。為了檢出時(shí)鐘脈沖的上升沿,就用到了屬性'EVENT。上升沿的發(fā)生是由兩個(gè)條件來(lái)約束的,即時(shí)鐘脈沖目前處于“1”電平,而且時(shí)鐘脈沖剛剛從其他電平變?yōu)椤?”電平。

在上例中,如果原來(lái)的電平為“0”,那么邏輯是正確的。但是,如果原來(lái)的電平是“X”(不定狀態(tài)),那么上例的描述同樣也被認(rèn)為出現(xiàn)了上升沿,顯然這種情況是錯(cuò)誤的。為了避免出現(xiàn)這種邏輯錯(cuò)誤,最好使用屬性'LAST_VALUE。這樣上例中的IF語(yǔ)句可以作如下改寫(xiě):

IF(clk='1')AND(clk'EVENT)

AND(clk'LAST_VALUE='0')THEN

q<=d;

ENDIF;

該語(yǔ)句保證時(shí)鐘脈沖在變成“1”電平之前一定處于“0”狀態(tài)。

值得注意的是,在上面的兩種應(yīng)用場(chǎng)合使用屬性?'EVENT并不是必需的。因?yàn)樵撨M(jìn)程中只有一個(gè)敏感信號(hào)量clk,該進(jìn)程啟動(dòng)的條件是敏感信號(hào)量發(fā)生變化,其作用和'EVENT的說(shuō)明是一致的。但是,如果進(jìn)程中有多個(gè)敏感信號(hào)量,那么用?'EVENT來(lái)說(shuō)明哪一個(gè)信號(hào)發(fā)生變化是必需的。

(2)屬性?'LAST_EVENT。用屬性?'LAST_EVENT可得到信號(hào)上各種事件發(fā)生以來(lái)所經(jīng)過(guò)的時(shí)間。該屬性常用于檢查定時(shí)時(shí)間,如檢查建立時(shí)間、保持時(shí)間和脈沖寬度等。用于檢查建立時(shí)間和保持時(shí)間的示例如圖6-1所示。

圖6-1中的信號(hào)clk其上升沿是所有時(shí)間檢查的參考沿。建立時(shí)間檢查將保證數(shù)據(jù)輸入信號(hào)在建立時(shí)間內(nèi)不發(fā)生變化;保持時(shí)間檢查將保證在參考沿后面的一段規(guī)定的保持時(shí)間內(nèi)數(shù)據(jù)輸入信號(hào)不發(fā)生變化。通過(guò)這些檢查就可以確保D觸發(fā)器正常工作。

圖6-1建立時(shí)間和保持時(shí)間示例

由例6-32可以看到,建立時(shí)間的檢查進(jìn)程是一個(gè)無(wú)源進(jìn)程,它被放在實(shí)體dff的模塊中,檢查當(dāng)然也可以放在dff構(gòu)造體的模塊中。但是,在實(shí)體中的檢查可以被該實(shí)體所屬的所有構(gòu)造體所共享,這一點(diǎn)是需要充分注意的。

信號(hào)clk每發(fā)生一次變化,都將執(zhí)行一次該無(wú)源進(jìn)程。在clk的上升沿,ASSERT語(yǔ)句將執(zhí)行,并對(duì)建立時(shí)間進(jìn)行檢查。

ASSERT語(yǔ)句將檢查數(shù)據(jù)輸入端D的建立時(shí)間是否大于或等于規(guī)定的建立時(shí)間,屬性d'LAST_EVENT將返回一個(gè)信號(hào)d自最近一次變化以來(lái)到現(xiàn)在(clk上升沿)clk事件發(fā)生時(shí)為止所經(jīng)過(guò)的時(shí)間。如果得到的時(shí)間小于規(guī)定的建立時(shí)間,那么就會(huì)發(fā)出錯(cuò)誤警告。

(3)屬性?'ACTIVE和?'LAST_ACTIVE。屬性?'ACTIVE和'LAST_ACTIVE在信號(hào)發(fā)生轉(zhuǎn)換或事件發(fā)生時(shí)被觸發(fā)。當(dāng)一個(gè)模塊的輸入或輸入輸出端口發(fā)生某一事件時(shí),將啟動(dòng)該模塊執(zhí)行,從而使信號(hào)發(fā)生轉(zhuǎn)換。其轉(zhuǎn)換后的值應(yīng)與'ACTIVE所指定的值相同,這樣?'ACTIVE將返回一個(gè)“真”值,否則就會(huì)返回一個(gè)“假”值。屬性?'LAST_ACTIVE將返回一個(gè)時(shí)間值,這個(gè)時(shí)間值就是所加信號(hào)發(fā)生轉(zhuǎn)換或發(fā)生某一個(gè)事件開(kāi)始到當(dāng)前時(shí)刻的時(shí)間間隔。這兩個(gè)屬

溫馨提示

  • 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)論