版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章行為描述的語法4行為描述語言行為描述是一種從抽象角度來表示硬件電路,通過表達(dá)輸入與輸出之間的關(guān)系來描述硬件行為的方法。行為描述直接根據(jù)電路外部行為進(jìn)行描述,與硬件電路結(jié)構(gòu)無關(guān)。VerilogHDL語法中的行為語句主要包括過程語句、塊語句、條件語句和循環(huán)語句。這些語句的用法與C語言很類似,容易理解,但也存在一些不同之處,如塊語句、casex和casez等。行為描述一般使用initial和always過程結(jié)構(gòu)語句,其他行為語句只能出現(xiàn)在這兩種過程結(jié)構(gòu)語句中。
VerilogHDL的過程語句主要包括initial語句和always語句。在一個模塊(module)中,使用initial和always語句的次數(shù)是不受限制的,而且每個initial和always都是并行執(zhí)行的。initial語句通常用于仿真中的初始化,只在程序開始時執(zhí)行一次。當(dāng)觸發(fā)方式滿足后,always塊內(nèi)的語句一直重復(fù)執(zhí)行。該語句可綜合也可用于仿真,是一種被廣泛采用的電路設(shè)計方式。4.1過程語句
initial語句主要用于仿真測試,在仿真0時刻開始對變量進(jìn)行初始化或激勵波形的產(chǎn)生。一個模塊中可以有多個initial語句,每個initial語句都是同時從仿真0時刻開始并行執(zhí)行。initial語句不能被綜合,其格式如下:
initial begin/fork
語句1; 語句2;
……
語句n;
end/join
begin-end與fork-join塊語句類似C語言中的{},區(qū)別在于begin-end是串行執(zhí)行的而fork-join是并行執(zhí)行的。4.1.1initial語句4.1過程語句4.1過程語句【例4.1】用initial過程語句對測量變量a的賦值。
'timescasle10ns/1nsmoduletest; reg[2:0]a; initialbegina=3'b000; #5a=3'b001;#5a=3'b010;#5a=3'b011;#5a=3'b100;end endmodule在例4.1中,'timescasle10ns/1ns表示模塊仿真的時間單位為10ns,時間精度為1ns,并定義變量a,在initial語句中對a進(jìn)行賦值。initial語句中的內(nèi)容在仿真0時刻開始執(zhí)行,并且只執(zhí)行一次:仿真0時刻開始,a值為3'b000,經(jīng)過50ns后a值為3'b001,再經(jīng)過50ns后a值為3'b010,最后經(jīng)過200ns后a值一直保持為3'b100。4.1過程語句4.1.2always語句只有當(dāng)觸發(fā)條件滿足時,always語句才會不斷重復(fù)的執(zhí)行其后的塊語句。always語句可被綜合也可用于仿真,多個always語句間是并行執(zhí)行的,與書寫先后順序無關(guān)。always語句格式如下: always@(敏感信號列表) begin
語句1;
語句2; ……
語句n; end敏感信號分為兩種:一種為電平敏感型信號,一種為邊沿敏感型信號。敏感信號之間用“or”或者“,”隔開。例如:電平敏感型信號always@(A,B)與always@(AorB)這兩種書寫格式表示的內(nèi)容是一樣。電平敏感型是指信號變量發(fā)生電平的變化,一般用于組合邏輯電路中。使用時應(yīng)把可以引起always語句中的被賦值變量變化的所有信號都放入敏感信號列表中。4.1過程語句【例4.2】
用case語句描述一個3輸入與非門。modulemy_nand(f,a,b,c);inputa,b,c; outputregf; always@(aorborc)//等價于always@(a,b,c) case({a,b,c}) 3'b000:f=1;3'b001:f=1;3'b010:f=1;3'b011:f=1;3'b100:f=1;3'b101:f=1;3'b110:f=1;3'b111:f=0;default:f=1'bx;endcase endmodule4.1過程語句在例4.2中,只要a、b、c任何一個輸入信號發(fā)生變化,都會執(zhí)行always語句一次。在case語句中,根據(jù){a,b,c}的值來選擇執(zhí)行其中一個分支。用always語句設(shè)計組合邏輯電路時,需將所有輸入變量都列入敏感信號列表中??梢杂谩?”來表示always過程語句中所有的輸入信號變量,其書寫格式有always*或always(*)。4.1過程語句例4.2中的程序可以寫為modulemy_nand(f,a,b,c);inputa,b,c; outputregf; always@(*) case({a,b,c}) 3'b000:f=1;3'b001:f=1;3'b010:f=1;3'b011:f=1;3'b100:f=1;3'b101:f=1;3'b110:f=1;3'b111:f=0;default:f=1'bx;endcase endmodule邊沿敏感型信號是指信號變量出現(xiàn)上升沿或者下降沿變化,主要用于時序邏輯電路中,有兩種表示形式:posedge表示上升沿,negedge表示下降沿。4.1過程語句【例4.3】設(shè)計一個同步清零、同步置數(shù)的D觸發(fā)器。 moduleDff(inputD,clk,reset,set,outputregQ); always@(posedgeclk) begin if(!reset)Q<=0; //同步清零,低電平有效 elseif(!set)Q<=1; //同步置數(shù),低電平有效 else Q<=D; end endmodule在例4.3中,always語句的敏感信號列表為上升沿clk,當(dāng)clk上升沿到來時,將執(zhí)行always中的語句一次。執(zhí)行always語句時會優(yōu)先判斷reset復(fù)位信號,如果復(fù)位信號無效,則判斷set置數(shù)信號,這體現(xiàn)了清零的優(yōu)先級高于置數(shù)的優(yōu)先級的。當(dāng)敏感信號列表中加入reset和set的邊沿信號時,D觸發(fā)器將變成異步清零、異步置數(shù)的D觸發(fā)器,當(dāng)三個敏感信號的其中之一滿足觸發(fā)條件時,always后的塊語句執(zhí)行一次,修改如下:always@(posedgeclk,negedgereset,negedgeset)4.1過程語句例如,下面的描述是錯誤的:always@(posedgeclk,negedgereset,negedgeset) begin if(reset)Q<=0; //應(yīng)改為if(!reset) elseif(!set)Q<=1; else Q<=D; end語句的邏輯描述要與敏感信號列表中的有效電平一致。例如,采用reset信號下降沿為觸發(fā)信號,則低電平為有效置數(shù)電平,在描述置數(shù)功能時切勿寫成高電平有效。4.2塊語句4.2.1串行塊語句begin-end當(dāng)語句有兩條以上時,要用塊語句將語句結(jié)合成一個整體,當(dāng)塊內(nèi)只有一條語句時,塊標(biāo)識符就不需要了。塊語句分為串行塊語句begin-end和并行塊語句fork-join兩種。串行塊內(nèi)各條語句按它們在塊內(nèi)位置順序執(zhí)行,比如:begin b=a;//先執(zhí)行 c=b; //后執(zhí)行 end串行塊語句begin-end塊內(nèi)的語句順序執(zhí)行:先將a的值賦值給b,再將b的值賦值給c,最后a,b,c的值相同。 begin-end也常用于仿真中的驅(qū)動波形的產(chǎn)生。4.2塊語句【例4.4】采用begin-end語句產(chǎn)生3輸入與非門的驅(qū)動波形。 `timescale1ns/1psmoduletest1_TF; rega,b,c; wiref; my_nanduut(.f(f),.a(a),.b(b),.c(c) ); initial begin {a,b,c}=3'b000; #100{a,b,c}=3'b000;#100{a,b,c}=3'b001; #100{a,b,c}=3'b010; #100{a,b,c}=3'b011; #100{a,b,c}=3'b100;#100{a,b,c}=3'b101; #100{a,b,c}=3'b110; #100{a,b,c}=3'b111; endendmodule4.2塊語句并行塊內(nèi)各條語句各自獨(dú)立地同時開始執(zhí)行,即塊內(nèi)各條語句開始執(zhí)行時間都是進(jìn)入塊內(nèi)的時間,屬于并發(fā)執(zhí)行。比如:假設(shè)執(zhí)行下面語句前a=1,b=2,c=3。 fork b=a; c=b; join
上述fork-join塊語句執(zhí)行完后,等式左邊b和c同時得到等式右邊的值,即:b=1,c=2。
在進(jìn)行仿真時,fork-join并行塊中每條語句前面的延時都是相對于該并行塊的起始執(zhí)行時間的。4.2.2并行塊語句fork-join4.2塊語句【例4.5】采用fork-join語句產(chǎn)生3輸入與非門的驅(qū)動波形。 `timescale1ns/1psmoduletest1_TF; rega,b,c; wiref; my_nanduut(.f(f),.a(a),.b(b),.c(c) ); initial fork {a,b,c}=3'b000; #100{a,b,c}=3'b000;#200{a,b,c}=3'b001; #300{a,b,c}=3'b010; #400{a,b,c}=3'b011; #500{a,b,c}=3'b100;#600{a,b,c}=3'b101; #700{a,b,c}=3'b110; #800{a,b,c}=3'b111; joinendmodule4.3條件語句VerilogHDL提供兩種條件語句:if-else語句和case語句,兩種語句都屬于順序執(zhí)行語句,而且必須在過程塊如initial或always等內(nèi)使用。4.3.1if-else語句
用if-else語句來判定所給條件是否滿足,根據(jù)判定結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。與C語言中if語句類似,VerilogHDL提供三種形式的if語句。C語言中用{}將語句括起來,VreilogHDL語言則用begin-end將語句括起來。1、if(表達(dá)式)
語句;單分支語句,如果表達(dá)式為真,則執(zhí)行語句,否則不執(zhí)行語句。例如:if(a==b)out1<=int1;2、if(表達(dá)式)
語句1;else語句2;雙分支語句,如果表達(dá)式為真,則執(zhí)行語句1,否則執(zhí)行語句2。例如:if(a==b)out1<=int1;elseout1<=int2;4.2塊語句3、if(表達(dá)式1)
語句1;elseif(表達(dá)式2)語句2;elseif(表達(dá)式3)語句3;……elseif(表達(dá)式n)語句n;else語句n+1;
多分支語句:如果表達(dá)式1為真,則執(zhí)行語句1,否則再判斷表達(dá)式2;如果表達(dá)式2為真,執(zhí)行語句2,否則再判斷表達(dá)式3,以此類推,直到最后。例如:if(a==b)out1<=int1; elseif(a<b)out1<=int2; elseout1<=int3;
上述三種形式中的“表達(dá)式”一般為邏輯表達(dá)式、關(guān)系表達(dá)式或1位變量。if語句對表達(dá)式的值進(jìn)行判斷,若值為0、x或z則按“假”處理,若值為1則按“真”處理。盡量不要使用方式一,因?yàn)橛衖f沒有else會容易產(chǎn)生不必要的觸發(fā)器用于保存if語句不成立時的值。4.2塊語句語句可是單句,也可是多句,多句時用begin-end塊語句括起來。比如: if(a>b)begina<=b;b<=c;end else beginc<=a;b<=c;end
注意:在end后面不需要加分號。
在if與else配對關(guān)系上,else總是與它前面最近if配對,且else不能單獨(dú)出現(xiàn),有else的地方必須要有一個if與它配對。4.2塊語句比如:
下面為錯誤例子: if(a>b)out1<=int1;if(c==0)beginout1<=int2;endout2<=int3; else out2<=int4;
上述例子中由于書寫格式不清晰,導(dǎo)致else配對出現(xiàn)錯誤和語法錯誤,可以將上面程序?qū)懗桑篿f(a>b)beginout1<=int1;if(c==0)beginout1<=int2;endout2<=int3;endelse beginout2<=int4;end4.2塊語句【例4.6】使用if-else語句設(shè)計八位數(shù)據(jù)選擇器。moduleMUX8(out,in0,in1,sel); parameterN=8; outputreg[N:1]out; input[N:1]in0,in1; inputsel; always@(*) begin if(sel)out<=in0; elseout<=in1;endendmodule4.2塊語句【例4.7】
設(shè)計一個帶同步清零和加載端(低電平有效)的模60的BCD碼計數(shù)器。 `timescale1ns/1ps modulecounter //模塊聲明采用Verilog-2001格式 (inputload,clk,reset, input[7:0]data, outputreg[7:0]BCDout, outputcout); always@(negedgeclk) //時鐘下降沿觸發(fā)always begin if(!reset) BCDout<=0; //同步復(fù)位,reset=1時復(fù)位 elseif(!load)BCDout<=data;//同步加載,load=1時加載 elsebegin if(BCDout[3:0]>=9)//個位在0~9內(nèi)加1 beginBCDout[3:0]<=0; if(BCDout[7:4]==5)BCDout[7:4]<=0;//十位在0~5內(nèi)加1 elseBCDout[7:4]<=BCDout[7:4]+1; end elseBCDout[3:0]<=BCDout[3:0]+1; end end assigncout=(BCDout==8'h59)?1:0; endmodule4.2塊語句
case語句是一種多分支選擇語句,使用case語句代替if-else語句可使讀者更容易讀懂代碼,邏輯利用率和性能上都有所提高。case語句有case、casez、casex三種方式,casez忽視“z”而casex忽視“x”,使用方法有所不同。4.3.2case語句1.case語句case語句的使用格式如下:case(條件表達(dá)式)
值1:語句1; //case分支項
值2:語句2; ……
值n:語句n; default:語句n+1;//缺省項 endcase//結(jié)束case語句4.2塊語句case語句執(zhí)行過程:首先計算出條件表達(dá)式的值,按順序?qū)⑺透鞣种ы椫颠M(jìn)行比較,然后執(zhí)行相匹配的分支語句;如果都不滿足匹配條件,則執(zhí)行default后面的語句。
若前面已列出了條件表達(dá)式所有可能的取值,則default語句可以省略;若未列全所有取值,最好不要省略default語句,否則會產(chǎn)生不必要的鎖存器。說明:(1)case分支表達(dá)式值1~n必須互不相同,否則會出現(xiàn)矛盾現(xiàn)象,同一個值有多種執(zhí)行語句。(2)執(zhí)行完case分支語句后,則跳出case語句結(jié)構(gòu),終止case語句執(zhí)行(無需像C語言要break才跳出分支)。(3)case語句條件表達(dá)式與分支值的位寬必須相等。4.2塊語句【例4.8】
使用case語句實(shí)現(xiàn)一個有使能控制端res(低電平復(fù)位)的四選一數(shù)據(jù)選擇器。modulemux(EN,IN0,IN1,IN2,IN3,SEL,OUT); inputEN;input[3:0]IN0,IN1,IN2,IN3;input[1:0]SEL; outputreg[3:0]OUT; always@(SELorENorIN0orIN1orIN2orIN3) begin if(EN==0)OUT={4{1'b0}}; elsecase(SEL) 0:OUT=IN0; 1:OUT=IN1; 2:OUT=IN2; 3:OUT=IN3; default:OUT=4'bx; endcase endendmodule4.2塊語句【例4.9】
使用case語句描述的3人表決電路。 modulevote3 (inputa,b,c,outputregpass); always@(a,b,c)begin case({a,b,c}) //用case語句進(jìn)行譯碼 3’b000:pass=1'b0; //表決不通過 3’b001:pass=1'b0; 3’b010:pass=1'b0; 3’b011:pass=1'b1; //表決通過 3’b100:pass=1'b0; 3’b101:pass=1'b1; //表決通過 3’b110:pass=1'b1; //表決通過 3’b111:pass=1'b1; //表決通過 default:pass=1'b0; endcase end endmodule4.2塊語句2.casez語句與casex語句(1)在case語句中,條件表達(dá)式與分支值1~n的比較是一種全等(===)的比較,條件表達(dá)式與分支的值必須完全相等。(2)在casez語句中,條件表達(dá)式與分支值1~n的比較不是全等的比較,如果分支表達(dá)式某些位的值為高阻z,則不比較忽略考慮,只需關(guān)注其他位的比較結(jié)果。(3)在casex語句中,條件表達(dá)式與分支值1~n的比較不是全等的比較,如果分支表達(dá)式某些位的值為高阻z或者是未知狀態(tài)x,則不比較忽略考慮,只需關(guān)注其他位的比較結(jié)果。例如:case(in)2'b1z:out=1; //只有in=2'b1z,才有out=1casez(in)2'b1x:out=1; //如果in=2'b1z或2'b1x,則out=1casex(in)2'b1z:out=1; //如果in=2'b1z、2'b1x、2'b11或2'b10,則out=14.2塊語句此外,還有一種表示x或z的方式,即用表示無關(guān)值的符號“?”來表示。例如:casez(in) 2'b1?:out=1; //如果in=2’b10、2’b11、2’b1x或2’b1z,則out=1case、casez和casex語句的比較如表4.1所示。表4.1case、casez和casex語句的比較4.2塊語句【例4.10】
用casez語句描述8-3編碼器。modulecoder_83(inputx,input[7:0]data,outputreg[2:0]code);always
@(data)begincasez
(data)8'b1xxx_xxxx:code=3'b111;8'b01xx_xxxx:code=3'b110;8'b001x_xxxx:code=3'b101;8'b0001_xxxx:code=3'b100;8'b0000_1xxx:code=3'b011;8'b0000_01xx:code=3'b010;8'b0000_001x:code=3'b001;8'b0000_0001:code=3'b000;default:code=3'bx;endcaseendendmodule4.4循環(huán)語句VerilogHDL中的循環(huán)語句用于控制語句的執(zhí)行次數(shù)。循環(huán)語句語句主要有以下4種:(1)for:有條件的循環(huán)語句;(2)repeat(n):連續(xù)執(zhí)行循環(huán)語句n次;(3)while:執(zhí)行一條語句直到某個條件不滿足,如果條件不滿足,則直接退出循環(huán);(4)forever:永遠(yuǎn)連續(xù)執(zhí)行語句,可以用作時鐘等周期性波形的生成。4.4循環(huán)語句4.4.1for語句for
語句的格式如下(同C語言):for
(循環(huán)變量初始化;循環(huán)結(jié)束條件;循環(huán)變量增量)
執(zhí)行語句;其中:循環(huán)變量初始化用于提供循環(huán)變量的初始值;循環(huán)結(jié)束條件一般為表達(dá)式用于指定循環(huán)結(jié)束的條件;循環(huán)變量增量通常為增加或減少循環(huán)變量的計數(shù)值;執(zhí)行語句即需要循環(huán)的語句,有多條語句時用begin-end括起來。for語句的執(zhí)行過程如下:(1)執(zhí)行循環(huán)變量賦初值一次。(2)判斷循環(huán)結(jié)束條件是否成立,如果不成立,則退出for循環(huán);如果成
立,則執(zhí)行循環(huán)語句,再執(zhí)行循環(huán)變量增量語句。(3)重復(fù)過程(2)。4.4循環(huán)語句【例4.11】用for語句描述10人表決器。
module
responder(input[9:0]
vote,output
reg
result)
;
reg[2:0]
sum;
integer
i;
always
@(vote)beginsum=0
;
for(i=0;
i<=9;
i=i+1)if
(vote[i])
sum=sum+1;if
(sum>5)result=1;//若超過5人贊成,則result=1
elseresult=0;endendmodule4.4循環(huán)語句【例4.12】用for語句計算輸入的九位數(shù)據(jù)中1的個數(shù)。
moduleget1(in,count); input[8:0]in; outputreg[3:0]count; integeri; always@(in) begin for(i=0;i<=8;i=i+1) if(in[i]==1'b1)count=count+1; end endmoudule一般情況下,綜合器都支持for循環(huán)語句,而不支持其他三種循環(huán)語句。4.4循環(huán)語句repeat語句的格式如下:repeat(表達(dá)式)
語句或 repeat(表達(dá)式)begin多條語句endrepeat循環(huán)語句的執(zhí)行過程為:先計算表達(dá)式的值,再根據(jù)其值決定循環(huán)次數(shù);如果表達(dá)式的值不確定(x或z)則循環(huán)次數(shù)按0次處理。4.4.2repeat語
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度范例選集【人事管理篇】十篇
- 單位管理制度呈現(xiàn)大合集【人力資源管理】十篇
- 《行政職業(yè)能力測驗(yàn)》2024年公務(wù)員考試陜西省渭南市高分沖刺試卷含解析
- 2024年公務(wù)員培訓(xùn)總結(jié)
- 教育科技行業(yè)話務(wù)員工作總結(jié)
- 碩士研究之路
- 電子通信行業(yè)顧問工作總結(jié)
- 2024年員工三級安全培訓(xùn)考試題【培優(yōu)B卷】
- 2023年-2024年項目部安全培訓(xùn)考試題答案研優(yōu)卷
- 2024年安全教育培訓(xùn)試題附參考答案(典型題)
- 麥肯錫:企業(yè)發(fā)展戰(zhàn)略規(guī)劃制定及實(shí)施流程教學(xué)課件
- 術(shù)中獲得性壓力性損傷預(yù)防
- 新課標(biāo)人教版五年級數(shù)學(xué)上冊總復(fù)習(xí)(全冊)
- 電氣接線工藝培訓(xùn)
- 土木工程管理與工程造價的有效控制探析獲獎科研報告
- 基層版創(chuàng)傷中心建設(shè)指南(試行)
- 全過程造價咨詢服務(wù)實(shí)施方案
- 插圖幻燈片制作PPT3D小人圖標(biāo)幻燈素材(精)
- 室內(nèi)設(shè)計裝飾材料案例分析課件
- 四年級上冊道德與法治第10課《我們所了解的環(huán)境污染》教學(xué)反思(部編人教版)
- GB/T 8491-2009高硅耐蝕鑄鐵件
評論
0/150
提交評論