網(wǎng)絡(luò)消費(fèi)網(wǎng) >  5G > > 正文
        Verilog HDL基礎(chǔ)之:條件語句
        時間:2021-12-24 06:44:03

        if語句

        if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。Verilog HDL語言提供了3種形式的if語句。

        (1)無分支。

        語法形式:

        if (表達(dá)式) 語句;

        例如:

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

        (2)單級分支。

        語法形式:

        if(表達(dá)式)語句1;

        else 語句2;

        例如:

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

        else out1=int2;

        (3)多級分支

        語法形式:

        if(表達(dá)式1) 語句1;

        else if(表達(dá)式2) 語句2;

        else if(表達(dá)式3) 語句3;

        ...

        else if(表達(dá)式m) 語句m;

        else 語句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語句有如下6點(diǎn)說明:

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

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

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

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

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

        if(a>b)begin //使用begin_end語句實(shí)現(xiàn)多個賦值操作

        out1=int1;

        out2=int2;

        end

        else begin

        out1=int2;

        out2=int1;

        end

        注意

        在end后不需要再加分號,因?yàn)閎egin_end內(nèi)是一個完整的復(fù)合語句,不需再附加分號。

        (4)允許一定形式的表達(dá)式簡寫方式,例如:

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

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

        (5)if語句的嵌套。

        在if語句中又包含一個或多個if語句,稱為if語句的嵌套,一般形式如下:

        if(expression1)

        if(expression2) 語句1 (內(nèi)嵌if)

        else 語句2

        else if(expression3) 語句3 (內(nèi)嵌if)

        else 語句4

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

        if() begin

        if() 語句1 (內(nèi)嵌if)

        end

        else 語句2

        這時begin_end塊語句限定了內(nèi)嵌if語句的范圍,因此else與第一個if配對。注意begin_end塊語句在if_else語句中的使用,因?yàn)橛袝rbegin_end塊語句的不慎使用會改變邏輯行為,如下所示:

        if(index>0) //內(nèi)嵌for語句,無else分支

        for(scani=0;scaniindex;scani=scani+1) //內(nèi)嵌if語句

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

        $display(...);

        memory[scani]=0;

        end

        else //此處為內(nèi)嵌if語句的分支

        $display(error-indexiszero);

        ...

        盡管程序設(shè)計(jì)者把else寫在與第一個if(外層if)同一列上,希望與第一個if對應(yīng),但實(shí)際上else是與第二個if對應(yīng),因?yàn)樗鼈兿嗑嘧罱U_的寫法如下:

        if(index>0) begin //內(nèi)嵌for語句,有else分支

        for(scani=0;scaniindex;scani=scani+1) //內(nèi)嵌if語句

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

        $display(...);

        memory[scani]=0;

        end

        end

        else //此處為外部if語句的分支

        $display(error-indexiszero);

        (6)if_else例子。

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

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

        reg [7:0] index;

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

        parameter //定義參數(shù)

        segment1=0, inc_seg1=1,

        segment2=20, inc_seg2=2,

        segment3=64, inc_seg3=4,

        data=128;

        //檢測寄存器index的值

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

        instruction = segment_area[index + modify_seg1];

        index = index + inc_seg1;

        end

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

        instruction = segment_area[index + modify_seg2];

        index = index + inc_seg2;

        end

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

        instruction = segment_area[index + modify_seg3];

        index = index + inc_seg3;

        end

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

        instruction = segment_area[index];

        case語句

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

        (1)case (表達(dá)式) case分支項(xiàng)> endcase

        (2)casez(表達(dá)式) case分支項(xiàng)> endcase

        (3)casex(表達(dá)式) case分支項(xiàng)> endcase

        case分支項(xiàng)>的一般語法格式如下:

        分支表達(dá)式: 語句

        缺省項(xiàng)(default項(xiàng)): 語句

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

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

        (2)當(dāng)控制表達(dá)式的值與分支表達(dá)式的值相等時,就執(zhí)行分支表達(dá)式后面的語句。如果所有的分支表達(dá)式的值都沒有與控制表達(dá)式的值相匹配的,就執(zhí)行default后面的語句。

        (3)default項(xiàng)可有可無,一個case語句里只能有一個default項(xiàng)。下面是一個簡單的使用case語句的例子。該例子中對寄存器rega譯碼以確定result的值。

        reg [15:0] rega;

        reg [9:0] result;

        case(rega)

        16 d0: result = 10 b0111111111; //rega等于0時

        16 d1: result = 10 b1011111111; //rega等于1時

        16 d2: result = 10 b1101111111; //rega等于2時

        16 d3: result = 10 b1110111111; //rega等于3時

        16 d4: result = 10 b1111011111; //rega等于4時

        16 d5: result = 10 b1111101111; //rega等于5時

        16 d6: result = 10 b1111110111; //rega等于6時

        16 d7: result = 10 b1111111011; //rega等于7時

        16 d8: result = 10 b1111111101; //rega等于8時

        16 d9: result = 10 b1111111110; //rega等于9時

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

        endcase

        (4)每一個case分項(xiàng)的分支表達(dá)式的值必須互不相同,否則就會出現(xiàn)矛盾現(xiàn)象(對表達(dá)式的同一個值,有多種執(zhí)行方案)。

        (5)執(zhí)行完case分項(xiàng)后的語句,則跳出該case語句結(jié)構(gòu),終止case語句的執(zhí)行。

        (6)在用case語句表達(dá)式進(jìn)行比較的過程中,只有當(dāng)信號的對應(yīng)位的值能明確進(jìn)行比較時,比較才能成功,因此要詳細(xì)說明case分項(xiàng)的分支表達(dá)式的值。

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

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

        (1)與case語句中的控制表達(dá)式和多分支表達(dá)式相比,if結(jié)構(gòu)中的條件表達(dá)式更為直觀一些。

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

        例1:case語句1。

        case (select[1:2])

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

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

        2 b0x,

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

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

        2 bx0,

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

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

        endcase

        例2:case語句2

        case(sig)

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

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

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

        endcase

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

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

        表3.10 case語句真值表

        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

        下面給出兩個例子來分別說明casez語句和casex語句。

        例3:casez語句。

        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語句。

        reg[7:0] r, mask;

        mask = 8bx0x0x0x0;

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

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

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

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

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

        Endcase

        其他條件語句

        上面提到的if語句和case語句都只能應(yīng)用于always語句內(nèi)部。如果需要在always語句之外應(yīng)用條件語句,可以采樣這樣的語法結(jié)構(gòu):

        assign data = (sel)? a : b;

        上面的語句的含義相當(dāng)于:

        if (sel = 1)

        data = a;

        else

        data = b;

        關(guān)鍵詞: VerilogHDL 華清遠(yuǎn)見

        版權(quán)聲明:
            凡注明來網(wǎng)絡(luò)消費(fèi)網(wǎng)的作品,版權(quán)均屬網(wǎng)絡(luò)消費(fèi)網(wǎng)所有,未經(jīng)授權(quán)不得轉(zhuǎn)載、摘編或利用其它方式使用上述作品。已經(jīng)本網(wǎng)授權(quán)使用作品的,應(yīng)在授權(quán)范圍內(nèi)使用,并注明"來源:網(wǎng)絡(luò)消費(fèi)網(wǎng)"。違反上述聲明者,本網(wǎng)將追究其相關(guān)法律責(zé)任。
            除來源署名為網(wǎng)絡(luò)消費(fèi)網(wǎng)稿件外,其他所轉(zhuǎn)載內(nèi)容之原創(chuàng)性、真實(shí)性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考并自行核實(shí)。
        熱文

        網(wǎng)站首頁 |網(wǎng)站簡介 | 關(guān)于我們 | 廣告業(yè)務(wù) | 投稿信箱
         

        Copyright © 2000-2020 www.fnsyft.com All Rights Reserved.
         

        中國網(wǎng)絡(luò)消費(fèi)網(wǎng) 版權(quán)所有 未經(jīng)書面授權(quán) 不得復(fù)制或建立鏡像
         

        聯(lián)系郵箱:920 891 263@qq.com

        備案號:京ICP備2022016840號-15

        營業(yè)執(zhí)照公示信息

        2048亚洲精品国产| 亚洲av日韩综合一区二区三区| 亚洲成在人线aⅴ免费毛片| 亚洲校园春色小说| 亚洲色欲或者高潮影院| 久久综合亚洲色HEZYO社区| 久久亚洲国产精品| 亚洲91av视频| 亚洲高清日韩精品第一区| 亚洲视频在线免费观看| 亚洲A∨无码一区二区三区| 亚洲va在线va天堂va不卡下载| 久久亚洲综合色一区二区三区 | 亚洲日韩aⅴ在线视频| 国产亚洲大尺度无码无码专线| 日韩亚洲变态另类中文| 亚洲一区二区三区香蕉| 亚洲成色在线综合网站| 国产亚洲一区二区三区在线| 久久精品国产亚洲av四虎| 亚洲国产精品热久久| 亚洲视频在线观看地址| 亚洲大香人伊一本线| 亚洲精品国产日韩| 亚洲成av人无码亚洲成av人| 国产偷国产偷亚洲高清在线| 亚洲福利精品电影在线观看| 2048亚洲精品国产| 亚洲AV无一区二区三区久久| 图图资源网亚洲综合网站| 亚洲系列国产精品制服丝袜第| 亚洲人成毛片线播放| 在线观看亚洲AV日韩A∨| 久久亚洲中文字幕无码| 亚洲人成人网站在线观看| 国产亚洲无线码一区二区| 亚洲第一精品福利| 亚洲国产成人久久77| 亚洲丶国产丶欧美一区二区三区| 老司机亚洲精品影院在线观看 | 99久久亚洲综合精品成人网|