EDA技術 第05講 VHDL03 順序語句2_第1頁
EDA技術 第05講 VHDL03 順序語句2_第2頁
EDA技術 第05講 VHDL03 順序語句2_第3頁
EDA技術 第05講 VHDL03 順序語句2_第4頁
EDA技術 第05講 VHDL03 順序語句2_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

[標號:]FOR

循環(huán)變量IN

循環(huán)次數(shù)范圍

LOOP

順序語句ENDLOOP[標號];[標號:]WHILE

循環(huán)控制條件LOOP

順序語句ENDLOOP[標號];FORLOOP的語句格式WHILELOOP的語句格式LOOP語句1

FORLOOP重復次數(shù)已知;循環(huán)變量是整數(shù)型變量,不需要在結構體或進程中定義,在循環(huán)體中不能通過信號或變量給循環(huán)變量賦值。

WHILELOOP重復次數(shù)未知;標號是可省略;2【例】SIGNALbyte:STD_LOGIC_VECTOR(3DOWNTO0);…VARIABLEsum:integerrange0to100:=0;...loop1:WHILEi<=9LOOPi:=i+1;sum:=sum+1;endlooploop1;loop2:foriinbyte’rangeloopsum:=sum+2;endlooploop2;loop3:foriinbyte’lowtobyte’highloopsum:=sum+3;endloop;3DOWNTO00TO33【例】

For循環(huán)(奇偶校驗電路):Entityparity_checkerIs

Port(data:Instd_logic_vector(7downto

0);

p:Outstd_logic);Endparity_checker;ArcLitecturebehaviorOfparity_checkerIs

Begin

4Process(data)

Variabletmp:std_logic;

Begin

tmp:=‘0’;

Forn

in7downto0Loop

tmp:=tmpxordata(n);

EndLoop;

p<=tmp;EndProcess;Endbehavior;5思考:如果中間變量tmp修改為信號,電路的功能還能正常實現(xiàn)嗎?(實驗中練習)6【例】利用LOOP語句簡化同類順序語句的表達式SIGNALA,B,C:STD_LOGIC_VECTOR(1TO3);…FORNIN1TO3LOOPA(N)<=B(N)ANDC(N);ENDLOOP;等效于:A(1)<=B(1)ANDC(1);A(2)<=B(2)ANDC(2);A(3)<=B(3)ANDC(3);7NEXT[LOOP標號][WHEN條件表達式];NEXT的語句格式NEXT語句四種形式:NEXT;NEXTLOOP標號;NEXTWHEN條件表達式;NEXTLOOP標號WHEN條件表達式;NEXT語句主要用在LOOP語句中有條件的或無條件地開始下次循環(huán)。8當LOOP標號缺省時,跳回到本次循環(huán)LOOP語句開始處,開始下一次循環(huán);否則跳轉到指定標號的LOOP語句開始處,重新開始執(zhí)行循環(huán)操作。當WHEN缺省時,即刻無條件終止當前的循環(huán);若WHEN子句出現(xiàn),則當條件表達式的值為TRUE,則執(zhí)行NEXT語句,進入跳轉操作,否則繼續(xù)向下執(zhí)行。9【例】…L1:

FORCNT_VALUEIN1TO8LOOPA(CNT_VALUE):=‘0’;

NEXTWHEN(B=C);A(CNT_VALUE+8):=‘0’;ENDLOOPL1;10在多重循環(huán)中,NEXT語句必須加上跳轉標號。11【例】…L_X:

FORCNT_VALUEIN1TO8LOOPA(CNT_VALUE):=‘0’;

K:=0;

L_Y:LOOPB(k):=‘0’;

NEXTL_XWHEN(E>F):B(k+8):=‘0’;

K:=K+1;

NEXTLOOPL_Y;NEXTLOOPL_X;…12EXIT[LOOP標號][WHEN條件表達式];EXIT的語句格式EXIT語句四種形式:EXIT;EXITLOOP標號;EXITWHEN條件表達式;EXITLOOP標號WHEN條件表達式;EXIT語句主要用在LOOP語句中有條件的或無條件地跳出循環(huán)。13當LOOP標號缺省時,跳到EndLoop語句的后繼位置,開始向后執(zhí)行;如果標號不省略,則可以跳到多層嵌套循環(huán)的指定外層循環(huán)起始處。當WHEN缺省時,無條件跳出循環(huán)。如果“When條件”不省略,則條件為True時,跳出循環(huán)。14Next只結束本次循環(huán),開始下一次循環(huán);跳向LOOP語句的起始點。Exit語句結束整個循環(huán),跳出循環(huán)體外。跳向LOOP語句的終點。Next語句和Exit語句的區(qū)別15【例】SIGNALA,B:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALA_LESS_THEN_B:BOOLEAN;…A_LESS_THEN_B<=FLASE;--設初始值FORIIN1DOWNTO0LOOPIF(A(I)=‘1’ANDB(I)=‘0’)THENA_LESS_THEN_B<=FALSE;

EXIT;ELSIF(A(I)=‘0’ANDB(I)=‘1’)THENA_LESS_THEN_B<=TRUE;--A<BEXIT;ELSE;

NULL;ENDIF;ENDLOOP;16NULL;NULL的語句格式空語句不會執(zhí)行任何操作;NULL常用于CASE語句中,為滿足所有可能的條件,利用NULL來表示所余的不用條件下的操作行為。NULL語句17【例】CASEOPCODEISWHEN“001”=>TMP:=REGAANDREGB;

WHEN“101”=>TMP:=REGAORREGB;

WHEN“110”=>TMP:=NOTREGA;

WHENOTHERS=>NULL;ENDCASE;此例類似于一個CPU內(nèi)部的指令譯碼器功能?!?01”,"101"和“110”分別代表指令操作碼,對于它們所對應在寄存器中的操作數(shù)的操作算法,CPU只能對這三種指令碼作反應,當出現(xiàn)其他碼時,不作任何操作。18與其他的EDA工具不同,MAX+plusII對NULL語句的執(zhí)行會出現(xiàn)擅自加入鎖存器的情況,因此,應避免使用NULL語句,改用確定操作。如可改為:

WHENOTHERS=>TMP:=REGA;19WAITUNTIL條件表達式;WAITFOR時間表達式;WAITON信號列表;WAIT;WAIT的語句格式在進程中(包括過程中),當進程執(zhí)行到Wait語句時,將被掛起,并設置好再次執(zhí)行的條件??梢允菬o限等待(Wait)或有限等待。注意:已列出敏感量的進程中不能使用任何形式的WAIT語句WAIT語句20信號列表可以包括一個或多個信號,信號列表中的任何一個信號的值發(fā)生變化,進程將結束掛起狀態(tài),進入執(zhí)行狀態(tài),執(zhí)行Waiton語句后面的語句。Waiton信號列表;如:

Waitona,b,s;它等待信號a、b、s中的任何一個發(fā)生變化。21【例】Entitymux2Is

Port(a,b:Instd_logic;

s:Instd_logic;

f:Outstd_logic);Endmux2;ArchitecturebehaviorOfmux2IsBegin

mux2:Process(a,b,s)

Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

EndProcess;Endbehavior;mux2:Process()Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

Waitona,b,s;EndProcess;22當條件表達式為“真”時,進程將結束掛起狀態(tài),進入執(zhí)行狀態(tài),執(zhí)行WaitUntil語句的后繼語句。WAITUNTIL條件表達式如:

WaitUntila=’1’;

a的值不是’1’時,進程執(zhí)行到該語句將被掛起,a的值為’1’時,進程再次被啟動,繼續(xù)執(zhí)行Wait語句的后繼語句。23WAIT_UNTIL語句有以下三種表達方式:WAITUNTIL信號=VALUE;

WAITUNTIL信號'EVENTAND信號=VALUE;WAITUNTILNOT信號'STABLEAND信號=VALUE24CLOCK上跳沿啟動進程:WAITUNTILCLOCK=‘1’;WAITUNTILRISING_EDGE(CLOCK);WAITUNTILNOTCLOCK'STABLEANDCLOCK='1';WAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;25【例】PROCESSBEGINWAITUNTILCLK=‘1’;AVE<=A;WAITUNTILCLK=‘1’;AVE<=AVE+A;WAITUNTILCLK=‘1’;AVE<=AVE+A;WAITUNTILCLK=‘1’;AVE<=(AVE+A)/4;ENDPROCESS;功能?26完成一個硬件求平均的功能,每一個時鐘脈沖由A輸入一個數(shù)值,4個時鐘脈沖后將獲得此4個數(shù)值的平均值。27【例】PROCESSBEGINRST_LOOP:LOOPWAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;

NEXTRST_LOOPWHEN(RST=‘1’); X<=A;

WAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;

NEXTRST_LOOPWHEN(RST=‘1’);Y<=B;

ENDLOOPRST_LOOP;ENDPROCESS;每一時鐘上升沿都結束進程的掛起,繼而檢測電路的復位是否為高。如果是,則返回循環(huán)的起點;否則,則進行正常的順序語句執(zhí)行操作。28WAITFor時間表達式如:

WaitFor30ns;

WaitFor語句只能仿真時使用,不能被綜合。

為超時語句,從執(zhí)行語句開始,在規(guī)定時間段內(nèi),進程掛起,當超過這一時間段后,進程自動恢復執(zhí)行。29例如:

Waitonclkuntilclk=‘1’;

復合Wait語句編程時注意等待條件的判別,不要出現(xiàn)“死鎖”狀態(tài)(即無限期等待)。30斷言語句主要作為仿真和調試中的人-機會話,給出一個文字串作為警告和錯誤提示信息。當執(zhí)行Assert語句時,就會對條件進行判別。如果條件為“真”,則執(zhí)行下一條語句;如果條件為“假”,則輸出由report指定的輸出信息和由severity指定的錯誤級別。在report后面跟的是設計者所寫的文字串,通常是說明錯誤的原因,文字串應該用雙引號“”引起來。斷言語句不可綜合,僅僅是為了仿真的方便。斷言語句AssertAssert條件[report輸出信息]

[severity級別]Assert語句的格式31例:

Assert

(a<=255)report”a

outofedge”;

severityerror;

該斷言語句的條件是信號量B=’1’。如果執(zhí)行到該語句時,信號量B=’0’,說明條件不滿足,就會輸出report后跟的文字串。該文字串說明,出現(xiàn)了超時等待錯誤。severity后跟的錯誤級別告訴操作人員,其出錯級別為error。32后面介紹。子程序調用及返回語句33小結順序語句賦值語句轉向控制語句

(If、Case、Loop、Next、Exit)等待語句(wait)子程序調用語句斷言語句(assert)空操作語句(null)34作業(yè)1:設計一個3-8譯碼器:35

【例】(a)WAIT_UNTIL結構(b)WAIT_ON結構

... LOOPWAITUNTILENABLE=‘1’;WAITONENABLE... EXITWHENENABLE=‘1’;

ENDLOOP;由以上脫離掛起狀態(tài)、重新啟動進程的兩個條件可知,例3.4.20結束掛起所需滿足的條件,實際上是一個信號的上跳沿。因為當滿足所有條件后ENABLE為1,可推知ENABLE一定是由0變化來的。因此,上例中進程的啟動條件是ENABLE出現(xiàn)一個上跳信號沿。36一般地,在一個進程中使用了WAIT語句后,經(jīng)綜合就會產(chǎn)生時序邏輯電路。時序邏輯電路的運行依賴于時鐘的上升沿或下降沿,同時還具有數(shù)據(jù)存儲的功能。下例就是一個比較好的說明,此例描述了一個可預置校驗對比值的四位奇偶校驗電路,它的功能除對輸入的4位碼DATA(0TO3)進行奇偶校驗外,還將把校驗結果與預置的校驗值NEW_CORRECT_PARITY進行比較,并將比較值PARITY_OK輸出。37【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYPARIISPORT(CLOCK:INSTD_LOGIC;

SET_PARITY:INSTD_LOGIC;

NEW_CORRECT_PARITY:INSTD_LOGIC;

DATA:INSTD_LOGIC_VECTOR(0TO3);

PARITY_OK:OUTBOOLEAN);ENDPARI;38ARCHITECTUREARTOFPARIISSIGNALCORRECT_PARITY:STD_LOGIC;

BEGINPROCESS(CLOCK)VARIABLETEMP:STD_LOGIC;

BEGINWAITUNTILCLOCK'EVENTANDCLOCK=‘1’;IFSET_PARITY=‘1’THENFIRST:CORRECT_PARITY<=NEW_CORRECT_PARITY;39

ENDIF;

TEMP:=‘0’;

FORIINDATA'RANGELOOPTEMP:=TEMPXORDATA(I);

ENDLOOP;

SECOND:PARITY_OK<=(TEMP=CORRECT_PARITY);

ENDPROCESS;ENDART;40例中,NEW_CORRECT_PARITY是預置校驗值輸入端,SET_PARITY是預置校驗值的輸入與比較控制端。從例可以看出,由于WAIT語句的加入,綜合后引入了兩個D觸發(fā)器,用于存儲數(shù)據(jù)。第一個觸發(fā)器存儲CORRECT_PARITY,它來自標號為FIRST的語句;第二個觸發(fā)器用于兩個時鐘信號間PARITY_OK的存儲,它來自標號為SECORD的語句。綜合器沒有為變量TEMP的賦值行為增加觸發(fā)器,因為TEMP是一個臨時變量。

WAITFOR時間表達式為超時語句,在此語句中定義了一個時間段,從執(zhí)行到當前的WAIT語句開始,在此時間段內(nèi),進程處于掛起狀態(tài),當超過這一時間段后,進程自動恢復執(zhí)行。由于此語句不可綜合,在此不做討論。41作業(yè)1:將向量轉化為整數(shù)輸出ENTITYconv_intISPORT(vect:IN

BIT_VECTOR(7DOWNTO0);

result:OUT

INTEGER);ENDconv_int;

ARCHITECTUREAOFconv_intISBEGIN

PROCESS(vect)

VARIABLEtmp:INTEGER;

BEGIN tmp:=0; FORiIN7DOWNTO0LOOP IF(vect(i)='1')THEN tmp:=tmp+2**i; ENDIF; ENDLOOP; result<=tmp;

ENDPROCESS;ENDA;ARCHITECTUREBOFconv_intISBEGIN

PROCESS(vect)

VARIABLEtmp:INTEGER;

VARIABLEi:INTEGER;

BEGIN tmp:=0; i:=vect'high WHILE(i>=vect'low)LOOP IF(vect(i)='1')THEN

tmp:=tmp+2**i; ENDIF; i:=i-1;--修改循環(huán)變量 ENDLOOP; result<=tmp;

ENDPROCESS;ENDB;42作業(yè)2:設計描述4選1總線多路選擇器43【例】用CASE語句描述4選1多路選擇器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX41ISPORT(S1,S2:INSTD_LOGIC;

A,B,C,D:INSTD_LOGIC;

Z:OUTSTD_LOGIC);ENDENTITYMUX41;ARCHITECTUREARTOFMUX41ISSIGNALS:STD_LOGIC_VECTOR(1DOWNTO0);44BEGINS<=S1&S2;PROCESS(S1,S2,A,B,C,D)BEGINCASESISWHEN"00"=>Z<=A;

WHEN"01"=>Z<=B;

WHEN"10"=>Z<=C;

WHEN"11"=>Z<=D;

WHENOTHERS=>Z<='X';

ENDCASE;

ENDPROCESS;ENDART;如何用IF語句實現(xiàn)?45注意本例的第五個條件名是必需的,因為對于定義STD_LOGIC_VECTOR數(shù)據(jù)類型的S,在VHDL綜合過程中,它可能的選擇值除了00、01、10和11外,還可以有其他定義于STD_LOGIC的選擇值。本例的邏輯圖如圖3.8所示。464選1多路選擇器47例:libraryieee;useieee.std_logic_1164.all;entityshiftisport(clk,c0:instd_logic;md:instd_logic_vector(2downto0);d:instd_logic_vector(7downto0);qb:outstd_logic_vector(7downto0);cn:outstd_logic);end;architecturebhofshiftissignalreg:std_logic_vector(7downto0);signalcy:std_logic;48beginprocess(clk,md,c0)isbeginifclk'eventandclk='1'thencasemdiswhen"001"=>reg(0)<=c0;reg(7downto1)<=reg(6downto0);cy<=reg(7);when"010"=>reg(0)<=reg(7);reg(7downto1)<=reg(6downto0);when"011"=>reg(7)<=reg(0);eg(6downto0)<=reg(7downto1);when"100"=>reg(7)<=cy;reg(6downto0)<=reg(7downto1);cy<=reg(0);when"101"=>reg(7downto0)<=d(7downto0);whenothers=>reg<=reg;cy<=cy;49endcase;endif;endprocess;qb(7downto0)<=reg(7downto0);cn<=cy;end;5051BEGINsel:=0; --輸入初始值

IF(S1=‘1’)THENSEL:=SEL+1;

ELSIF(S2=‘1’)THENSEL:=SEL+2;

ELSIF(S3=‘1’)THENSEL:=SEL+4;

ELSIF(S4=‘1’)THENSEL:=SEL+8;

ELSENULL; --注意,這里使用了空操作語句

ENDIF;

Z1<=‘0’;Z2<=‘0’;Z3<=‘0’;Z4<=‘0’;--輸入初始值52CASETEMPISWHEN0=>Z1<=‘1’; --當SEL=0時選中

WHEN1|3=>Z2<=‘1’;--當SEL為1或3時選中

WHEN4TO7|2=>Z3<=‘1’;--當SEL為2、4、5、6或7時選中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論