循环语句
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