吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog中循環語句簡介

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

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

正如我們在上一篇關于 verilog 順序語句的文章中看到的那樣,有許多語句只能在過程塊中使用。我們使用這些語句來控制在 verilog 設計中數據賦值的方式。我們可以使用的四種不同類型的循環用于設計中分配賦值的順序語句。

因此,我們只能在程序塊(例如always塊或initial塊)中編寫循環語句。在這篇文章的其余部分,我們將討論如何在verilog中使用循環語句。然后,我們為每個結構考慮一個簡短的示例,以展示我們如何在實踐中使用它們。

Verilog中的循環

我們在verilog中使用循環來多次執行相同的代碼。verilog 中最常用的循環是 for 循環。我們使用此循環來執行固定次數的代碼塊。 我們還可以在verilog中使用repeat關鍵字,它執行與for循環類似的功能。但是,我們通常更喜歡在verilog設計中使用for循環而不是repeat關鍵字。 我們在verilog中常用的另一種類型的循環是while循環。只要給定條件為真,我們就使用此循環來執行部分代碼。 讓我們仔細看看這些類型的循環。

Verilog forever循環

我們使用verilog中的forever循環來創建連續執行的代碼塊,就像其他編程語言中的無限循環一樣。這與 verilog 中的其他類型的循環形成鮮明對比,例如 for 循環和while循環,它們只運行固定次數。forever循環最常見的用例之一是在verilog測試平臺中生成時鐘信號。forever循環不能綜合,這意味著我們只能在測試臺代碼中使用它。 下面的代碼片段顯示了 verilog forever循環的一般語法。

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

forever循環示例

為了更好地演示我們如何在實踐中使用永久循環,讓我們考慮一個例子。在本例中,我們將生成一個頻率為 10MHz 的時鐘信號,我們可以在測試臺內使用該信號。為此,我們首先將信號分配給初始值。然后,我們使用永久塊定期反轉信號。 下面的代碼片段顯示了我們如何在verilog中實現這個時鐘示例。

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

關于這個例子,有兩件重要的事情要說。首先,請注意,我們使用verilog initial塊,這是過程語句的另一個示例。我們在初始塊中編寫的任何代碼都會在模擬開始時執行一次。我們幾乎總是在測試平臺代碼中使用初始塊,而不是always塊。原因是它們只執行一次,我們通常只需要運行一次測試。

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

1 `timescale 1ns / 1ps

Verilog repeat循環

我們使用repeat循環來執行給定的verilog代碼塊固定次數。我們指定代碼塊在repeat循環聲明中執行的次數。雖然我們最常在verilog測試臺中使用repeat循環,但我們也可以在可綜合的代碼中使用它。但是,我們在使用此結構綜合成代碼時必須小心,因為我們只能使用它來描述重復的結構。

下面的代碼片段顯示了verilog重復循環的一般語法

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

我們使用<數字>字段來確定repeat循環的執行次數。repeat循環與verilog中的 for循環非常相似,因為它們都執行代碼的次數固定。 這兩種類型的循環之間的主要區別在于 for 循環包含一個局部變量,我們可以在循環中引用該變量。此變量的值在循環的每次迭代中更新。相比之下,repeat循環不包括此局部循環變量。因此,在我們不需要此變量的情況下,repeat循環實際上不如for循環那么冗長。

repeat循環示例

repeat循環是一個相對直接的結構。但是,讓我們考慮一個基本示例,以更好地演示它是如何工作的。對于此示例,假設我們的設計中有一個信號,每當設計中另一個信號出現上升沿時,我們想要取反該信號,但是,我們只希望此取反操作總共有效六次。 下面的波形顯示了我們試圖在此示例循環中實現的功能。 357dc7dc-db29-11ed-bfe3-dac502259ad0.png

我們可以輕松地在repeat塊中實現這一點,如下面的代碼片段所示。

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

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

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

Verilog while循環

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

1 whilebegin
2 // Code to execute
3 end

我們使用上述構造中的 <條件> 字段來確定循環的執行何時停止。

while循環示例

為了更好地演示我們如何在verilog中使用while循環,讓我們考慮一個基本示例。對于此示例,我們將創建一個從0增加到3的整數類型變量。然后,我們在循環的每次迭代中打印此變量的值。 雖然這是一個微不足道的示例,但它演示了while循環的基本原理。 下面的代碼片段顯示了我們將如何實現此示例。

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

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

Verilog For循環

在編寫verilog代碼時,我們使用for循環來執行固定次數的代碼塊。與while循環一樣,只要給定條件為真,for循環就會執行。在循環的每次迭代之前計算指定的條件。我們將此條件指定為 for循環聲明的一部分。此條件用于控制循環的執行次數。 雖然它通常用于測試平臺,但我們也可以在可綜合的verilog代碼中使用for循環。 當我們在可綜合代碼中使用for循環時,我們通常使用它來復制硬件的各個部分。最常見的例子之一是移位寄存器。 正如我們前面提到的,for循環與rep循環非常相似。主要區別在于for循環使用可以在我們的循環代碼中使用的局部變量。

下面的代碼片段顯示了我們在 verilog for循環中使用的語法。

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

我們使用 字段來設置循環變量的初始值。我們必須聲明我們在循環中使用的變量,然后才能在代碼中使用它。字段是條件語句,用于確定循環運行的次數for循環將繼續執行,直到此字段的計算結果為 false。我們使用<增量>字段來確定循環變量在每次循環迭代中的更新方式

for循環示例

為了更好地演示我們如何在verilog中使用for循環,讓我們考慮一個基本示例。在本例中,我們將使用verilog for循環編寫一個簡單的四位串行移位寄存器。實現移位寄存器實際上是for循環最常見的用例之一。 移位寄存器可以使用簡單的verilog陣列來實現。然后,我們可以將移位寄存器的輸入分配給數組的第一個元素。然后,我們使用for循環將數組的現有內容向左移動一個位置。

下面的 verilog 代碼片段顯示了我們將如何使用for循環實現此移位寄存器。

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

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

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110391
  • 時鐘
    +關注

    關注

    11

    文章

    1746

    瀏覽量

    131799
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69046
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49284
  • 循環語句
    +關注

    關注

    0

    文章

    10

    瀏覽量

    4907

原文標題:Verilog中循環語句簡介

文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    veriloggenerate語句的用法分享

    generate為verilog的生成語句,當對矢量的多個位進行重復操作時,或者當進行多個模塊的實例引用的重復操作時,或者根據參數的定義來確定程序
    發表于 12-23 16:59

    Java的循環語句的詳細資料說明

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

    Verilog可綜合的循環語句

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

    Verilog教程之Verilog HDL程序設計語句和描述方式

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

    簡述HDL循環語句的可綜合性

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

    verilog的initial語句說明

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

    簡述Verilog HDL阻塞語句和非阻塞語句的區別

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

    Verilog邏輯設計循環語句和運算符

    “ 本文主要分享了在Verilog設計過程中一些經驗與知識點,主要包括循環語句(forever、repeat、while和for)、運算符。”
    的頭像 發表于 03-15 11:41 ?5293次閱讀

    什么是python break語句-終止循環

    循環的過程如果要退出循環,我們可以用break語句和continue語句
    的頭像 發表于 02-23 11:17 ?2591次閱讀

    Verilog的If語句和case語句介紹

    我們在上一篇文章已經看到了如何使用程序塊(例如 always 塊來編寫按順序執行的 verilog 代碼。 我們還可以在程序塊中使用許多語句來控制在我們的verilog設計中信
    的頭像 發表于 05-11 15:37 ?4748次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>中</b>的If<b class='flag-5'>語句</b>和case<b class='flag-5'>語句</b>介紹

    Python的循環語句介紹

    哈嘍大家好,我是知道。今天帶大家了解下Python的循環語句 定義循環語句允許我們執行一個語句語句
    的頭像 發表于 05-11 17:39 ?962次閱讀

    Verilog常用的循環語句及用途

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

    MATLAB條件語句循環結構的使用方式

    MATLAB提供了多種條件語句循環結構。
    的頭像 發表于 07-05 09:41 ?4319次閱讀

    verilogfor循環是串行執行還是并行執行

    的for循環也是并行執行的。 Verilog的for循環可以用來實現重復的操作,例如在一個時鐘周期中對多個電路進行操作。在循環內部,多個
    的頭像 發表于 02-22 16:06 ?3139次閱讀

    verilogrepeat必須用begin和end嗎

    Verilog,repeat語句不需要使用begin和end塊。repeat語句是一種循環控制語句
    的頭像 發表于 02-23 10:14 ?1315次閱讀
    百家乐官网博彩博彩网| 金博士百家乐官网的玩法技巧和规则| 百家乐官网网上赌场| 百家乐注册送彩金平台| 百家乐存200送200| 真人娱乐城源码| E乐博百家乐官网现金网| 属马的和属猴的在一起做生意好吗| 百家乐马宝| 德州扑克胜率| 百家乐官网百乐发破解版| 网络百家乐开户网| 菲律宾太阳城官方网| 百家乐官网出老千视频| 保时捷百家乐娱乐城| 德州扑克怎么发牌| 爱赢娱乐城| 网络百家乐官网公式打法| 澳门百家乐几副牌| 棋牌室| 百家乐官网冲动| 豪华百家乐人桌| 香港六合彩85期开奖结果| 百家乐官网和的几率| 百家乐官网最低压多少| 乐九百家乐娱乐城| 威尼斯人娱乐网注册送38元彩金| 百家乐官网所有技巧| 大丰收百家乐官网的玩法技巧和规则 | 澳门百家乐怎么赢钱| 上海二八杠分析仪| 百家乐官网概率下注法| 广州百家乐官网娱乐场| 百家乐网址多少| 现金网系统出租| 澳门百家乐官网下三路| 百家乐赌博现金网平台排名| 六合彩特码开奖结果| 百家乐官网赌博规| 威尼斯人娱乐网最新地址| 带百家乐官网的时时彩平台|