循环语句

VerilogHDL中提供了4种循环语句,可用于控制语句的执行次数,分别为:

Ø  for 循环:执行给定的循环次数;

Ø  while 循环:执行语句直到某个条件不满足;

Ø  repeat 循环:连续执行语句N次;

Ø  forever 循环:连续执行某条语句。

其中,for、while是可综合的,但循环的次数需要在编译之前就确定,动态改变循环次数的语句则是不可综合的;repeat语句在有些工具中可综合,有些不可综合;forever语句是不可综合的,常用于产生各类仿真激励。

 

1.    repeat语句

repeat循环语句执行指定的循环次数,如果循环计数表达式的值不确定,即为x或z时,那么循环次数按0处理。Repeat循环语句的语法为:

repeat(循环次数表达式)

       begin

              语句块;

       end

       其中,“循环次数表达式”用于制定循环次数,可以是一个整数、变量或数值表达式。如果是变量或数值表达式,其数值只在第一次循环时得到计算,从而得以事先确定循环次数;“语句块”为重复执行的循环体。在可综合设计中,“循环次数表达式”必须在程序编译过程中保持不变。

例1:利用repeat语句统计输入数据中所包含零比特的个数

module count_zeros_repeat(
   input [7:0] number,
   output reg [3:0] Count
   );
        reg[3:0] Count_aux ;
        integeri ;
        always@ (number)
                 begin
                         Count_aux= 4'b0000 ;
                         i= 0 ;
                         repeat(8)
                                  begin
                                          if(!number[i])
                                                  Count_aux= Count_aux + 1 ;
                                          i= i + 1;
                                  end
                         Count= Count_aux ;
                 end
endmodule

2.    while语句

while循环语句实现的是一种“条件循环”,只有在指定的循环条件为真时才会重复执行循环体,如果表达式在开始时不为真(包括假,x以及z)时,过程语句将永远不会被执行。while循环的语法为:

while(循环执行条件表达式)

      begin

             语句块;

      end

 

例2:利用while语句统计输入数据中所包含零比特的个数

module count_zeros_while(
   input [7:0] number,
   output reg [3:0] Count
   );
        reg[3:0] Count_aux;
        integeri ;
        always@ (number)
                 begin
                         i= 0;
                         Count_aux= 4'b0000;
                         while(i< 8)
                                  begin
                                          if(!number[i])
                                                  Count_aux= Count_aux + 1;
                                          i= i + 1;
                                  end
                         Count= Count_aux ;
                 end
endmodule

3.    for语句

和while循环语句一样,for循环语句实现的是一种“条件循环”。其语法结构如下:

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

      语句块;

for循环语句中最简单的应用形式是很容易理解的,其形式为:

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

      循环体语句的语句块;

例3:利用for语句统计输入数据中所包含零比特的个数

module count_zeros_for(
   input [7:0] number,
   output reg [2:0] Count
   );
        reg[2:0] Count_aux;
        integeri ;
        always@(number)
                 begin
                         Count_aux= 3'b000;
                         for(i= 0; i < 8; i = i + 1)
                                  begin
                                          if(!number[i])
                                                  Count_aux= Count_aux + 1 ;
                                  end
                         Count= Count_aux ;
                 end
endmodule

4.    相互转换

在应用时,repeat、while和for语句三者之间是可以相互转换的,如对一个简单的五次循环,分别用repeat、while & for 书写。

for(i = 0 ; i < 5 ; i = i + 1)
       begin
              循环体;
       end
 
repeat(5)
       begin
              循环体;
       end
 
i = 0 ;
while(i < 5)
       begin
              循环体;
              i= i + 1 ;
       end