Verilog 循環(huán)語句有 4 種類型,分別是 while,for,repeat,和 forever 循環(huán)。循環(huán)語句只能在 always 或 initial 塊中使用,但可以包含延遲表達式。
while 循環(huán)語法格式如下:
while (condition) begin
…
end
while 循環(huán)中止條件為 ?condition
?為假。
如果開始執(zhí)行到 while 循環(huán)時 ?condition
?已經(jīng)為假,那么循環(huán)語句一次也不會執(zhí)行。
當然,執(zhí)行語句只有一條時,關鍵字 begin 與 end 可以省略。
下面代碼執(zhí)行時,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(initial_assignment; condition ; step_assignment) begin
…
end
?initial_assignment
?為初始條件。
?condition
?為終止條件,?condition
?為假時,立即跳出循環(huán)。
?step_assignment
?為改變控制變量的過程賦值語句,通常為增加或減少循環(huán)變量計數(shù)。
一般來說,因為初始條件和自加操作等過程都已經(jīng)包含在 for 循環(huán)中,所以 for 循環(huán)寫法比 while 更為緊湊,但也不是所有的情況下都能使用 for 循環(huán)來代替 while 循環(huán)。
下面 for 循環(huán)的例子,實現(xiàn)了與 while 循環(huán)中例子一樣的效果。需要注意的是,i = i + 1 不能像 C 語言那樣寫成 i++ 的形式,i = i -1 也不能寫成 i -- 的形式。
// for 循環(huán)語句
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 (loop_times) begin
…
end
repeat 的功能是執(zhí)行固定次數(shù)的循環(huán),它不能像 while 循環(huán)那樣用一個邏輯表達式來確定循環(huán)是否繼續(xù)執(zhí)行。repeat 循環(huán)的次數(shù)必須是一個常量、變量或信號。如果循環(huán)次數(shù)是變量信號,則循環(huán)次數(shù)是開始執(zhí)行 repeat 循環(huán)時變量信號的值。即便執(zhí)行期間,循環(huán)次數(shù)代表的變量信號值發(fā)生了變化,repeat 執(zhí)行次數(shù)也不會改變。
下面 repeat 循環(huán)例子,實現(xiàn)了與 while 循環(huán)中的例子一樣的效果。
// repeat 循環(huán)語句
reg [3:0] counter3 ;
initial begin
counter3 = 'b0 ;
repeat (11) begin //重復11次
#10 ;
counter3 = counter3 + 1'b1 ;
end
end
下面 repeat 循環(huán)例子,實現(xiàn)了連續(xù)存儲 8 個數(shù)據(jù)的功能:
always @(posedge clk or negedge rstn) begin
j = 0 ;
if (!rstn) begin
repeat (8) begin
buffer[j] <= 'b0 ; //沒有延遲的賦值,即同時賦值為0
j = j + 1 ;
end
end
else if (enable) begin
repeat (8) begin
@(posedge clk) buffer[j] <= counter3 ; //在下一個clk的上升沿賦值
j = j + 1 ;
end
end
end
仿真結果如下圖。
由圖可知,rstn 拉高時,buffer 的 8 個向量同時賦值為 0。
第二個時鐘周期后,buffer 依次被 counter3 賦值,實現(xiàn)了連續(xù)存儲 8 個數(shù)據(jù)的功能。
forever 循環(huán)語法格式如下:
forever begin
…
end
forever 語句表示永久循環(huán),不包含任何條件表達式,一旦執(zhí)行便無限的執(zhí)行下去,系統(tǒng)函數(shù) $finish 可退出 forever。
forever 相當于 while(1) 。
通常,forever 循環(huán)是和時序控制結構配合使用的。
例如,使用 forever 語句產(chǎn)生一個時鐘:
reg clk ;
initial begin
clk = 0 ;
forever begin
clk = ~clk ;
#5 ;
end
end
例如,使用 forever 語句實現(xiàn)一個時鐘邊沿控制的寄存器間數(shù)據(jù)傳輸功能:
reg clk ;
reg data_in, data_temp ;
initial begin
forever @(posedge clk) data_temp = data_in ;
end
點擊這里下載源碼
更多建議: