美文网首页
Verilog循环语句

Verilog循环语句

作者: 暗夜望月 | 来源:发表于2017-06-16 10:40 被阅读0次

    在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。其语法和用途与C语言很类似

    • forever 连续执行过程语句。
    • repeat 连续执行一条语句 n 次。
    • while 执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假), 则语句一次也不能被执行。
    • for 通过以下三个步骤来决定语句的循环执行。
    • 先给控制循环次数的变量赋初值。
    • 判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。
    • 执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。

    forever语句

    forever语句的格式如下:

    forever begin 
        多条语句 
    end 
    

    forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同处在于不能独立写在程序中,而必须写在initial块中。forever循环的应用示例如下:

    initial
    forever begin 
        if(d) a = b + c;
        else a = 0;
    end 
    
    repeat语句

    repeat语句的格式如下:

    repeat(表达式)  begin 
        多条语句 
    end 
    

    在repeat语句中,其表达式通常为常量表达式。如果循环计数表达式的值不确定,即为x或z时,那么循环次数按0处理。

    下面的例子中使用repeat循环语句及加法和移位操作来实现一个乘法器。

    while语句

    while语句的格式如下:

    while(表达式)  begin  
        多条语句 
    end 
    

    while循环执行过程赋值语句直到制定的条件为假。如果条件表达式在开始不为真(包括假、x以及z),那么过程语句将永远不会被执行。

    下面举一个while语句的例子,该例子用while循环语句对rega这个8位二进制数中值为1的位进行计数。


    更完整点的写法:

    module mult_8b_while( 
       a, b, q 
        ); 
       
      parameter bsize = 8; 
      input  [bsize-1 : 0] a, b;
      output [2*bsize-1 : 0] q; 
       
      reg [2*bsize-1 : 0] q, a_t; 
      reg [bsize-1 : 0] b_t; 
      reg [bsize-1 : 0] cnt; 
       
      always @(a or b) begin 
         q = 0; 
         a_t = a; 
         b_t = b; 
         cnt = bsize; 
        
         while(cnt > 0) begin 
           if (b_t[0]) begin 
             q = q + a_t;     
           end 
           else begin 
             q = q; 
           end 
           
           cnt = cnt - 1; 
           a_t = a_t << 1; 
           b_t = b_t >> 1;  
        end 
      end 
    
    endmodule
    
    for语句

    for语句的一般形式为:

    for(表达式1; 表达式2; 表达式3)  语句 
    

    它的执行过程如下:

      1. 先求解表达式1;
      1. 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面的第3步。若为假(0),则结束循环,转到第5步。
      1. 若表达式为真,在执行指定的语句后,求解表达式3。
      1. 转回上面的第2步骤继续执行。
      1. 执行for语句下面的语句。

    for语句最简单的应用形式是很易理解的,其形式如下:

    for(循环变量赋初值;循环结束条件;循环变量增值) 
        执行语句 
    

    for循环语句实际上相当于采用while循环语句建立以下的循环结构:

    begin 
        循环变量赋初值; 
        while(循环结束条件) 
        begin 
            执行语句 
            循环变量增值; 
        end 
    end 
    

    这样对于需要8条语句才能完成的一个循环控制,for循环语句只需两条即可。

    下面分别举两个使用for循环语句的例子。例1用for语句来初始化memory。例2则用for循环语句来实现前面用repeat语句实现的乘法器。

    [例1]:


    [例2]:

    在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法。见下例:


    其他参考资料:关于Verilog 中的for语句的探讨


    Verilog-2001更新了generate循环,使用方法参考:

    相关文章

      网友评论

          本文标题:Verilog循环语句

          本文链接:https://www.haomeiwen.com/subject/bizuqxtx.html