0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在verilog中使用If語(yǔ)句和case語(yǔ)句?

Hack電子 ? 來(lái)源:IC設(shè)計(jì)er ? 2023-04-18 09:45 ? 次閱讀

在這篇文章中,我們討論了verilog中最常用的兩個(gè)結(jié)構(gòu)-if語(yǔ)句和case語(yǔ)句。

我們?cè)谏弦黄恼轮幸呀?jīng)看到了如何使用程序塊(例如 always 塊來(lái)編寫(xiě)按順序執(zhí)行的 verilog 代碼。 我們還可以在程序塊中使用許多語(yǔ)句來(lái)控制在我們的verilog設(shè)計(jì)中信號(hào)賦值的方式。

這些語(yǔ)句統(tǒng)稱(chēng)為順序語(yǔ)句。case 語(yǔ)句和 if 語(yǔ)句都是 verilog 中順序語(yǔ)句的示例。在這篇文章的其余部分,我們將討論如何在verilog中使用這兩個(gè)語(yǔ)句。

然后,我們考慮這兩個(gè)結(jié)構(gòu)的簡(jiǎn)短示例,以說(shuō)明我們?nèi)绾卧趯?shí)踐中使用它們。

Verilog If 語(yǔ)句

if 語(yǔ)句是一個(gè)條件語(yǔ)句,它使用布爾條件來(lái)確定要執(zhí)行哪些verilog代碼塊。只要條件的計(jì)算結(jié)果為 true,就會(huì)執(zhí)行與該條件關(guān)聯(lián)的代碼分支。此語(yǔ)句類(lèi)似于其他編程語(yǔ)言(如 C)中使用的 if 語(yǔ)句。

下面的 verilog 代碼片段顯示了 if 語(yǔ)句的基本語(yǔ)法。

1 if()begin
2 // Code to execute
3 end
4 elseif()begin
5 // Code to execute
6 end
7 elsebegin
8 // Code to execute
9 end

如果我們不需要 else 和 else 分支,我們可以從語(yǔ)句中刪除它們。事實(shí)上,我們已經(jīng)在關(guān)于always塊的帖子中看到了這一點(diǎn),我們?cè)谄渲惺褂?posedge 宏來(lái)檢測(cè)時(shí)鐘信號(hào)的上升沿。如果需要,我們可以包含盡可能多的其他分支,以正確建模底層電路。

if 語(yǔ)句使用布爾條件來(lái)確定要執(zhí)行的代碼行。

在上面的代碼段中,這些表達(dá)式由 給出。這些表達(dá)式按順序計(jì)算,如果表達(dá)式的計(jì)算結(jié)果為 true,則執(zhí)行與表達(dá)式關(guān)聯(lián)的代碼。 if 語(yǔ)句只有一個(gè)分支將執(zhí)行。這通常是計(jì)算結(jié)果為 true 的第一個(gè)表達(dá)式。唯一的例外情況是,當(dāng)所有表達(dá)式都不為 true 時(shí)。在這種情況下,將執(zhí)行 else 分支中的代碼。當(dāng)我們?cè)?if 語(yǔ)句代碼中省略 else 分支時(shí),在這種情況下不會(huì)執(zhí)行任何分支。

與每個(gè)分支關(guān)聯(lián)的代碼可以包含任何有效的 verilog 代碼,包括進(jìn)一步的 if 語(yǔ)句。此方法稱(chēng)為嵌套 if 語(yǔ)句。 在 verilog 中使用這種類(lèi)型的代碼時(shí),我們應(yīng)該注意限制嵌套語(yǔ)句的數(shù)量,因?yàn)樗赡軙?huì)導(dǎo)致滿(mǎn)足時(shí)間的困難。

If 語(yǔ)句示例

我們已經(jīng)看到了 if 語(yǔ)句的實(shí)際示例,當(dāng)在 verilog always塊的帖子中對(duì)觸發(fā)器進(jìn)行建模時(shí)。為了更徹底地演示此結(jié)構(gòu),讓我們考慮一個(gè)時(shí)鐘多路復(fù)用器的示例。

在本例中,我們將使用異步復(fù)位的 D 類(lèi)型觸發(fā)器來(lái)保存多路復(fù)用器的輸出。下面的電路圖顯示了我們將在本例中使用的電路。

31358a3e-dd86-11ed-bfe3-dac502259ad0.png

下面的代碼片段顯示了我們?nèi)绾问褂脝蝹€(gè) always 塊和 if 語(yǔ)句來(lái)實(shí)現(xiàn)這一點(diǎn)。

1 always@(posedgeclock,posedgereset)begin
2 if(reset)begin
3 Q <=?1'b0;
4 end
5 elsebegin
6 if(addr)begin
7 Q <= b;
8 end
9 elsebegin
10 Q <= a;
11 end
12 end
13 end

在此示例中,我們使用第一個(gè)if語(yǔ)句在復(fù)位時(shí)觸發(fā),輸出0。當(dāng)復(fù)位無(wú)效時(shí),always塊已由時(shí)鐘的上升沿觸發(fā)。我們使用第一個(gè) if 語(yǔ)句的 else 分支來(lái)被觸發(fā),我們使用第二個(gè)if語(yǔ)句來(lái)模擬多路復(fù)用電路的行為。這是 verilog 中嵌套 if 語(yǔ)句的示例。

當(dāng) addr 信號(hào)為 0b時(shí),我們使用嵌套 if 語(yǔ)句的第一個(gè)分支被觸發(fā),將輸入a賦值給輸出。然后,我們使用嵌套 if 語(yǔ)句的 else 分支來(lái)捕獲 addr信號(hào)為1b 時(shí)的情況。 我們也可以在這里使用 else-if 類(lèi)型語(yǔ)句,但 else 語(yǔ)句更簡(jiǎn)潔。這兩種情況下的行為是相同的,因?yàn)樾盘?hào)在實(shí)際電路中只能是0b或1b。

Verilog case語(yǔ)句

我們使用 verilog case 語(yǔ)句根據(jù)設(shè)計(jì)中給定信號(hào)的值選擇要執(zhí)行的代碼塊。當(dāng)我們?cè)趘erilog中編寫(xiě)語(yǔ)句時(shí),我們指定了一個(gè)要監(jiān)視和評(píng)估的輸入信號(hào)。然后將該信號(hào)的值與case語(yǔ)句的每個(gè)分支中指定的值進(jìn)行比較。找到輸入信號(hào)值的匹配項(xiàng)后,將執(zhí)行與該值關(guān)聯(lián)的分支。 verilog case語(yǔ)句執(zhí)行的功能 C語(yǔ)言中的switch語(yǔ)句相同。下面的代碼片段顯示了 verilog 中case語(yǔ)句的一般語(yǔ)法。

1 case()
2 :begin
3 // This branch executes when =
4 end
5 :begin
6 // This branch executes when =
7 end
8 default:begin
9 // This branch executes in all other cases
10 end
11 endcase

可以刪除語(yǔ)句的默認(rèn)分支,盡管這是不可取的。如果刪除默認(rèn)分支,則<變量>的所有有效值都必須具有自己的分支。與 if 語(yǔ)句一樣,與每個(gè)分支關(guān)聯(lián)的代碼可以包含任何有效的 verilog 代碼。這包括進(jìn)一步嵌套順序語(yǔ)句,例如if或case語(yǔ)句。同樣,我們應(yīng)該嘗試限制嵌套語(yǔ)句的數(shù)量,因?yàn)樗梢愿p松地滿(mǎn)足我們的計(jì)時(shí)要求。

case語(yǔ)句示例 為了更好地演示erilog中使用case語(yǔ)句的使用方式,讓我們考慮一個(gè)基本示例。在本例中,我們將介紹一個(gè)簡(jiǎn)單的四比一多路復(fù)用電路。 我們經(jīng)常使用 case 語(yǔ)句在 verilog 中對(duì)大型多路復(fù)用器進(jìn)行建模,因?yàn)樗傻拇a比基于連續(xù)賦值的實(shí)現(xiàn)更具可讀性。下面的電路圖顯示了我們將在本例中使用的電路。

下面的代碼片段顯示了我們將如何使用 case 語(yǔ)句實(shí)現(xiàn)此電路。

31493f20-dd86-11ed-bfe3-dac502259ad0.png

1 always@(*)begin
2 case(addr)
3 2'b00:begin
4 q = a;
5 end
6 2'b01:begin
7 q = b;
8 end
9 2'b10:begin
10 q = c;
11 end
12 default:begin
13 q = d;
14 end
15 endcase
16 end

此示例顯示了使用 verilog中的case語(yǔ)句對(duì)多路復(fù)用器進(jìn)行建模是多么簡(jiǎn)單。事實(shí)上,case語(yǔ)句提供了在 verilog 中對(duì)多路復(fù)用器進(jìn)行建模的最直觀方法。 雖然這個(gè)例子很簡(jiǎn)單,但有幾個(gè)要點(diǎn)我們應(yīng)該更詳細(xì)地考慮。在這個(gè)例子中首先要注意的是,我們使用阻塞賦值。這樣做的原因是我們正在對(duì)組合邏輯進(jìn)行建模,而非阻塞分配通常會(huì)導(dǎo)致在我們的設(shè)計(jì)中放置觸發(fā)器。

這里要注意的另一件事是,我們可以從此示例中刪除默認(rèn)關(guān)鍵字。然后,我們將顯式列出輸出d 值所需的 addr 值。但是,我們?cè)诖耸纠邪四J(rèn)關(guān)鍵字,以演示應(yīng)如何使用它。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110154
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1947

    瀏覽量

    34808
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2000

    瀏覽量

    61215
  • 時(shí)鐘信號(hào)
    +關(guān)注

    關(guān)注

    4

    文章

    449

    瀏覽量

    28589

原文標(biāo)題:Verilog中的If語(yǔ)句和case語(yǔ)句

文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何在bash中使用條件語(yǔ)句

    今天我們介紹一下如何在 bash 中使用條件語(yǔ)句。
    的頭像 發(fā)表于 12-09 17:27 ?2168次閱讀
    如<b class='flag-5'>何在</b>bash<b class='flag-5'>中使</b>用條件<b class='flag-5'>語(yǔ)句</b>

    verilog中g(shù)enerate語(yǔ)句的用法分享

    generate為verilog中的生成語(yǔ)句,當(dāng)對(duì)矢量中的多個(gè)位進(jìn)行重復(fù)操作時(shí),或者當(dāng)進(jìn)行多個(gè)模塊的實(shí)例引用的重復(fù)操作時(shí),或者根據(jù)參數(shù)的定義來(lái)確定程序中是否應(yīng)該包含某段Verilog代碼的時(shí)候
    發(fā)表于 12-23 16:59

    開(kāi)關(guān)語(yǔ)句和循環(huán)語(yǔ)句

    switch/case開(kāi)關(guān)語(yǔ)句是一種多分支選擇語(yǔ)句,是用來(lái)實(shí)現(xiàn)多方向條件分支的語(yǔ)句。雖然從理論上講采用條件語(yǔ)句也可以實(shí)現(xiàn)多方向條件分支,但是
    發(fā)表于 07-15 14:26 ?18次下載

    verilog中if與case語(yǔ)句不完整產(chǎn)生鎖存器的原因分析

      在很多地方都能看到,verilog中if與case語(yǔ)句必須完整,即if要加上else,case后要加上default語(yǔ)句,以防止鎖存器的
    發(fā)表于 09-16 09:29 ?24次下載

    Verilog可綜合的循環(huán)語(yǔ)句

    Verilog中提供了四種循環(huán)語(yǔ)句,可用于控制語(yǔ)句的執(zhí)行次數(shù),分別為:for,while,repeat,forever。其中,for,while,repeat是可綜合的,但循環(huán)的次數(shù)需要在編譯之前就確定,動(dòng)態(tài)改變循環(huán)次數(shù)的
    發(fā)表于 10-13 12:23 ?2w次閱讀

    FPGA代碼經(jīng)驗(yàn) case,casez,casex語(yǔ)句

    使用case語(yǔ)句代替嵌套的if-else將會(huì)產(chǎn)生更易讀的代碼,更好的邏輯利用率和更高的性能。
    的頭像 發(fā)表于 12-11 10:42 ?6298次閱讀

    CASE語(yǔ)句的執(zhí)行規(guī)則是什么?

    CASE語(yǔ)句用來(lái)選擇幾個(gè)分支程序部分之一。選擇是基于選擇表達(dá)式當(dāng)前值的。
    的頭像 發(fā)表于 10-09 09:26 ?5446次閱讀
    <b class='flag-5'>CASE</b><b class='flag-5'>語(yǔ)句</b>的執(zhí)行規(guī)則是什么?

    Verilog教程之Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式

    本文檔的主要內(nèi)容詳細(xì)介紹的是Verilog教程之Verilog HDL程序設(shè)計(jì)語(yǔ)句和描述方式。
    發(fā)表于 12-09 11:24 ?47次下載
    <b class='flag-5'>Verilog</b>教程之<b class='flag-5'>Verilog</b> HDL程序設(shè)計(jì)<b class='flag-5'>語(yǔ)句</b>和描述方式

    verilog中的initial語(yǔ)句說(shuō)明

    解釋verilog HDL中的initial語(yǔ)句的用法。
    發(fā)表于 05-31 09:11 ?0次下載

    簡(jiǎn)述Verilog HDL中阻塞語(yǔ)句和非阻塞語(yǔ)句的區(qū)別

    ? 在Verilog中有兩種類(lèi)型的賦值語(yǔ)句:阻塞賦值語(yǔ)句(“=”)和非阻塞賦值語(yǔ)句(“=”)。正確地使用這兩種賦值語(yǔ)句對(duì)于
    的頭像 發(fā)表于 12-02 18:24 ?6254次閱讀
    簡(jiǎn)述<b class='flag-5'>Verilog</b> HDL中阻塞<b class='flag-5'>語(yǔ)句</b>和非阻塞<b class='flag-5'>語(yǔ)句</b>的區(qū)別

    什么是SystemVerilog-決策語(yǔ)句-if-else語(yǔ)句?

    決策語(yǔ)句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語(yǔ)句。SystemVerilog有兩個(gè)主要的決策語(yǔ)句:if…else語(yǔ)句
    的頭像 發(fā)表于 02-09 14:15 ?1200次閱讀
    什么是SystemVerilog-決策<b class='flag-5'>語(yǔ)句</b>-if-else<b class='flag-5'>語(yǔ)句</b>?

    Verilog中的If語(yǔ)句case語(yǔ)句介紹

    。這些語(yǔ)句統(tǒng)稱(chēng)為順序語(yǔ)句case 語(yǔ)句和 if 語(yǔ)句都是 verilog 中順序
    的頭像 發(fā)表于 05-11 15:37 ?4644次閱讀
    <b class='flag-5'>Verilog</b>中的If<b class='flag-5'>語(yǔ)句</b>和<b class='flag-5'>case</b><b class='flag-5'>語(yǔ)句</b>介紹

    Verilog常用的循環(huán)語(yǔ)句及用途

    本文主要介紹verilog常用的循環(huán)語(yǔ)句,循環(huán)語(yǔ)句的用途,主要是可以多次執(zhí)行相同的代碼或邏輯。
    的頭像 發(fā)表于 05-12 18:26 ?2563次閱讀

    case后邊可以跟多個(gè)語(yǔ)句

    是的,"case" 后面可以跟多個(gè)語(yǔ)句。在編程語(yǔ)言中,"case" 通常被用于 switch 語(yǔ)句中,用于檢查一個(gè)變量或表達(dá)式是否匹配某個(gè)特定的值。當(dāng)匹配成功時(shí),可以執(zhí)行一個(gè)或多個(gè)
    的頭像 發(fā)表于 11-30 14:19 ?6901次閱讀

    java中的switch語(yǔ)句 case的取值

    Java中的switch語(yǔ)句是一種用于多重條件判斷的語(yǔ)句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在switch語(yǔ)句中,case關(guān)鍵字用來(lái)指定不同的取值。 在Java中,switch
    的頭像 發(fā)表于 11-30 16:05 ?1195次閱讀