第五VHDL語言的主要描述語句剖析課件_第1頁
第五VHDL語言的主要描述語句剖析課件_第2頁
第五VHDL語言的主要描述語句剖析課件_第3頁
第五VHDL語言的主要描述語句剖析課件_第4頁
第五VHDL語言的主要描述語句剖析課件_第5頁
已閱讀5頁,還剩363頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第五章VHDL語言的主要描述語句第五章VHDL語言的主要描述語句2022/12/1225.1順序描述語句執行的順序:順序描述語句同高級語言的執行一樣,是按出現次序加以執行的;出現的場合:進程或子程序(過程/函數)中;——wait語句

——斷言語句

——信號代入語句

——變量賦值語句

——過程調用語句

——if語句——case語句

——loop語句

——next語句

——exit語句

——null語句2022/12/1125.1順序描述語句執行的順序:順序描2022/12/1235.1.1信號代入語句1)書寫格式目的信號量<=敏感信號量表達式;處于構造體中的信號代入語句

z<=aor(bnandc);有3個敏感量a、b、c,無論哪一個敏感量發生變化,該代入語句將被執行。2)舉例2022/12/1135.1.1信號代入語句1)書寫格式2022/12/124a<=bafter5ns;--表示當b發生新的變化5ns后,才被代入到信號a中;c<=aandbafter15ns;--表示當a或b發生新的變化15ns后,它們進行與邏輯操作的結果才被代入到信號a中,可描述邏輯門的延時特性;a<=‘0’after5ns,‘1’after10ns,‘0’after15ns;--該信號代入語句描述了怎樣的波形呢?2022/12/114a<=bafter5ns;2022/12/1253)兩類延時語句--慣性延時、傳輸延時(1)慣性(Inertial)延時慣性延時:在慣性模型中,系統或器件輸出信號要發生變化,必須有一段時間的延時,這段延時時間,就是系統或元件的慣性延時。特點:當一個系統或器件的輸入信號周期,小于系統或器件的慣性延時,其輸出將保持不變。如:在一個信號值維持期間,如果存在任何毛刺、脈沖等周期小于器件本身的慣性延時的情況,輸出信號的值將不變,否則將引起信號的變化。2022/12/1153)兩類延時語句--慣性延時、傳輸延2022/12/126慣性延時舉例假設某門電路的慣性延時為20nsb<=inertialaafter20ns;所有器件都存在慣性延時,在代入語句中加上慣性延時時間,可以仿真硬件電路實際工作情況,如:

b<=aafter10ns;或:

b<=inertialaafter10ns;慣性延時說明只在行為仿真時才有意義,邏輯綜合時將被忽略。10ns2022/12/116慣性延時舉例假設某門電路的慣性延時為22022/12/127(2)傳輸(Transport)延時傳輸延時常用于描述總線延遲、連接線的延時,及ASIC芯片的路徑延時。在VHDL語言中,傳輸延時不能缺省,必須在語句中使用傳輸延時的前置詞transport明確說明。特點:輸出端的信號在延時規定時間后,將完全復現輸入端的輸入波形,而不管輸入波形的形狀和寬窄如何。2022/12/117(2)傳輸(Transport)延時傳2022/12/128傳輸延時舉例b<=transportaafter20ns;傳輸延時:不管多短的脈沖都根據指定的延時值,傳給一個延時信號輸出。2022/12/118傳輸延時舉例b<=transpor2022/12/1295.1.2變量賦值語句1)書寫格式目的變量:=表達式;2)舉例a:=2;--值;

b:=d+e;--表達式;

c:=f;--可為信號、變量、常量;2022/12/1195.1.2變量賦值語句1)書寫格式2022/12/12105.1.3斷言(assert)語句作用:主要用于程序的仿真、調試中的人機會話。

assert

條件[report輸出信息][severity級別];格式:assert語句檢查一個布爾表達式為真或假,如果值是真,則該語句任何事都不做,如果值是假,斷言語句將輸出一用戶規定的字符串到標準輸出終端。2022/12/11105.1.3斷言(assert)語句2022/12/1211assert

條件[report輸出信息][severity級別];設計者所寫的文字串,通常是說明錯誤的原因,文字串應用雙引號括起來。錯誤嚴重程度的級別,分為4級別:failure,error,waring,note布爾表達式assert(sendb=’1’)report“sendbtimedoutat’1’”severityerror;2022/12/1111assert條件[report2022/12/12125.1.4wait語句等待語句用于控制進程的執行時間;當進程執行到wait語句時,將被掛起,直到wait語句的條件滿足,才繼續執行后續語句;此時進程中該語句之前的信號賦值語句得到執行;注意:wait語句通常不存在具體電路對應,在電路綜合時通常不產生影響;2022/12/11125.1.4wait語句等待語句用于2022/12/1213wait語句可設置的四種不同條件無限等待、時間到、條件滿足以及敏感信號量變化。wait——無限等待waitfor——時間到waituntil——條件滿足waiton——敏感信號變化后三種條件可以單獨使用也可以混合使用。書寫格式2022/12/1113wait語句可設置的四種不同條件無限2022/12/12141.waiton語句waiton語句后面可跟一個或多個信號量,等待所列舉信號中任何一個發生變化。1)書寫格式waiton

信號1[,信號2]…;2)舉例waitona,b;等待信號量a或b發生變化,a或b中只要有一個發生變化,進程將結束掛起狀態,繼續執行waiton語句后面的語句。2022/12/11141.waiton語句wait2022/12/1215例:判斷以下三段程序的正誤process(a,b)beginy<=aandb;endprocess;processbeginwaitona,b;y<=aandb;endprocess;process(a,b)beginwaitona,b;y<=aandb;endprocess;waiton所起作用與進程的敏感信號量表相同,兩者不能同時存在。2022/12/1115例:判斷以下三段程序的正誤proce2022/12/12162.waituntil語句利用表達式建立隱含的敏感信號量表;當任何一個涉及的信號發生變化時,就自動檢測布爾表達式是否為真;如果為真,則進程脫離等待狀態,執行后續語句;如果為假,則繼續等待。1)書寫格式waituntil

布爾表達式;2022/12/11162.waituntil語句利用2022/12/1217waituntil((x*10)<100);當信號量x的值大于或等于10時,進程執行到該語句,就被掛起;當x的值小于10時,進程再次被啟動,繼續執行waituntil語句的后繼語句。2)舉例:利用表達式建立隱含的敏感信號量表2022/12/1117waituntil((x*102022/12/1218libraryieee;useieee.std_logic_1164.all;entitykdec24isport(a:instd_logic_vector(1downto0);en:instd_logic;f:outstd_logic_vector(3downto0));endentitykdec24;例:architecturedofkdec24isbeginprocessbegin

waituntilen='1';f(0)<=nota(1)andnota(0);f(1)<=nota(1)anda(0);f(2)<=a(1)andnota(0);f(3)<=a(1)anda(0);endprocess;endarchitectured;2022/12/1118libraryieee;例:arc2022/12/12193.waitfor語句

當進程執行到該語句時將被掛起,直到指定的時間到了,進程再次開始執行waitfor語句后繼的語句。1)書寫格式

waitfor

時間表達式;2022/12/11193.waitfor語句2022/12/1220若a=2,b=50ns,c=70ns,則執行到該語句時,就要等待2*(50+70)=240ns后,再繼續執行后續語句。waitfor(a*(b+c));2)舉例執行到該語句等待20ns以后,再繼續執行下一條指令。waitfor20ns;2022/12/1120若a=2,b=50ns,c=70ns2022/12/1221例:利用waitfor構成輸入信號波形entityinhibittestbenchisend

entityinhibittestbench;architecturebehofinhibittestbenchiscomponentinhibitisport(x,y:inbit;z:outbit);endcomponentinhibit;signalxt,yt,zt:bit;beginu1:inhibitportmap(xt,yt,zt);processbeginxt<='0';yt<='0';

waitfor10ns;xt<='0';yt<='1';

waitfor10ns;xt<='1';yt<='0';

waitfor10ns;xt<='1';yt<='1';

wait;--進入無限期等待,避免進入無限期循環;

endprocess;end

architecture

beh;2022/12/1121例:利用waitfor構成輸入信號2022/12/1222entityinhibitisport(x,y:inbit;z:outbit);endentityinhibit;architecturertlofinhibitisbeginz<=xand(noty);endarchitecturertl;componentinhibitisport(x,y:inbit;z:outbit);endcomponentinhibit;2022/12/1122entityinhibitisc2022/12/12234.多條件等待語句上述語句等待的是3個條件:1)信號量umi和interrupt任何一個有一次新的變化;2)信號量umi或interrupt任何一個取值為“真”;3)該語句已等待5us。

前面所講的三類wait語句,等待的條件都是單一的,要么是信號量(waiton),要么是布爾量(waituntil),要么是時間量(waitfor)。wait語句可同時使用多個等待條件。例如waitonumi,interruptuntil((umi=true)or(interrupt=true))for5us;2022/12/11234.多條件等待語句上述語句等待的是2022/12/1224多條件等待中的表達式,至少應包含一個信號量,比如,waituntil(interrupt=true)or(old_clk=‘1’);結論:在等待語句中信號的變化才能引起等待語句表達式的一次評價和計算。

若上面語句中interrupt和old_clk兩個都是變量,而沒有一個信號量,那么,即使兩個變量有變化,這條語句也不會對表達式進行評估和計算。事實上,掛起的兩個變量的值是不可能改變的,這樣,該語句將變成無限的等待語句,包含該等待語句的進程就不可能再次啟動。2022/12/1124多條件等待中的表達式,至少應包含一個2022/12/12255.超時等待waituntil(sendb=‘1’)for1us;

assert(sendb=‘1’)

report“sendbtimedoutat‘1’”severity…….;等待語句加超時等待項的目的:防止等待語句進入無限期的等待狀態。for1us:作為超時等待項;assert語句:用于檢測進程是否遇到等待條件,還是因超時等待而執行后續語句。2022/12/11255.超時等待wait2022/12/1226例:可能進入死鎖的進程通信architecturewait_exampleofwait_exampleissignalsendb,senda:std_logic;beginsenda<=’0’;a:processbegin

waituntilsendb=’1’;senda<=’1’after10ns;waituntilsendb=’0’;senda<=’0’after10ns;endprocess;b:processbeginwaituntilsenda=’0’;sendb<=’0’after10ns;waituntilsenda=’1’;sendb<=’1’after10ns;endprocess;endarchitecturewait_example;2022/12/1126例:可能進入死鎖的進程通信archi2022/12/12272022/12/11272022/12/1228例:使用超時等待項的進程通信senda<=’0’;a:processbeginwaituntilsendb=’1’for1us;assert(sendb=’1’)report“sendbtimedoutat’1’”severityerror;senda<=’1’after10ns;waituntilsendb=’0’for1us;assert(sendb=’0’)report“sendbtimedoutat’0’”severityerror;senda<=’0’after10ns;endprocess;b:processbeginwaituntilsenda=’0’for1us;assert(senda=’0’)report“sendatimedoutat’0’”severityerror;sendb<=’0’after10ns;waituntilsenda=’1’for1us;assert(senda=’1’)report“sendatimedoutat’1’”severityerror;sendb<=’1’after10ns;endprocess;endwait_example;2022/12/1128例:使用超時等待項的進程通信sen2022/12/1229waituntilsendb=‘1’for1us;assert

(sendb=‘1’)report

“sendbtimedoutat‘1’”severity

error;senda<=‘1’after10ns;程序解釋:1)如果等待時間超過了1us進程則執行assert語句。2)assert語句判斷條件(sendb=‘1’)為真,則繼續執行下一條語句senda<=‘1’after10ns;3)若assert語句判斷條件為假,則向操作人員提供錯誤信息輸出,report后的字符串“sendbtimedoutat‘1’”以及severity后的錯誤等級。2022/12/1129waituntilsendb=‘2022/12/12305.1.5if語句

if語句根據所指定的條件來確定執行哪一些語句,書寫格式通常可分成三種類型:if語句的門閂控制if語句的二選擇控制if語句的多選擇控制2022/12/11305.1.5if語句if語句2022/12/12311.if語句的門閂控制if

布爾表達式

then順序處理語句;

endif;當布爾表達式為true時,執行then后面的順序語句;為false時,執行endif以后的語句。1)書寫格式2022/12/11311.if語句的門閂控制if2022/12/12322)舉例當a=‘1’時,c<=b;否則,將不進入該條件語句的內部執行信號代入c<=b,而執行endif之后的語句。

ifa=‘1’then

c<=b;

endif;a為門閂控制信號:2022/12/11322)舉例當a=‘1’時,c<=b2022/12/1233例

D觸發器描述libraryieee;useieee.std_logic_1164.all;entitydffisport(clk,d0:instd_logic;q0:outstd_logic);endentitydff;architecturertlofdffisbeginprocess(clk)isbegin

if(clk'eventandclk='1')thenq0<=d0;

endif;endprocess;endarchitecturertl;2022/12/1133例D觸發器描述libraryi2022/12/1234RTL視圖仿真波形圖2022/12/1134RTL視圖仿真波形圖2022/12/1235HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg1ISPORT(d:inSTD_LOGIC;clk:inSTD_LOGIC;q:outSTD_LOGIC);ENDENTITYreg1;ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIF(clk'eventandclk='1')THENa<=d;b<=a;q<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREreg1;2022/12/1135HowManyRegisters2022/12/1236HowManyRegisters?SignalAssignmentsInsidetheIF-THENStatementThatCheckstheClockConditionInferRegistersQclkdclkCLRNENADclkqbCLRNENADaCLRNENADQQQ2022/12/1136HowManyRegisters2022/12/1237IF(clk'eventandclk='1')THENa<=d;b<=a;q<=b;ENDIF;Q2022/12/1137IF(clk'eventand2022/12/1238HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg1ISPORT(d :inSTD_LOGIC;clk :inSTD_LOGIC;q :outSTD_LOGIC);ENDENTITYreg1;ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIFrising_edge(clk)THENa<=d;b<=a;ENDIF;ENDPROCESS;q<=b;ENDARCHITECTUREreg1;SignalAssignmentMoved2022/12/1138HowManyRegisters2022/12/1239HowManyRegisters?BtoQAssignmentIsNoLongerEdge-sensitiveBecauseItIsNotInsidetheIf-thenStatementThatCheckstheClockConditionqCLRNENADclkCLRNENADdclkaQQ2022/12/1139HowManyRegisters2022/12/1240ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIFrising_edge(clk)THENa<=d;b<=a;ENDIF;ENDPROCESS;q<=b;ENDARCHITECTUREreg1;2022/12/1140ARCHITECTUREreg12022/12/1241HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg2ISPORT(d:inSTD_LOGIC;clk:inSTD_LOGIC;q:outSTD_LOGIC);ENDreg2;ARCHITECTUREreg2OFreg2ISBEGINPROCESS(clk)VARIABLEa,b:STD_LOGIC;BEGINIFrising_edge(clk)THENa:=d;b:=a;q<=b;ENDIF;ENDPROCESS;ENDreg2;SignalsChangedtoVariables2022/12/1141HowManyRegisters2022/12/1242HowManyRegisters?VariableAssignmentsAreUpdatedImmediatelySignalAssignmentsAreUpdatedonClockEdgeCLRNENADdclkqQ2022/12/1142HowManyRegisters2022/12/1243IF(clk'eventandclk='1')THENa:=d;b:=a;q<=b;ENDIF;2022/12/1143IF(clk'eventand2022/12/12442.if語句的二選擇控制if

布爾表達式

then

順序語句1;else

順序語句2;endif;當布爾表達式為true時,執行then后面的順序語句1;為false時,執行else后面的順序語句2。1)書寫格式2022/12/11442.if語句的二選擇控制if布2022/12/12452)舉例二選一電路architecturertlofmux2isbeginprocess(a,b,sel)isbegin

if

(sel=‘1’)thenc<=a;

elsec<=b;

endif;

endprocess;endarchitecturertl;2022/12/11452)舉例二選一電路archit2022/12/12463.if語句的多選擇控制if

條件then

順序處理語句;elsif

條件then

順序處理語句;

…elsif

條件then

順序處理語句;else

順序處理語句;endif;ture判斷條件判斷條件順序語句后續語句順序語句turefalsefalse…判斷條件判斷條件順序語句后續語句順序語句turefalsefalse…1)書寫格式可設置多個條件;滿足某個條件,就執行該條件后的順序處理語句;若所有設置的條件都不滿足時,就執行最后一個else和endif之間的順序處理語句。2022/12/11463.if語句的多選擇控制if條件2022/12/12472)舉例四選一電路 architecturertlofifmuxisbeginprocess(input,sel)isbeginif(sel="00")theny<=input(0);elsif(sel="01")theny<=input(1);elsif(sel="10")theny<=input(2);elsey<=input(3);endif;endprocess;endarchitecturertl;2022/12/11472)舉例四選一電路 archi2022/12/1248if語句不僅可用于多路選擇器設計,還可用于比較器、譯碼器等具有條件控制的邏輯電路設計。note:if語句的條件判斷輸出是隱式布爾量,所以在if語句中的if條件表達式中,只能使用關系運算操作及邏輯運算操作的組合表達式。2022/12/1148if語句不僅可用于多路選擇器設計,還2022/12/1249練習:程序補充題,if語句描述的質數檢測器libraryieee;useieee.std_logic_1164.all;use(1);entityprimeisport(n:instd_logic_vector(3downto0);f:outstd_logic);endentityprime;architecturebehofprimeisbegin1ieee.std_logic_unsigned.all;process(n)isvariableni:(2);beginni:=conv_integer(n);

ifni=1orni=2thenf<='1';(3)ni=3orni=5orni=7orni=11orni=13thenf<='1';elsef<='0';(4);endprocess;endarchitecturebeh;2integer3elsif4endif2022/12/1149練習:程序補充題,if語句描述的質數2022/12/1250練習設計一個簡單恒溫加熱器的行為模型。這個裝置的實體模型有兩個整數輸入端,其中一個預先設定溫度desired_temp,另一個連接到測溫計actual_temp;還有一個控制加熱器開關的布爾輸出端heater_on。如果測量的溫度低于所設定的溫度2度,恒溫系統將打開加熱器進行加熱,而如果測量的溫度高于設定溫度2度,則關閉加熱器停止加熱。2022/12/1150練習設計一個簡單恒溫加熱器的行為模型2022/12/1251entitythermostatisport(desired_temp,actual_temp:ininteger;

heater_on:outboolean);endentitythermostat;architecturebehofthermostatisbeginprocess(desired_temp,actual_temp)isbegin

ifactual_temp<=desired_temp-2thenheater_on<=true;

elsifactual_temp>=desired_temp+2thenheater_on<=false;

endif;endprocess;endarchitecturebeh;2022/12/1151entitythermostat2022/12/12525.1.6case語句可根據表達式的不同取值,選擇執行哪些語句。1.書寫格式case

表達式

iswhen

選擇值1

=>

順序語句1;when

選擇值2

=>

順序語句2;……when選擇值n=>

順序語句3;whenothers=>

順序語句n;endcase;“=>”用來表明表達式的取值和執行語句的對應關系;選擇值應互斥,并覆蓋表達式所有的可能取值;選擇值須為靜態值。2022/12/11525.1.6case語句可根據表2022/12/12531)when值=>順序處理語句;2)when值|值|值…|值=>順序處理語句;3)when值to值=>順序處理語句;4)whenothers=>順序處理語句;多個值的“或”關系值的取值范圍所有的缺省值選擇值的四種不同書寫形式表達式的一個取值2.舉例四選一多路數據選擇電路libraryieee;useieee.std_logic_1164.all;entitymux4isport(input:instd_logic_vector(3downto0);sel:instd_logic_vector(1downto0);y:outstd_logic);endentitymux4;2022/12/11531)when值=>順序處理語句2022/12/1254architecturemux4_behaveofmux4isbeginprocess(sel,input)isbegin

caseseliswhen"00"=>y<=input(0);when"01"=>y<=input(1);when"10"=>y<=input(2);when"11"=>y<=input(3);

whenothers

=>null;endcase;endprocess;endarchitecturemux4_behave;使用whenothers包含所有的缺省值2022/12/1154architecturemux4_2022/12/1255if(sel=“00”)theny<=input(0);elsif(sel=“01”)theny<=input(1);elsif(sel=“10”)theny<=input(2);elsey<=input(3);endif;caseseliswhen"00"=>y<=input(0);when"01"=>y<=input(1);when"10"=>y<=input(2);when"11"=>y<=input(3);

whenothers

=>null;endcase;3.if語句和case語句的區別if語句首先處理最起始的條件,如果不滿足,再處理下一個條件;case語句沒有值的順序號,所有的值都是并行處理的,因此,值應互斥,不能重復使用。2022/12/1155if(sel=“00”)th2022/12/1256舉例

優先級編碼器的VHDL描述

輸入

輸出b7b6b5b4b3b2b1b0y2y1y0-------0111------01110-----011101----0111100---01111011--011111010-0111111001-1111111000表中“-”為任意項,其值可以為1,也可以為0。優先級編碼器的真值表2022/12/1156舉例優先級編碼器的VHDL描述2022/12/1257

優先級編碼器的輸入含有任意項,用case語句可以描述嗎?process(input)isbegincaseinputiswhen"XXXXXXX0"=>y<="111";when"XXXXXX01"=>y<="110";when"XXXXX011"=>y<="101";when"XXXX0111"=>y<="100";when"XXX01111"=>y<="011";when"XX011111"=>y<="010";when"X0111111"=>y<="001";whenothers=>y<="000";endcase;endprocess;

這樣的描述語句在VHDL語言中還未定制出來,此程序在編譯綜合中含有不確定值的程序行被忽略,得不到正確的rtl視圖。2022/12/1157優先級編碼器的輸入含2022/12/1258

多選擇控制if語句是從最起始的條件開始依次進行判斷處理的,可利用該語句條件判斷的順序性來描述優先編碼器的最低位零優先編碼的特點。process(input)isbeginif(input(0)='0')theny<="111";elsif(input(1)='0')theny<="110";elsif(input(2)='0')theny<="101";elsif(input(3)='0')theny<="100";elsif(input(4)='0')theny<="011";elsif(input(5)='0')theny<="010";elsif(input(6)='0')theny<="001";elsey<="000";endif;endprocess;endarchitecturertl;2022/12/1158多選擇控制if語句是2022/12/1259由上例可知:利用if語句條件判斷的順序性,可實現優先編碼,要注意若是低位‘0’優先,則條件判斷一定是從input的最低位開始,否則從input的最高位開始。case語句中,when語句的順序可以顛倒,沒有執行的先后次序的分別,不存在隱含的優先級,不可描述優先級編碼器。2022/12/1159由上例可知:2022/12/1260練習:將采用if語句描述的質數檢測器,改寫成用case語言描述的質數檢測器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityprimeisport(n:instd_logic_vector(3downto0);f:outstd_logic);endprime;architecturebehofprimeisbeginprocess(n)variableni:

integer;beginni:=conv_integer(n);

ifni=1orni=2thenf<='1';elsif

ni=3orni=5orni=7orni=11orni=13thenf<='1';elsef<='0';

endif;endprocess;endbeh;2022/12/1160練習:將采用if語句描述的質數檢測器2022/12/1261architecturebehofprime8isbeginprocess(n)isbegin

caseconv_integer(n)is

when1|2=>f<='1';

when3|5|7|11|13=>f<='1';whenothers=>f<='0';

endcase;endprocess;endarchitecturebeh;2022/12/1161architecturebeho2022/12/1262練習:下面兩段程序,哪一段是正確的?variableN:integer:=1;caseseliswhenN|N+1=>y<=“01”;whenN+2toN+5=>N:=2;y<=“10”;whenothers=>y<=“11”;endcase;constantN:integer:=1;caseseliswhenN|N+1=>y<=“01”;whenN+2toN+5=>y<=“10”;whenothers=>y<=“11”;endcase;選擇值須為靜態值2022/12/1162練習:下面兩段程序,哪一段是正確的?2022/12/1263練習書寫一個case語句,從標準邏輯變量x中去除強度信息。即如果x為‘0’或‘L’,將它設置為‘0’;如果x為‘1’或‘H’,則將它設置為‘1’;如果x為‘X’、’W’、’Z’、’U’或’-’時,則設置為‘X’。casexiswhen‘0’|‘L’=>x:=‘0’;when‘1’|‘H’=>x:=‘1’;whenothers=>x:=‘X’;endcase;2022/12/1163練習書寫一個case語句,從標準邏輯2022/12/12645.1.7loop語句如果要書寫一組被重復執行的順序語句,可以使用loop循環語句來表示這種重復執行的行為。在VHDL語言中常用來描述位片邏輯及迭代電路的行為。

循環語句的書寫格式一般有兩種

for循環

while循環2022/12/11645.1.7loop語句如果要書寫2022/12/12651.for循環變量[標號]:for

循環變量in

離散范圍loop

順序處理語句;

endloop[標號];a:foriin1to9loopsum:=i+sum;--sum初始值為0

endloopa;1)書寫格式循環變量的值在每次循環中都將發生變化離散范圍表示循環變量在循環過程中依次取值的范圍2)舉例2022/12/11651.for循環變量[標號]:fo2022/12/1266舉例

8位奇偶校驗電路libraryieee;useieee.std_logic_1164.all;entityparity_checkisport(a:instd_logic_vector(7downto0);y:outstd_logic);end

entityparity_check;architecturertlofparity_checkisbegin

該電路的輸入為一個8位的數據a,判斷該數據含有奇數個1還是偶數個1,若為奇數,則輸出端口y輸出為‘1’,否則,輸出為‘0’。2022/12/1166舉例8位奇偶校驗電路librar2022/12/1267process(a)isvariabletmp:std_logic;begintmp:='0';

foriin0to7looptmp:=tmpXORa(i);

endloop;y<=tmp;endprocess;end

architecturertl;變量在進程內部說明(局部量)循環變量i是一個整數量,使用前不需要進行說明,而且變量、信號都不能代入循環變量變量值要通過信號從進程內部帶出2022/12/1167process(a)is變量在進程2022/12/12682.while循環條件[標號]:while

條件loop

順序處理語句;

endloop[標號];a.不指定循環次數;每次循環前檢測條件中布爾表達式的值;當布爾表達式為真時,執行循環;為假時,不進行循環;b.重要:在循環體內,應有語句能夠將布爾表達式的值改變為假,避免無限循環。1)書寫格式2022/12/11682.while循環條件[標號]2022/12/12692)舉例:計算1~9的累加和i:=1;sum:=0;a:while(i<10)loopsum:=i+sum;i:=i+1;endloopa;循環控制變量遞增的實現程序結束循環的條件2022/12/11692)舉例:計算1~9的累加和i:=2022/12/1270舉例

while循環描述的8位奇偶校驗電路architecturebehaveofparity_checkisbeginprocess(a)isvariabletmp:std_logic;variablei:integer;begintmp:=’0’;i:=0Max+plusII10.0不支持while循環

while

(i<8)

looptmp:=tmpxora(i);i:=i+1;

endloop;y<=tmp;endprocess;endarchitecturebehave;2022/12/1170舉例while循環描述的8位奇偶2022/12/12713.next語句next語句是用來控制循環執行的一種跳轉語句。執行該語句時,立即中止當前的循環迭代。給出下一迭代的起始位置next語句執行的條件如果next語句后面既無“標號”也無“when條件”,那么,只要執行到該語句就立即無條件地跳出本次循環,并且,從loop語句的起始位置進入下一次循環迭代。next

[標號]

[when

布爾表達式];1)書寫格式2022/12/11713.next語句2022/12/1272process(a,b)isconstantmax_limit:integer:=255;begin

foriin0tomax_limitloopif(done(i)=true)then

next;

elsedone(i):=true;endif;q(i)<=a(i)andb(i);endloop;endprocess;既無“標號”也無“when條件”2)舉例2022/12/1172process(a,b)is既無“2022/12/1273L1:whilei<10loop;L2:whilej<20loop;…nextL1wheni=j;…endloopL2;endloopL1;3)嵌套loop語句中next語句的使用在該例中,當i=j時,next語句被執行,程序將從內循環L2中跳出,再從下一次外循環L1開始執行。嵌套loop語句中的next語句要有“標號”和“when條件”。2022/12/1173L1:whilei<12022/12/12744.exit語句exit語句是在loop循環語句中用來退出循環的語句;

exit語句的執行將結束循環狀態,即從loop語句退出,結束loop語句的執行。

如果exit后面沒有跟“標號”和“when條件”,則程序執行到該程序時就無條件地從loop語句中跳出,結束循環狀態,去執行“endloop”之后的語句。exit[標號][when條件];1)書寫格式2022/12/11744.exit語句exit語2022/12/12752)舉例process(a)isvariableint_a:integer;beginint_a:=a;

foriin0tomax_limitloopif(int_a<=0)then

exit;elseint_a:=int_a–1;q(i)<=3.1416/real’(a*i);endif;endloop;y<=q;endprocess;結束循環狀態2022/12/11752)舉例process(a)is2022/12/12763)嵌套loop語句中exit語句的使用當多個loop語句被多重嵌套時,exit結束最里層的loop語句。如果需要終結的loop語句不是最里層的loop語句,此時必須使用“標號”來指定要終結的是哪一層。outer:loop…inner:loop…

exitouterwhencondition1;--exit1

exitwhencondition2;--exit2endloopinner;--targetA

exitouterwhencondition3;--exit3endloopouter;--targetB2022/12/11763)嵌套loop語句中exit語句2022/12/12775.1.8null語句null語句是空操作語句,顯式地表明該語句不需要完成任何操作;null語句常用在case語句中。signalcontrol:integerrange0to7;signala,z:bit;…casecontroliswhen0|7=>z<=nota;whenothers=>null;endcase;2022/12/11775.1.8null語句null語句2022/12/1278練習loopcount_value:=count_value+1;nextwhenrs=‘1’;zout<=count_value+cin;count<=count_value;endloop;loopcount_value:=count_value+1;ifnot(rs=‘1’)thenzout<=count_value+cin;count<=count_value;

endif;endloop;將loop語句中的跳轉語句用條件語句進行改寫,要求循環語句能完成相同功能。2022/12/1178練習looploop將loop語2022/12/1279練習書寫一個loop語句,當時鐘輸入clk變為‘1’時,對輸入d進行取樣,只要d為’0’,循環繼續執行;當d為‘1’時,循環退出。loopwaituntilclk=‘1’;exitwhend=‘1’;endloop;2022/12/1179練習書寫一個loop語句,當時鐘輸入2022/12/1280練習書寫一個while循環計算x的冪函數值,利用下面的級數進行求和,精度為104分之一。sum:=1.0;term:=1.0;n:=0;whileabs(term)>abs(sum/1.0e5)loopn:=n+1;term:=term*x/real’(n);sum:=sum+term;endloop;2022/12/1180練習書寫一個while循環計算x的冪2022/12/1281練習書寫一個for循環計算x的冪函數值,利用下面的級數進行求和,計算前8項。sum:=1.0;term:=1.0;fornin1to7loopterm:=term*x/real’(n);sum:=sum+term;endloop;2022/12/1181練習書寫一個for循環計算x的冪函數2022/12/12825.2并發描述語句實際系統的許多操作是并發的,所以在對系統進行仿真時,系統中所有元件在定義的仿真時刻應該是并發工作的。硬件描述語句的并發描述語句就是用來表示這種并發行為的,并發描述可以是結構性的,也可以是行為性的。并發語句具有順序無關性。2022/12/11825.2并發描述語句實際系統的許多操2022/12/1283VHDL語言的并發描述語句——進程語句

——并發信號代入語句

——條件信號代入語句

——選擇信號代入語句——并發過程調用語句

——塊語句

——component語句

——generate語句進程語句信號代入語句過程調用語句……2022/12/1183VHDL語言的并發描述語句——進程2022/12/1284并發語句在VHDL語句程序結構中出現的位置architecturearofmy_circuitissignalreset,divclk:std_logic;constantmc:std_logic_vector(15downto0):=“10001111”;componentcountisport(clk,rst:instd_logic;q:outstd_logic_vector(15downto0);endcomponentcount;begin

reset<=‘1’whenqout=mcelse‘0’;cnt1:count

portmap(gclk,reset,divclk);control:process(divclk)is

begin……

endprocesscontrol;……endarchitecturear;進程內部為順序域構造體的begin\end之間為并發域2022/12/1184并發語句在VHDL語句程序結構中出現2022/12/12855.2.1進程語句在一個結構體中,進程語句是并發處理語句,多個process語句是并行運行的。進程語句的特點:進程可存取構造體或實體中所定義的信號;進程內部所有語句都是順序執行的;為了啟動進程,在進程中必須包含有一個顯示的敏感信號量表或包含一個wait語句;進程之間的通信通過信號量傳遞來實現。2022/12/11855.2.1進程語句在一個結構體中,2022/12/12865.2.2并發信號代入語句

(concurrentsignalassignment)信號代入語句在進程中作為順序語句使用,也可以在進程外作為并發信號代入語句使用;一個并發信號代入語句是一個進程的縮寫。architecturebehaveofa_barisbeginoutput<=a(i);endbehave;process(a,i)beginoutput<=a(i);endprocess;2022/12/11865.2.2并發信號代入語句

2022/12/1287并發信號代入語句可用于仿真:加法器乘法器除法器比較器各種邏輯電路的輸出并發代入語句在仿真時刻同時運行,表征了各個獨立器件的各自獨立操作:

a<=b+c;d<=e*f;這兩條語句表明在實際的硬件系統中,加法器和乘法器是獨立并行工作的。因此,代入符號的右邊可為:算術運算表達式關系運算表達式邏輯運算表達式2022/12/1187并發信號代入語句可用于仿真:并發代入2022/12/12885.2.3條件信號代入語句

(conditionalsignalassignment)

條件信號代入語句是一個特殊的信號代入形式,與if-then-else語句類似,其賦值條件的判斷具有順序性。目的信號<=

表達式1when

條件1else

表達式2when

條件2else

表達式3when條件3else┆

表達式n;when后條件為真則將when前表達式的值賦給目標信號1)書寫格式2022/12/11885.2.3條件信號代入語句

2022/12/12892)舉例四選一電路libraryieee;useieee.std_logic_1164.all;entitykmux4isport(i0,i1,i2,i3,a,b:instd_logic;q:outstd_logic);endkmux4;architecturertlofkmux4issignalsel:std_logic_vector(1downto0);beginsel<=b&a;q<=i0whensel="00"elsei1whensel="01"elsei2whensel="10"elsei3whensel="11"else‘X’;endrtl;列出的條件具有隱含的優先級2022/12/11892)舉例四選一電路librar2022/12/12904)條件信號代入語句與if語句的區別if語句只能在進程內部使用,屬于順序語句;條件信號代入語句中的else項一定要有;條件信號代入不能進行嵌套。3)條件信號代入語句的隱含優先級

若條件信號代入語句中有兩個或多個表達式的條件為真,則僅將第一個條件為真的表達式賦給對象。Z<=AwhenASSIGN_A=‘1’elseBwhenASSIGN_B=‘1’elseC;2022/12/11904)條件信號代入語句與if語句的區2022/12/12915.2.4選擇信號代入語句

(selectivesignalassignment)

選擇信號代入語句類似于case語句,可在進程外實現case進程的功能,選擇信號代入語句對表達式進行測試,當表達式取值不同時,將使用不同的值代入目的信號量。with

選擇條件表達式select目標信號

<=

表達式1when

選擇條件1,

表達式2when

選擇條件2, …

表達式nwhen

選擇條件n;要確保when子句能夠包含所有的條件1)書寫格式2022/12/11915.2.4選擇信號代入語句

2022/12/12922)舉例:四選一電路(使用選擇信號代入語句)libraryieee;useieee.std_logic_1164.all;entitymuxisport(i0,i1,i2,i3,a,b:instd_logic;q:outstd_logic);endentitymux;archi

溫馨提示

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

評論

0/150

提交評論