在這篇文章中,我們討論了可以在verilog中使用的不同類型的循環(huán)- for循環(huán),while循環(huán),forever循環(huán)和repeat循環(huán)。
正如我們在上一篇關(guān)于 verilog 順序語句的文章中看到的那樣,有許多語句只能在過程塊中使用。我們使用這些語句來控制在 verilog 設(shè)計中數(shù)據(jù)賦值的方式。我們可以使用的四種不同類型的循環(huán)用于設(shè)計中分配賦值的順序語句。
因此,我們只能在程序塊(例如always塊或initial塊)中編寫循環(huán)語句。在這篇文章的其余部分,我們將討論如何在verilog中使用循環(huán)語句。然后,我們?yōu)槊總€結(jié)構(gòu)考慮一個簡短的示例,以展示我們?nèi)绾卧趯嵺`中使用它們。
Verilog中的循環(huán)
我們在verilog中使用循環(huán)來多次執(zhí)行相同的代碼。verilog 中最常用的循環(huán)是 for 循環(huán)。我們使用此循環(huán)來執(zhí)行固定次數(shù)的代碼塊。 我們還可以在verilog中使用repeat關(guān)鍵字,它執(zhí)行與for循環(huán)類似的功能。但是,我們通常更喜歡在verilog設(shè)計中使用for循環(huán)而不是repeat關(guān)鍵字。 我們在verilog中常用的另一種類型的循環(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)形成鮮明對比,例如 for 循環(huán)和while循環(huán),它們只運行固定次數(shù)。forever循環(huán)最常見的用例之一是在verilog測試平臺中生成時鐘信號。forever循環(huán)不能綜合,這意味著我們只能在測試臺代碼中使用它。 下面的代碼片段顯示了 verilog forever循環(huán)的一般語法。
1 | foreverbegin |
2 | // Code to be executed by the loop goes here |
3 | end |
forever循環(huán)示例
為了更好地演示我們?nèi)绾卧趯嵺`中使用永久循環(huán),讓我們考慮一個例子。在本例中,我們將生成一個頻率為 10MHz 的時鐘信號,我們可以在測試臺內(nèi)使用該信號。為此,我們首先將信號分配給初始值。然后,我們使用永久塊定期反轉(zhuǎn)信號。 下面的代碼片段顯示了我們?nèi)绾卧趘erilog中實現(xiàn)這個時鐘示例。
1 | initialbegin |
2 | clk =1'b0; |
3 | foreverbegin |
4 | #500clk = ~clk; |
5 | end |
6 | end |
關(guān)于這個例子,有兩件重要的事情要說。首先,請注意,我們使用verilog initial塊,這是過程語句的另一個示例。我們在初始塊中編寫的任何代碼都會在模擬開始時執(zhí)行一次。我們幾乎總是在測試平臺代碼中使用初始塊,而不是always塊。原因是它們只執(zhí)行一次,我們通常只需要運行一次測試。
這里要注意的另一件重要事情是使用 # 符號在 verilog 中對時間延遲進(jìn)行建模。為了使此示例正常工作,我們需要在代碼中包含 verilog 時間刻度編譯器指令。我們使用時間刻度編譯器指令來指定模擬的時間單位和分辨率。在這種情況下,我們需要將時間單位設(shè)置為 ns,如下面的代碼片段所示。
1 | `timescale 1ns / 1ps |
Verilog repeat循環(huán)
我們使用repeat循環(huán)來執(zhí)行給定的verilog代碼塊固定次數(shù)。我們指定代碼塊在repeat循環(huán)聲明中執(zhí)行的次數(shù)。雖然我們最常在verilog測試臺中使用repeat循環(huán),但我們也可以在可綜合的代碼中使用它。但是,我們在使用此結(jié)構(gòu)綜合成代碼時必須小心,因為我們只能使用它來描述重復(fù)的結(jié)構(gòu)。
下面的代碼片段顯示了verilog重復(fù)循環(huán)的一般語法
1 |
repeat( |
2 | // Code to be executed in the loop |
3 | end |
我們使用<數(shù)字>字段來確定repeat循環(huán)的執(zhí)行次數(shù)。repeat循環(huán)與verilog中的 for循環(huán)非常相似,因為它們都執(zhí)行代碼的次數(shù)固定。 這兩種類型的循環(huán)之間的主要區(qū)別在于 for 循環(huán)包含一個局部變量,我們可以在循環(huán)中引用該變量。此變量的值在循環(huán)的每次迭代中更新。相比之下,repeat循環(huán)不包括此局部循環(huán)變量。因此,在我們不需要此變量的情況下,repeat循環(huán)實際上不如for循環(huán)那么冗長。
repeat循環(huán)示例
repeat循環(huán)是一個相對直接的結(jié)構(gòu)。但是,讓我們考慮一個基本示例,以更好地演示它是如何工作的。對于此示例,假設(shè)我們的設(shè)計中有一個信號,每當(dāng)設(shè)計中另一個信號出現(xiàn)上升沿時,我們想要取反該信號,但是,我們只希望此取反操作總共有效六次。 下面的波形顯示了我們試圖在此示例循環(huán)中實現(xiàn)的功能。
我們可以輕松地在repeat塊中實現(xiàn)這一點,如下面的代碼片段所示。
1 | repeat(6)begin |
2 | @(posedgesig_a) |
3 | sig_b = ~sig_b; |
4 | end |
我們可以在這個例子中看到,我們已將<數(shù)字>字段設(shè)置為 6。因此,repeat循環(huán)在終止之前總共將運行六次。然后,我們使用我們在verilog always塊的帖子中討論的posedge宏。此宏告訴我們代碼中sig_a信號何時出現(xiàn)上升沿。在verilog中,我們使用@符號來告訴我們的代碼等待事件發(fā)生。這僅意味著代碼將在此行暫停并等待括號中的條件評估為 true。一旦發(fā)生這種情況,代碼將繼續(xù)運行。 在此示例中,我們使用此運算符來阻止repeat循環(huán)的執(zhí)行,直到在sig_a信號上檢測到上升沿。 最后,我們可以使用非verilog位運算符(~)在檢測到上升沿時反轉(zhuǎn)sig_b信號。 下面的波形顯示了該代碼的仿真結(jié)果。
Verilog while循環(huán)
我們使用while循環(huán)來執(zhí)行verilog代碼的一部分,只要給定條件為真。在循環(huán)的每次迭代之前計算指定的條件。因此,塊中的所有代碼都將在每次有效的迭代中執(zhí)行。 即使條件發(fā)生更改,在塊中的代碼運行時不再計算為true,也會發(fā)生這種情況。我們可以將 while循環(huán)視為重復(fù)執(zhí)行的if語句。 由于循環(huán)通常不可綜合,因此我們經(jīng)常在測試平臺中使用它們來產(chǎn)生激勵。 下面的代碼片段顯示了verilog中while循環(huán)的一般語法。
1 |
while |
2 | // Code to execute |
3 | end |
我們使用上述構(gòu)造中的 <條件> 字段來確定循環(huán)的執(zhí)行何時停止。
while循環(huán)示例
為了更好地演示我們?nèi)绾卧趘erilog中使用while循環(huán),讓我們考慮一個基本示例。對于此示例,我們將創(chuàng)建一個從0增加到3的整數(shù)類型變量。然后,我們在循環(huán)的每次迭代中打印此變量的值。 雖然這是一個微不足道的示例,但它演示了while循環(huán)的基本原理。 下面的代碼片段顯示了我們將如何實現(xiàn)此示例。
1 | while(iter 4)?begin |
2 | $display("iter = %0d", iter); |
3 | iter = iter +1; |
4 | end |
此示例假定已聲明iter變量并為其分配初始值0。在循環(huán)的每次迭代中,循環(huán)體中的第二行代碼都會遞增iter變量。 在此示例中設(shè)置了 <條件> 字段,以便僅在iter變量小于4時執(zhí)行循環(huán)。因此,迭代變量在此循環(huán)中從0遞增到3。
Verilog For循環(huán)
在編寫verilog代碼時,我們使用for循環(huán)來執(zhí)行固定次數(shù)的代碼塊。與while循環(huán)一樣,只要給定條件為真,for循環(huán)就會執(zhí)行。在循環(huán)的每次迭代之前計算指定的條件。我們將此條件指定為 for循環(huán)聲明的一部分。此條件用于控制循環(huán)的執(zhí)行次數(shù)。 雖然它通常用于測試平臺,但我們也可以在可綜合的verilog代碼中使用for循環(huán)。 當(dāng)我們在可綜合代碼中使用for循環(huán)時,我們通常使用它來復(fù)制硬件的各個部分。最常見的例子之一是移位寄存器。 正如我們前面提到的,for循環(huán)與rep循環(huán)非常相似。主要區(qū)別在于for循環(huán)使用可以在我們的循環(huán)代碼中使用的局部變量。
下面的代碼片段顯示了我們在 verilog for循環(huán)中使用的語法。
1 |
for( |
2 | // Code to execute |
3 | end |
我們使用
for循環(huán)示例
為了更好地演示我們?nèi)绾卧趘erilog中使用for循環(huán),讓我們考慮一個基本示例。在本例中,我們將使用verilog for循環(huán)編寫一個簡單的四位串行移位寄存器。實現(xiàn)移位寄存器實際上是for循環(huán)最常見的用例之一。 移位寄存器可以使用簡單的verilog陣列來實現(xiàn)。然后,我們可以將移位寄存器的輸入分配給數(shù)組的第一個元素。然后,我們使用for循環(huán)將數(shù)組的現(xiàn)有內(nèi)容向左移動一個位置。
下面的 verilog 代碼片段顯示了我們將如何使用for循環(huán)實現(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 4; i = i +?1)?begin |
6 | shift[i] <= shift[i-1]; |
7 | end |
在此代碼中要注意的第一件事是,我們使用循環(huán)變量(i)來引用循環(huán)中數(shù)組的元素。在代碼中使用它之前,我們必須聲明這個循環(huán)變量。 由于我們的移位數(shù)組有四個位,我們設(shè)置
-
Verilog
+關(guān)注
關(guān)注
29文章
1367瀏覽量
112319 -
時鐘
+關(guān)注
關(guān)注
11文章
1902瀏覽量
133254 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70794 -
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50245 -
循環(huán)語句
+關(guān)注
關(guān)注
0文章
10瀏覽量
5000
原文標(biāo)題:Verilog中循環(huán)語句簡介
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
verilog中generate語句的用法分享
Java的循環(huán)語句的詳細(xì)資料說明

Verilog可綜合的循環(huán)語句
Verilog教程之Verilog HDL程序設(shè)計語句和描述方式

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

Verilog邏輯設(shè)計中的循環(huán)語句和運算符
什么是python break語句-終止循環(huán)
Verilog中的If語句和case語句介紹

評論