verilog循环语句
(2012-11-26 11:03:08)
标签:
it |
分类: Verilog |
在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。
1)forever 连续的执行语句。
2)repeat 连续执行一条语句 n 次。
3)while 执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假), 则语句一次也不能被执行。
4)for通过以下三个步骤来决定语句的循环执行。
a)先给控制循环次数的变量赋初值。
b)判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。
c)执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。
下面详细介绍各种循环语句。
forever语句
forever语句的格式如下:
forever语句; 或
foreverbegin 多条语句 end
forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同处在于不能独立写在程序中,而必须写在initial块中。其具体使用方法将在"事件控制"一节里详细地加以说明。
repeat语句
repeat语句的格式如下:
repeat(表达式)语句; 或
repeat(表达式) begin 多条语句 end
在repeat语句中,其表达式通常为常量表达式。下面的例子中使用repeat循环语句及加法和移位操作来实现一个乘法器。
parametersize=8,longsize=16;
reg[size:1] opa, opb;
reg[longsize:1] result;
begin:mult
reg[longsize:1] shift_opa, shift_opb;
shift_opa= opa;
shift_opb= opb;
result= 0;
repeat(size)
begin
if(shift_opb[1])
result = result + shift_opa;
shift_opa= shift_opa <<1;
shift_opb= shift_opb >>1;
end
end
while语句
while语句的格式如下:
while(表达式) 语句
或用如下格式:
while(表达式) begin 多条语句 end
下面举一个while语句的例子,该例子用while循环语句对rega这个8位二进制数中值为1的位进行计数。
begin:count1s
reg[7:0]tempreg;
count=0;
tempreg= rega;
while(tempreg)
begin
if(tempreg[0]) count = count + 1;
tempreg= tempreg>>1;
end
end
for语句
for语句的一般形式为:
for(表达式1;表达式2;表达式3) 语句
它的执行过程如下:
1)先求解表达式1;
2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面的第3步。若为假(0),则结束循环,转到第5步。
3)若表达式为真,在执行指定的语句后,求解表达式3。
4)转回上面的第2步骤继续执行。
5)执行for语句下面的语句。
for语句最简单的应用形式是很易理解的,其形式如下:
for(循环变量赋初值;循环结束条件;循环变量增值)
执行语句
for循环语句实际上相当于采用while循环语句建立以下的循环结构:
begin
循环变量赋初值;
while(循环结束条件)
begin
执行语句
循环变量增值;
end
end
这样对于需要8条语句才能完成的一个循环控制,for循环语句只需两条即可。
下面分别举两个使用for循环语句的例子。例1用for语句来初始化memory。例2则用for循环语句来实现前面用repeat语句实现的乘法器。
[例1]:begin:init_mem
reg[7:0] tempi;
for(tempi=0;tempi memory[tempi]=0;
end
[例2]: parameter size = 8, longsize = 16;
reg[size:1]opa, opb;
reg[longsize:1]result;
begin:mult
integer bindex;
result=0;
for( bindex=1; bindex<=size; bindex=bindex+1 )
if(opb[bindex])
result = result + (opa<<(bindex-1));
end
在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法。见下例:
begin:count1s
reg[7:0]tempreg;
count=0;
for(tempreg=rega; tempreg; tempreg=tempreg>>1 )
if(tempreg[0])
count=count+1;
end
小结
在本讲中我们学习了Verilog语法中几种条件语句和循环语句的写法。这些语句和C 语言很类似,所以比较容易理解。但是应该注意到在Verilog语言中这些语句表示的不是一个直接的计算过程,它们表示的是逻辑电路硬件的行为。因此语句细微的差别其含义有很大的不同;通过综合生成对应的硬件也有很大的变化。必须认真理解这些细节才能够设计出符合要求的逻辑,所以要格外注意:if else语句的else是不是你设计中想要的行为;在case语句中我们也要注意,如果条件都不符合究竟如何处理;在条件语句中是否存在无关的位,这些细节的考虑会使设计出的电路更加简洁,所以准确地理解casex 和casez与case有什么不同也是很重要的。另外for循环变量的增加也与C不同,不能用简化的++写法。
1)
2)
3)
4)
a)
b)
c)
下面详细介绍各种循环语句。
forever语句
forever语句的格式如下:
forever
forever
forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同处在于不能独立写在程序中,而必须写在initial块中。其具体使用方法将在"事件控制"一节里详细地加以说明。
repeat语句
repeat语句的格式如下:
repeat(表达式)
repeat(表达式)
在repeat语句中,其表达式通常为常量表达式。下面的例子中使用repeat循环语句及加法和移位操作来实现一个乘法器。
parameter
reg
reg
begin:
reg
shift_opa
shift_opb
result
repeat(size)
if(shift_opb[1])
shift_opa
shift_opb
end
while语句
while语句的格式如下:
while(表达式)
或用如下格式:
while(表达式)
下面举一个while语句的例子,该例子用while循环语句对rega这个8位二进制数中值为1的位进行计数。
begin:
reg[7:0]
count=0;
tempreg
while(tempreg)
if(tempreg[0])
tempreg
end
for语句
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
它的执行过程如下:
1)
2)
3)
4)
5)
for语句最简单的应用形式是很易理解的,其形式如下:
for(循环变量赋初值;循环结束条件;循环变量增值)
执行语句
for循环语句实际上相当于采用while循环语句建立以下的循环结构:
begin
循环变量赋初值;
while(循环结束条件)
执行语句
循环变量增值;
end
这样对于需要8条语句才能完成的一个循环控制,for循环语句只需两条即可。
下面分别举两个使用for循环语句的例子。例1用for语句来初始化memory。例2则用for循环语句来实现前面用repeat语句实现的乘法器。
[例1]:begin:
end
[例2]:
reg[size:1]
reg[longsize:1]
begin:mult
if(opb[bindex])
end
在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个8位二进制数中值为1的位进行计数的另一种方法。见下例:
begin:
reg[7:0]
count=0;
for(
count=count+1;
end
小结
在本讲中我们学习了Verilog语法中几种条件语句和循环语句的写法。
后一篇:Verilog 语言书写规范