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

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

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

Verilog中循環(huán)語句簡(jiǎn)介

Hack電子 ? 來源:Hack電子 ? 2023-04-15 09:19 ? 次閱讀

在這篇文章中,我們討論了可以在verilog中使用的不同類型的循環(huán)- for循環(huán),while循環(huán),forever循環(huán)和repeat循環(huán)。

正如我們?cè)谏弦黄P(guān)于 verilog 順序語句的文章中看到的那樣,有許多語句只能在過程塊中使用。我們使用這些語句來控制在 verilog 設(shè)計(jì)中數(shù)據(jù)賦值的方式。我們可以使用的四種不同類型的循環(huán)用于設(shè)計(jì)中分配賦值的順序語句。

因此,我們只能在程序塊(例如always塊或initial塊)中編寫循環(huán)語句。在這篇文章的其余部分,我們將討論如何在verilog中使用循環(huán)語句。然后,我們?yōu)槊總€(gè)結(jié)構(gòu)考慮一個(gè)簡(jiǎn)短的示例,以展示我們?nèi)绾卧趯?shí)踐中使用它們。

Verilog中的循環(huán)

我們?cè)趘erilog中使用循環(huán)來多次執(zhí)行相同的代碼。verilog 中最常用的循環(huán)是 for 循環(huán)。我們使用此循環(huán)來執(zhí)行固定次數(shù)的代碼塊。 我們還可以在verilog中使用repeat關(guān)鍵字,它執(zhí)行與for循環(huán)類似的功能。但是,我們通常更喜歡在verilog設(shè)計(jì)中使用for循環(huán)而不是repeat關(guān)鍵字。 我們?cè)趘erilog中常用的另一種類型的循環(huán)是while循環(huán)。只要給定條件為真,我們就使用此循環(huán)來執(zhí)行部分代碼。 讓我們仔細(xì)看看這些類型的循環(huán)。

Verilog forever循環(huán)

我們使用verilog中的forever循環(huán)來創(chuàng)建連續(xù)執(zhí)行的代碼塊,就像其他編程語言中的無限循環(huán)一樣。這與 verilog 中的其他類型的循環(huán)形成鮮明對(duì)比,例如 for 循環(huán)和while循環(huán),它們只運(yùn)行固定次數(shù)。forever循環(huán)最常見的用例之一是在verilog測(cè)試平臺(tái)中生成時(shí)鐘信號(hào)。forever循環(huán)不能綜合,這意味著我們只能在測(cè)試臺(tái)代碼中使用它。 下面的代碼片段顯示了 verilog forever循環(huán)的一般語法。

1 foreverbegin
2 // Code to be executed by the loop goes here
3 end

forever循環(huán)示例

為了更好地演示我們?nèi)绾卧趯?shí)踐中使用永久循環(huán),讓我們考慮一個(gè)例子。在本例中,我們將生成一個(gè)頻率為 10MHz 的時(shí)鐘信號(hào),我們可以在測(cè)試臺(tái)內(nèi)使用該信號(hào)。為此,我們首先將信號(hào)分配給初始值。然后,我們使用永久塊定期反轉(zhuǎn)信號(hào)。 下面的代碼片段顯示了我們?nèi)绾卧趘erilog中實(shí)現(xiàn)這個(gè)時(shí)鐘示例。

1 initialbegin
2 clk =1'b0;
3 foreverbegin
4 #500clk = ~clk;
5 end
6 end

關(guān)于這個(gè)例子,有兩件重要的事情要說。首先,請(qǐng)注意,我們使用verilog initial塊,這是過程語句的另一個(gè)示例。我們?cè)诔跏級(jí)K中編寫的任何代碼都會(huì)在模擬開始時(shí)執(zhí)行一次。我們幾乎總是在測(cè)試平臺(tái)代碼中使用初始?jí)K,而不是always塊。原因是它們只執(zhí)行一次,我們通常只需要運(yùn)行一次測(cè)試。

這里要注意的另一件重要事情是使用 # 符號(hào)在 verilog 中對(duì)時(shí)間延遲進(jìn)行建模。為了使此示例正常工作,我們需要在代碼中包含 verilog 時(shí)間刻度編譯器指令。我們使用時(shí)間刻度編譯器指令來指定模擬的時(shí)間單位和分辨率。在這種情況下,我們需要將時(shí)間單位設(shè)置為 ns,如下面的代碼片段所示。

1 `timescale 1ns / 1ps

Verilog repeat循環(huán)

我們使用repeat循環(huán)來執(zhí)行給定的verilog代碼塊固定次數(shù)。我們指定代碼塊在repeat循環(huán)聲明中執(zhí)行的次數(shù)。雖然我們最常在verilog測(cè)試臺(tái)中使用repeat循環(huán),但我們也可以在可綜合的代碼中使用它。但是,我們?cè)谑褂么私Y(jié)構(gòu)綜合成代碼時(shí)必須小心,因?yàn)槲覀冎荒苁褂盟鼇砻枋鲋貜?fù)的結(jié)構(gòu)。

下面的代碼片段顯示了verilog重復(fù)循環(huán)的一般語法

1 repeat()begin
2 // Code to be executed in the loop
3 end

我們使用<數(shù)字>字段來確定repeat循環(huán)的執(zhí)行次數(shù)。repeat循環(huán)與verilog中的 for循環(huán)非常相似,因?yàn)樗鼈兌紙?zhí)行代碼的次數(shù)固定。 這兩種類型的循環(huán)之間的主要區(qū)別在于 for 循環(huán)包含一個(gè)局部變量,我們可以在循環(huán)中引用該變量。此變量的值在循環(huán)的每次迭代中更新。相比之下,repeat循環(huán)不包括此局部循環(huán)變量。因此,在我們不需要此變量的情況下,repeat循環(huán)實(shí)際上不如for循環(huán)那么冗長(zhǎng)。

repeat循環(huán)示例

repeat循環(huán)是一個(gè)相對(duì)直接的結(jié)構(gòu)。但是,讓我們考慮一個(gè)基本示例,以更好地演示它是如何工作的。對(duì)于此示例,假設(shè)我們的設(shè)計(jì)中有一個(gè)信號(hào),每當(dāng)設(shè)計(jì)中另一個(gè)信號(hào)出現(xiàn)上升沿時(shí),我們想要取反該信號(hào),但是,我們只希望此取反操作總共有效六次。 下面的波形顯示了我們?cè)噲D在此示例循環(huán)中實(shí)現(xiàn)的功能。 357dc7dc-db29-11ed-bfe3-dac502259ad0.png

我們可以輕松地在repeat塊中實(shí)現(xiàn)這一點(diǎn),如下面的代碼片段所示。

1 repeat(6)begin
2 @(posedgesig_a)
3 sig_b = ~sig_b;
4 end

我們可以在這個(gè)例子中看到,我們已將<數(shù)字>字段設(shè)置為 6。因此,repeat循環(huán)在終止之前總共將運(yùn)行六次。然后,我們使用我們?cè)趘erilog always塊的帖子中討論的posedge宏。此宏告訴我們代碼中sig_a信號(hào)何時(shí)出現(xiàn)上升沿。在verilog中,我們使用@符號(hào)來告訴我們的代碼等待事件發(fā)生。這僅意味著代碼將在此行暫停并等待括號(hào)中的條件評(píng)估為 true。一旦發(fā)生這種情況,代碼將繼續(xù)運(yùn)行。 在此示例中,我們使用此運(yùn)算符來阻止repeat循環(huán)的執(zhí)行,直到在sig_a信號(hào)上檢測(cè)到上升沿。 最后,我們可以使用非verilog位運(yùn)算符(~)在檢測(cè)到上升沿時(shí)反轉(zhuǎn)sig_b信號(hào)。 下面的波形顯示了該代碼的仿真結(jié)果。

358cfd6a-db29-11ed-bfe3-dac502259ad0.png

Verilog while循環(huán)

我們使用while循環(huán)來執(zhí)行verilog代碼的一部分,只要給定條件為真。在循環(huán)的每次迭代之前計(jì)算指定的條件。因此,塊中的所有代碼都將在每次有效的迭代中執(zhí)行。 即使條件發(fā)生更改,在塊中的代碼運(yùn)行時(shí)不再計(jì)算為true,也會(huì)發(fā)生這種情況。我們可以將 while循環(huán)視為重復(fù)執(zhí)行的if語句。 由于循環(huán)通常不可綜合,因此我們經(jīng)常在測(cè)試平臺(tái)中使用它們來產(chǎn)生激勵(lì)。 下面的代碼片段顯示了verilog中while循環(huán)的一般語法。

1 whilebegin
2 // Code to execute
3 end

我們使用上述構(gòu)造中的 <條件> 字段來確定循環(huán)的執(zhí)行何時(shí)停止。

while循環(huán)示例

為了更好地演示我們?nèi)绾卧趘erilog中使用while循環(huán),讓我們考慮一個(gè)基本示例。對(duì)于此示例,我們將創(chuàng)建一個(gè)從0增加到3的整數(shù)類型變量。然后,我們?cè)谘h(huán)的每次迭代中打印此變量的值。 雖然這是一個(gè)微不足道的示例,但它演示了while循環(huán)的基本原理。 下面的代碼片段顯示了我們將如何實(shí)現(xiàn)此示例。

1 while(iter
2 $display("iter = %0d", iter);
3 iter = iter +1;
4 end

此示例假定已聲明iter變量并為其分配初始值0。在循環(huán)的每次迭代中,循環(huán)體中的第二行代碼都會(huì)遞增iter變量。 在此示例中設(shè)置了 <條件> 字段,以便僅在iter變量小于4時(shí)執(zhí)行循環(huán)。因此,迭代變量在此循環(huán)中從0遞增到3。

Verilog For循環(huán)

在編寫verilog代碼時(shí),我們使用for循環(huán)來執(zhí)行固定次數(shù)的代碼塊。與while循環(huán)一樣,只要給定條件為真,for循環(huán)就會(huì)執(zhí)行。在循環(huán)的每次迭代之前計(jì)算指定的條件。我們將此條件指定為 for循環(huán)聲明的一部分。此條件用于控制循環(huán)的執(zhí)行次數(shù)。 雖然它通常用于測(cè)試平臺(tái),但我們也可以在可綜合的verilog代碼中使用for循環(huán)。 當(dāng)我們?cè)诳删C合代碼中使用for循環(huán)時(shí),我們通常使用它來復(fù)制硬件的各個(gè)部分。最常見的例子之一是移位寄存器。 正如我們前面提到的,for循環(huán)與rep循環(huán)非常相似。主要區(qū)別在于for循環(huán)使用可以在我們的循環(huán)代碼中使用的局部變量。

下面的代碼片段顯示了我們?cè)?verilog for循環(huán)中使用的語法。

1 for(; ; )begin
2 // Code to execute
3 end

我們使用 字段來設(shè)置循環(huán)變量的初始值。我們必須聲明我們?cè)谘h(huán)中使用的變量,然后才能在代碼中使用它。字段是條件語句,用于確定循環(huán)運(yùn)行的次數(shù)。for循環(huán)將繼續(xù)執(zhí)行,直到此字段的計(jì)算結(jié)果為 false。我們使用<增量>字段來確定循環(huán)變量在每次循環(huán)迭代中的更新方式。

for循環(huán)示例

為了更好地演示我們?nèi)绾卧趘erilog中使用for循環(huán),讓我們考慮一個(gè)基本示例。在本例中,我們將使用verilog for循環(huán)編寫一個(gè)簡(jiǎn)單的四位串行移位寄存器。實(shí)現(xiàn)移位寄存器實(shí)際上是for循環(huán)最常見的用例之一。 移位寄存器可以使用簡(jiǎn)單的verilog陣列來實(shí)現(xiàn)。然后,我們可以將移位寄存器的輸入分配給數(shù)組的第一個(gè)元素。然后,我們使用for循環(huán)將數(shù)組的現(xiàn)有內(nèi)容向左移動(dòng)一個(gè)位置。

下面的 verilog 代碼片段顯示了我們將如何使用for循環(huán)實(shí)現(xiàn)此移位寄存器。

1 // The circuit input goes into the first register
2 shift[0] <= circuit_in;
3
4 // A for loop to shift the contents of the register
5 for(i =1; i
6 shift[i] <= shift[i-1];
7 end

在此代碼中要注意的第一件事是,我們使用循環(huán)變量(i)來引用循環(huán)中數(shù)組的元素。在代碼中使用它之前,我們必須聲明這個(gè)循環(huán)變量。 由于我們的移位數(shù)組有四個(gè)位,我們?cè)O(shè)置字段,以便循環(huán)僅在循環(huán)變量 (i) 小于4時(shí)才執(zhí)行循環(huán)。 最后,我們?cè)O(shè)置 <增量> 字段,以便循環(huán)變量在每次迭代中遞增1。這允許我們迭代數(shù)組中的每個(gè)元素。 在此示例中,我們使用非阻塞分配。原因是移位寄存器是時(shí)序邏輯電路的一個(gè)例子。因此,我們必須在時(shí)鐘Verilog always塊中編寫此代碼,以正確建模移位寄存器。

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

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110107
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1734

    瀏覽量

    131490
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49134
  • 循環(huán)語句
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    4873

原文標(biāo)題:Verilog中循環(huán)語句簡(jiǎn)介

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    veriloggenerate語句的用法分享

    generate為verilog的生成語句,當(dāng)對(duì)矢量的多個(gè)位進(jìn)行重復(fù)操作時(shí),或者當(dāng)進(jìn)行多個(gè)模塊的實(shí)例引用的重復(fù)操作時(shí),或者根據(jù)參數(shù)的定義來確定程序
    發(fā)表于 12-23 16:59

    Java的循環(huán)語句的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Java的循環(huán)語句的詳細(xì)資料說明包括了:1、while循環(huán)語句,2、do…while循環(huán)
    發(fā)表于 03-22 08:00 ?0次下載
    Java的<b class='flag-5'>循環(huán)</b><b class='flag-5'>語句</b>的詳細(xì)資料說明

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

    Verilog中提供了四種循環(huán)語句,可用于控制語句的執(zhí)行次數(shù),分別為:for,while,repeat,forever。其中,for,while,repeat是可綜合的,但
    發(fā)表于 10-13 12:23 ?2w次閱讀

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

    本文檔的主要內(nèi)容詳細(xì)介紹的是Verilog教程之Verilog HDL程序設(shè)計(jì)語句和描述方式。
    發(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'>語句</b>和描述方式

    簡(jiǎn)述HDL循環(huán)語句的可綜合性

    在HDL的循環(huán)語句中,在指定的循環(huán)過程,其代碼塊(循環(huán)體)輸出同名信號(hào),則構(gòu)成順序-循環(huán)(SA
    的頭像 發(fā)表于 05-12 09:27 ?2176次閱讀
    簡(jiǎn)述HDL<b class='flag-5'>中</b><b class='flag-5'>循環(huán)</b><b class='flag-5'>語句</b>的可綜合性

    verilog的initial語句說明

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

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

    阻塞賦值,但從字面意思來看,阻塞就是執(zhí)行的時(shí)候在某個(gè)地方卡住了,等這個(gè)操作執(zhí)行完在繼續(xù)執(zhí)行下面的語句,而非阻塞就是不管執(zhí)行完沒有,我不管執(zhí)行的結(jié)果是什么,反正我繼續(xù)下面的事情。而Verilog的阻塞賦值與非阻塞賦值正好也是這個(gè)
    的頭像 發(fā)表于 12-02 18:24 ?6223次閱讀
    簡(jiǎn)述<b class='flag-5'>Verilog</b> HDL<b class='flag-5'>中</b>阻塞<b class='flag-5'>語句</b>和非阻塞<b class='flag-5'>語句</b>的區(qū)別

    Verilog邏輯設(shè)計(jì)循環(huán)語句和運(yùn)算符

    “ 本文主要分享了在Verilog設(shè)計(jì)過程中一些經(jīng)驗(yàn)與知識(shí)點(diǎn),主要包括循環(huán)語句(forever、repeat、while和for)、運(yùn)算符?!?/div>
    的頭像 發(fā)表于 03-15 11:41 ?5229次閱讀

    什么是python break語句-終止循環(huán)

    循環(huán)的過程如果要退出循環(huán),我們可以用break語句和continue語句。
    的頭像 發(fā)表于 02-23 11:17 ?2522次閱讀

    Verilog的If語句和case語句介紹

    我們?cè)谏弦黄恼?b class='flag-5'>中已經(jīng)看到了如何使用程序塊(例如 always 塊來編寫按順序執(zhí)行的 verilog 代碼。 我們還可以在程序塊中使用許多語句來控制在我們的verilog設(shè)計(jì)中信
    的頭像 發(fā)表于 05-11 15:37 ?4566次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>中</b>的If<b class='flag-5'>語句</b>和case<b class='flag-5'>語句</b>介紹

    Python的循環(huán)語句介紹

    哈嘍大家好,我是知道。今天帶大家了解下Python的循環(huán)語句 定義循環(huán)語句允許我們執(zhí)行一個(gè)語句語句
    的頭像 發(fā)表于 05-11 17:39 ?908次閱讀

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

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

    MATLAB條件語句循環(huán)結(jié)構(gòu)的使用方式

    MATLAB提供了多種條件語句循環(huán)結(jié)構(gòu)。
    的頭像 發(fā)表于 07-05 09:41 ?4237次閱讀

    verilogfor循環(huán)是串行執(zhí)行還是并行執(zhí)行

    的for循環(huán)也是并行執(zhí)行的。 Verilog的for循環(huán)可以用來實(shí)現(xiàn)重復(fù)的操作,例如在一個(gè)時(shí)鐘周期中對(duì)多個(gè)電路進(jìn)行操作。在循環(huán)內(nèi)部,多個(gè)
    的頭像 發(fā)表于 02-22 16:06 ?2933次閱讀

    verilogrepeat必須用begin和end嗎

    Verilog,repeat語句不需要使用begin和end塊。repeat語句是一種循環(huán)控制語句
    的頭像 發(fā)表于 02-23 10:14 ?1221次閱讀