当前位置:   article > 正文

Verilog 循环语句(while, for, repeat, forever)_verilog while语句

verilog while语句

        Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。

while 循环

while 循环语法格式如下:

  1. while (condition) begin
  2. end

        while 循环中止条件为 condition 为假。如果开始执行到 while 循环时 condition 已经为假,那么循环语句一次也不会执行。当然,执行语句只有一条时,关键字 begin 与 end 可以省略。

下面代码执行时,counter 执行了 11 次。

  1. `timescale 1ns/1ns
  2. module test ;
  3. reg [3:0] counter ;
  4. initial begin
  5. counter = 'b0 ;
  6. while (counter<=10) begin
  7. #10 ;
  8. counter = counter + 1'b1 ;
  9. end
  10. end
  11. //stop the simulation
  12. always begin
  13. #10 ; if ($time >= 1000) $finish ;
  14. end
  15. endmodule

for 循环

for 循环语法格式如下:

  1. for(initial_assignment; condition ; step_assignment) begin
  2. end

        initial_assignment 为初始条件,condition 为终止条件,condition 为假时,立即跳出循环。step_assignment 为改变控制变量的过程赋值语句,通常为增加或减少循环变量计数。一般来说,因为初始条件和自加操作等过程都已经包含在 for 循环中,所以 for 循环写法比 while 更为紧凑,但也不是所有的情况下都能使用 for 循环来代替 while 循环。

        下面 for 循环的例子,实现了与 while 循环中例子一样的效果。需要注意的是,i = i + 1 不能像 C 语言那样写成 i++ 的形式,i = i -1 也不能写成 i -- 的形式。

  1. // for 循环语句
  2. integer i ;
  3. reg [3:0] counter2 ;
  4. initial begin
  5. counter2 = 'b0 ;
  6. for (i=0; i<=10; i=i+1) begin
  7. #10 ;
  8. counter2 = counter2 + 1'b1 ;
  9. end
  10. end

repeat 循环

repeat 循环语法格式如下:

  1. repeat (loop_times) begin
  2. end

        repeat 的功能是执行固定次数的循环,它不能像 while 循环那样用一个逻辑表达式来确定循环是否继续执行。repeat 循环的次数必须是一个常量、变量或信号。如果循环次数是变量信号,则循环次数是开始执行 repeat 循环时变量信号的值。即便执行期间,循环次数代表的变量信号值发生了变化,repeat 执行次数也不会改变。

下面 repeat 循环例子,实现了与 while 循环中的例子一样的效果。

  1. // repeat 循环语句
  2. reg [3:0] counter3 ;
  3. initial begin
  4. counter3 = 'b0 ;
  5. repeat (11) begin //重复11次
  6. #10 ;
  7. counter3 = counter3 + 1'b1 ;
  8. end
  9. end

下面 repeat 循环例子,实现了连续存储 8 个数据的功能:

  1. always @(posedge clk or negedge rstn) begin
  2. j = 0 ;
  3. if (!rstn) begin
  4. repeat (8) begin
  5. buffer[j] <= 'b0 ; //没有延迟的赋值,即同时赋值为0
  6. j = j + 1 ;
  7. end
  8. end
  9. else if (enable) begin
  10. repeat (8) begin
  11. @(posedge clk) buffer[j] <= counter3 ; //在下一个clk的上升沿赋值
  12. j = j + 1 ;
  13. end
  14. end
  15. end

forever 循环

forever 循环语法格式如下:

  1. forever begin
  2. end

        forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。forever 相当于 while(1) 。通常,forever 循环是和时序控制结构配合使用的。

例如,使用 forever 语句产生一个时钟:

  1. reg clk ;
  2. initial begin
  3. clk = 0 ;
  4. forever begin
  5. clk = ~clk ;
  6. #5 ;
  7. end
  8. end

例如,使用 forever 语句实现一个时钟边沿控制的寄存器间数据传输功能:

  1. reg    clk ;
  2. reg    data_indata_temp ;
  3. initial begin
  4.     forever @(posedge clk)      data_temp = data_in ;
  5. end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/101526
推荐阅读
相关标签
  

闽ICP备14008679号