<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Verilog HDL基礎之:條件語(yǔ)句

Verilog HDL基礎之:條件語(yǔ)句

作者: 時(shí)間:2017-06-05 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201706/348846.htm

if語(yǔ)句

if語(yǔ)句是用來(lái)判定所給定的條件是否滿(mǎn)足,根據判定的結果(真或假)決定執行給出的兩種操作之一。Verilog HDL語(yǔ)言提供了3種形式的if語(yǔ)句。

(1)無(wú)分支。

語(yǔ)法形式:

if (表達式) 語(yǔ)句;

例如:

if (a > b) out1 = int1; //若a大于b,將int1賦予out1

(2)單級分支。

語(yǔ)法形式:

if(表達式)語(yǔ)句1;

else 語(yǔ)句2;

例如:

if(a>b) out1=int1; //若a大于b,將int1賦予out1;否則,將int2賦予out1

else out1=int2;

(3)多級分支

語(yǔ)法形式:

if(表達式1) 語(yǔ)句1;

else if(表達式2) 語(yǔ)句2;

else if(表達式3) 語(yǔ)句3;

...

else if(表達式m) 語(yǔ)句m;

else 語(yǔ)句n;

例如:

if(a>b) out1=int1; //若a大于b,將int1賦予out1

else if(a==b) out1=int2; //否則,如果a等于b,將int2賦予out1

else out1=int3; //否則,將int3賦予out1

關(guān)于if語(yǔ)句有如下6點(diǎn)說(shuō)明:

(1)3種形式的if語(yǔ)句中,在if后面都有“表達式”,一般為邏輯表達式或關(guān)系表達式。系統對表達式的值進(jìn)行判斷,若為0、x或z,按“假”處理;若為1,按“真”處理,執行指定的語(yǔ)句。

(2)第二、第三種形式的if語(yǔ)句中,在每個(gè)else前面有一分號,整個(gè)語(yǔ)句結束處有一分號。

這是由于分號是Verilog HDL語(yǔ)句中不可缺少的部分,這個(gè)分號是if語(yǔ)句中的內嵌套語(yǔ)句所要求的。如果無(wú)此分號,則出現語(yǔ)法錯誤。

但應注意,不要誤認為上面是兩個(gè)語(yǔ)句(if語(yǔ)句和else語(yǔ)句)。它們都屬于同一個(gè)if語(yǔ)句。else子句不能作為語(yǔ)句單獨使用,它必須是if語(yǔ)句的一部分,與if配對使用。

(3)在if和else后面可以包含一個(gè)內嵌的操作語(yǔ)句,也可以有多個(gè)操作語(yǔ)句,此時(shí)用begin和end這兩個(gè)關(guān)鍵詞將幾個(gè)語(yǔ)句包含起來(lái)成為一個(gè)復合塊語(yǔ)句如下所示。

if(a>b)begin //使用begin_end語(yǔ)句實(shí)現多個(gè)賦值操作

out1=int1;

out2=int2;

end

else begin

out1=int2;

out2=int1;

end

注意

在end后不需要再加分號,因為begin_end內是一個(gè)完整的復合語(yǔ)句,不需再附加分號。

(4)允許一定形式的表達式簡(jiǎn)寫(xiě)方式,例如:

if(expression) 等同于 if( expression == 1 )

if(!expression) 等同于 if( expression != 1 )

(5)if語(yǔ)句的嵌套。

在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句,稱(chēng)為if語(yǔ)句的嵌套,一般形式如下:

if(expression1)

if(expression2) 語(yǔ)句1 (內嵌if)

else 語(yǔ)句2

else if(expression3) 語(yǔ)句3 (內嵌if)

else 語(yǔ)句4

應當注意if與else的配對關(guān)系,else總是與它上面的最近的if配對。如果if與else的數目不一樣,為了實(shí)現程序設計者的企圖,可以用begin_end塊語(yǔ)句來(lái)確定配對關(guān)系,例如:

if() begin

if() 語(yǔ)句1 (內嵌if)

end

else 語(yǔ)句2

這時(shí)begin_end塊語(yǔ)句限定了內嵌if語(yǔ)句的范圍,因此else與第一個(gè)if配對。注意begin_end塊語(yǔ)句在if_else語(yǔ)句中的使用,因為有時(shí)begin_end塊語(yǔ)句的不慎使用會(huì )改變邏輯行為,如下所示:

if(index>0) //內嵌for語(yǔ)句,無(wú)else分支

for(scani=0;scaniindex;scani=scani+1) //內嵌if語(yǔ)句

if(memory[scani]>0) begin //使用begin_end語(yǔ)句,有else分支

$display(...);

memory[scani]=0;

end

else //此處為內嵌if語(yǔ)句的分支

$display(error-indexiszero);

...

盡管程序設計者把else寫(xiě)在與第一個(gè)if(外層if)同一列上,希望與第一個(gè)if對應,但實(shí)際上else是與第二個(gè)if對應,因為它們相距最近。正確的寫(xiě)法如下:

if(index>0) begin //內嵌for語(yǔ)句,有else分支

for(scani=0;scaniindex;scani=scani+1) //內嵌if語(yǔ)句

if(memory[scani]>0) begin //使用begin_end語(yǔ)句,無(wú)else分支

$display(...);

memory[scani]=0;

end

end

else //此處為外部if語(yǔ)句的分支

$display(error-indexiszero);

(6)if_else例子。

下面這段程序用if_else語(yǔ)句來(lái)檢測變量index以決定modify-seg1、modify-seg2、modify-seg3中哪一個(gè)的值應當與index相加作為memory的尋址地址。并且將相加值存入寄存器index以備下次檢測使用。程序的前10行定義寄存器和參數。

reg [31:0] instruction, segment_area[255:0]; //定義寄存器

reg [7:0] index;

reg [5:0] modify_seg1, modify_seg2, modify_seg3;

parameter //定義參數

segment1=0, inc_seg1=1,

segment2=20, inc_seg2=2,

segment3=64, inc_seg3=4,

data=128;

//檢測寄存器index的值

if(indexsegment2) begin //index<20時(shí),執行下列操作

instruction = segment_area[index + modify_seg1];

index = index + inc_seg1;

end

else if(indexsegment3) begin //20<index<64時(shí),執行下列操作

instruction = segment_area[index + modify_seg2];

index = index + inc_seg2;

end

else if (indexdata) begin //64<index<128時(shí),執行下列操作

instruction = segment_area[index + modify_seg3];

index = index + inc_seg3;

end

else //index>128時(shí),執行下列操作

instruction = segment_area[index];

case語(yǔ)句

case語(yǔ)句是一種多分支選擇語(yǔ)句,if語(yǔ)句只有兩個(gè)分支可供選擇,而實(shí)際問(wèn)題中常常需要用到多分支選擇。Verilog語(yǔ)言提供的case語(yǔ)句直接處理多分支選擇。case語(yǔ)句通常用于微處理器的指令譯碼,它的一般形式如下:

(1)case (表達式) case分支項> endcase

(2)casez(表達式) case分支項> endcase

(3)casex(表達式) case分支項> endcase

case分支項>的一般語(yǔ)法格式如下:

分支表達式: 語(yǔ)句

缺省項(default項): 語(yǔ)句

關(guān)于case語(yǔ)句的幾點(diǎn)說(shuō)明如下。

(1)case括弧內的表達式稱(chēng)為控制表達式,case分支項中的表達式稱(chēng)為分支表達式??刂票磉_式通常表示為控制信號的某些位,分支表達式則用這些控制信號的具體狀態(tài)值來(lái)表示,因此分支表達式又可以稱(chēng)為常量表達式。

(2)當控制表達式的值與分支表達式的值相等時(shí),就執行分支表達式后面的語(yǔ)句。如果所有的分支表達式的值都沒(méi)有與控制表達式的值相匹配的,就執行default后面的語(yǔ)句。

(3)default項可有可無(wú),一個(gè)case語(yǔ)句里只能有一個(gè)default項。下面是一個(gè)簡(jiǎn)單的使用case語(yǔ)句的例子。該例子中對寄存器rega譯碼以確定result的值。

reg [15:0] rega;

reg [9:0] result;

case(rega)

16 d0: result = 10 b0111111111; //rega等于0時(shí)

16 d1: result = 10 b1011111111; //rega等于1時(shí)

16 d2: result = 10 b1101111111; //rega等于2時(shí)

16 d3: result = 10 b1110111111; //rega等于3時(shí)

16 d4: result = 10 b1111011111; //rega等于4時(shí)

16 d5: result = 10 b1111101111; //rega等于5時(shí)

16 d6: result = 10 b1111110111; //rega等于6時(shí)

16 d7: result = 10 b1111111011; //rega等于7時(shí)

16 d8: result = 10 b1111111101; //rega等于8時(shí)

16 d9: result = 10 b1111111110; //rega等于9時(shí)

default: result = bx; //rega不等于上面的值時(shí)

endcase

(4)每一個(gè)case分項的分支表達式的值必須互不相同,否則就會(huì )出現矛盾現象(對表達式的同一個(gè)值,有多種執行方案)。

(5)執行完case分項后的語(yǔ)句,則跳出該case語(yǔ)句結構,終止case語(yǔ)句的執行。

(6)在用case語(yǔ)句表達式進(jìn)行比較的過(guò)程中,只有當信號的對應位的值能明確進(jìn)行比較時(shí),比較才能成功,因此要詳細說(shuō)明case分項的分支表達式的值。

(7)case語(yǔ)句的所有表達式的值的位寬必須相等,只有這樣控制表達式和分支表達式才能進(jìn)行對應位的比較。一個(gè)經(jīng)常犯的錯誤是用bx、bz 來(lái)替代nbx、nbz,這樣寫(xiě)是不對的,因為信號x、z的缺省寬度是機器的字節寬度,通常是32位(此處 n 是case控制表達式的位寬)。

case語(yǔ)句與if語(yǔ)句的區別主要有以下兩點(diǎn)。

(1)與case語(yǔ)句中的控制表達式和多分支表達式相比,if結構中的條件表達式更為直觀(guān)一些。

(2)對于那些分支表達式中存在不定值x和高阻值z時(shí),case語(yǔ)句提供了處理這種情況的手段。下面的兩個(gè)例子介紹了處理x、z值case語(yǔ)句。

例1:case語(yǔ)句1。

case (select[1:2])

2 b00: result = 0; //select[1:2]等于00時(shí)

2 b01: result = flaga; //select[1:2]等于01時(shí)

2 b0x,

2 b0z: result = flaga? bx: 0; //select[1:2]等于0x和0z時(shí),執行表達式

2 b10: result = flagb; //select[1:2]等于10時(shí)

2 bx0,

2 bz0: result = flagb? bx :0; //select[1:2]等于x0和z0時(shí),執行表達式

default: result = bx; //select[1:2]不等于上面的值時(shí)

endcase

例2:case語(yǔ)句2

case(sig)

1 bz: $display(signal is floating); //sig為高阻時(shí),打印輸出

1 bx: $display(signal is unknown); //sig為不定狀態(tài)時(shí),打印輸出

default: $display(signal is %b, sig); //為其他時(shí),即0或1時(shí),打印輸出

endcase

針對電路的特性,Verilog HDL提供了case語(yǔ)句的其他兩種形式用來(lái)處理不必考慮的情況(dont care condition)。其中casez語(yǔ)句用來(lái)處理不考慮高阻值z的比較過(guò)程,casex語(yǔ)句則將高阻值z和不定值都視為不必關(guān)心的情況。

所謂不必關(guān)心的情況,即在表達式進(jìn)行比較時(shí),不將該位的狀態(tài)考慮在內。這樣在case語(yǔ)句表達式進(jìn)行比較時(shí),就可以靈活地設置,以對信號的某些位進(jìn)行比較。如表3.10所示為case、casez、casex 的真值表:

表3.10 case語(yǔ)句真值表

case

0

1

x

z

0

1

0

0

0

1

0

1

0

0

x

0

0

1

0

z

0

0

0

1

casez

0

1

x

z

0

1

0

0

1

1

0

1

0

1

x

0

0

1

1

z

1

1

1

1

casex

0

1

x

z

0

1

0

1

1

1

0

1

1

1

x

1

1

1

1

z

1

1

1

1

下面給出兩個(gè)例子來(lái)分別說(shuō)明casez語(yǔ)句和casex語(yǔ)句。

例3:casez語(yǔ)句。

reg[7:0] ir;

casez(ir)

8 b1???????: instruction1(ir); //只判斷ir的最高位

8 b01??????: instruction2(ir); //只判斷ir的高2位

8 b00010???: instruction3(ir); //只判斷ir的高5位

8 b000001??: instruction4(ir); //只判斷ir的高6位

endcase

例4:casex語(yǔ)句。

reg[7:0] r, mask;

mask = 8bx0x0x0x0;

casex(r^mask) //判斷r^mask的結果

8 b001100xx: stat1; //不考慮低2位

8 b1100xx00: stat2; //不考慮第3、4位

8 b00xx0011: stat3; //不考慮第5、6位

8 bxx001100: stat4; //不考慮高2位

Endcase

其他條件語(yǔ)句

上面提到的if語(yǔ)句和case語(yǔ)句都只能應用于always語(yǔ)句內部。如果需要在always語(yǔ)句之外應用條件語(yǔ)句,可以采樣這樣的語(yǔ)法結構:

assign data = (sel)? a : b;

上面的語(yǔ)句的含義相當于:

if (sel = 1)

data = a;

else

data = b;



關(guān)鍵詞: VerilogHDL 華清遠見(jiàn)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>