Verilog語(yǔ)言的循環(huán)語(yǔ)句示例詳解
關(guān)鍵詞:while, for, repeat, forever
Verilog 循環(huán)語(yǔ)句有 4 種類(lèi)型,分別是 while,for,repeat,和 forever 循環(huán)。循環(huán)語(yǔ)句只能在 always 或 initial 塊中使用,但可以包含延遲表達(dá)式。
while 循環(huán)
while 循環(huán)語(yǔ)法格式如下:
while (condition) begin … end
while 循環(huán)中止條件為 condition 為假。
如果開(kāi)始執(zhí)行到 while 循環(huán)時(shí) condition 已經(jīng)為假,那么循環(huán)語(yǔ)句一次也不會(huì)執(zhí)行。
當(dāng)然,執(zhí)行語(yǔ)句只有一條時(shí),關(guān)鍵字 begin 與 end 可以省略。
下面代碼執(zhí)行時(shí),counter 執(zhí)行了 11 次。
`timescale 1ns/1ns module test ; reg [3:0] counter ; initial begin counter = 'b0 ; while (counter<=10) begin #10 ; counter = counter + 1'b1 ; end end //stop the simulation always begin #10 ; if ($time >= 1000) $finish ; end endmodule
for 循環(huán)
for 循環(huán)語(yǔ)法格式如下:
for(initial_assignment; condition ; step_assignment) begin … end
initial_assignment 為初始條件。
condition 為終止條件,condition 為假時(shí),立即跳出循環(huán)。
step_assignment 為改變控制變量的過(guò)程賦值語(yǔ)句,通常為增加或減少循環(huán)變量計(jì)數(shù)。
一般來(lái)說(shuō),因?yàn)槌跏紬l件和自加操作等過(guò)程都已經(jīng)包含在 for 循環(huán)中,所以 for 循環(huán)寫(xiě)法比 while 更為緊湊,但也不是所有的情況下都能使用 for 循環(huán)來(lái)代替 while 循環(huán)。
下面 for 循環(huán)的例子,實(shí)現(xiàn)了與 while 循環(huán)中例子一樣的效果。需要注意的是,i = i + 1 不能像 C 語(yǔ)言那樣寫(xiě)成 i++ 的形式,i = i -1 也不能寫(xiě)成 i -- 的形式。
// for 循環(huán)語(yǔ)句 integer i ; reg [3:0] counter2 ; initial begin counter2 = 'b0 ; for (i=0; i<=10; i=i+1) begin #10 ; counter2 = counter2 + 1'b1 ; end end
repeat 循環(huán)
repeat 循環(huán)語(yǔ)法格式如下:
repeat (loop_times) begin … end
repeat 的功能是執(zhí)行固定次數(shù)的循環(huán),它不能像 while 循環(huán)那樣用一個(gè)邏輯表達(dá)式來(lái)確定循環(huán)是否繼續(xù)執(zhí)行。repeat 循環(huán)的次數(shù)必須是一個(gè)常量、變量或信號(hào)。如果循環(huán)次數(shù)是變量信號(hào),則循環(huán)次數(shù)是開(kāi)始執(zhí)行 repeat 循環(huán)時(shí)變量信號(hào)的值。即便執(zhí)行期間,循環(huán)次數(shù)代表的變量信號(hào)值發(fā)生了變化,repeat 執(zhí)行次數(shù)也不會(huì)改變。
下面 repeat 循環(huán)例子,實(shí)現(xiàn)了與 while 循環(huán)中的例子一樣的效果。
// repeat 循環(huán)語(yǔ)句 reg [3:0] counter3 ; initial begin counter3 = 'b0 ; repeat (11) begin //重復(fù)11次 #10 ; counter3 = counter3 + 1'b1 ; end end
下面 repeat 循環(huán)例子,實(shí)現(xiàn)了連續(xù)存儲(chǔ) 8 個(gè)數(shù)據(jù)的功能:
always @(posedge clk or negedge rstn) begin j = 0 ; if (!rstn) begin repeat (8) begin buffer[j] <= 'b0 ; //沒(méi)有延遲的賦值,即同時(shí)賦值為0 j = j + 1 ; end end else if (enable) begin repeat (8) begin @(posedge clk) buffer[j] <= counter3 ; //在下一個(gè)clk的上升沿賦值 j = j + 1 ; end end end
真結(jié)果如下圖。
由圖可知,rstn 拉高時(shí),buffer 的 8 個(gè)向量同時(shí)賦值為 0。
第二個(gè)時(shí)鐘周期后,buffer 依次被 counter3 賦值,實(shí)現(xiàn)了連續(xù)存儲(chǔ) 8 個(gè)數(shù)據(jù)的功能。
forever 循環(huán)
forever 循環(huán)語(yǔ)法格式如下:
forever begin … end
forever 語(yǔ)句表示永久循環(huán),不包含任何條件表達(dá)式,一旦執(zhí)行便無(wú)限的執(zhí)行下去,系統(tǒng)函數(shù) $finish 可退出 forever。
forever 相當(dāng)于 while(1) 。
通常,forever 循環(huán)是和時(shí)序控制結(jié)構(gòu)配合使用的。
例如,使用 forever 語(yǔ)句產(chǎn)生一個(gè)時(shí)鐘:
reg clk ; initial begin clk = 0 ; forever begin clk = ~clk ; #5 ; end end
例如,使用 forever 語(yǔ)句實(shí)現(xiàn)一個(gè)時(shí)鐘邊沿控制的寄存器間數(shù)據(jù)傳輸功能:
reg clk ; reg data_in, data_temp ; initial begin forever @(posedge clk) data_temp = data_in ; end
以上就是Verilog語(yǔ)言的循環(huán)語(yǔ)句示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Verilog語(yǔ)言循環(huán)語(yǔ)句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Verilog語(yǔ)言的循環(huán)語(yǔ)句示例詳解
這篇文章主要為大家介紹了Verilog語(yǔ)言的循環(huán)語(yǔ)句示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解
這篇文章主要為大家介紹了Verilog語(yǔ)言關(guān)鍵字模塊例化實(shí)例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04局域網(wǎng)設(shè)置自動(dòng)配置腳本文件的寫(xiě)法與用途
局域網(wǎng)設(shè)置自動(dòng)配置腳本文件的寫(xiě)法與用途...2007-01-01利用命令進(jìn)行簡(jiǎn)單的增量文件夾備份(win/linux)
這兩天突然看到一個(gè)需求點(diǎn),需要實(shí)現(xiàn)增量備份的功能,找了一些資料,記錄一下如下命令,該命令可以利用命令行進(jìn)行簡(jiǎn)單的增量備份功能2013-03-03