西门⼦for循环例⼦_Verilog语法之九:循环语句
本⽂⾸发于“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注⼀下。
四种类型的循环语句,⽤来控制执⾏语句的执⾏次数。
在Verilog HDL中存在着四种类型的循环语句
forever 连续的执⾏语句。
while语句简单例子
1) forever
2) repeat
repeat 连续执⾏⼀条语句 n 次。
while 执⾏⼀条语句直到某个条件不满⾜。如果⼀开始条件即不满⾜(为假),则语句⼀次也不能被执⾏。
3) while
4) for
for通过以下三个步骤来决定语句的循环执⾏。
a) 先给控制循环次数的变量赋初值。
b) 判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执⾏指定的语句后,转到第三步。
c) 执⾏⼀条赋值语句来修正控制循环变量次数的变量的值,然后返回第⼆步。
下⾯对各种循环语句详细的进⾏介绍。
1.forever语句
forever语句的格式如下:
forever 语句;
forever
begin
多条语句
end
forever循环语句常⽤于产⽣周期性的波形,⽤来作为仿真测试信号。它与always语句不同处在于不能独⽴写在程序中,⽽必须写在initial块中。
repeat语句的格式如下:
repeat(表达式) 语句;
repeat(表达式)
begin
多条语句
end
在repeat语句中,其表达式通常为常量表达式。
下⾯的例⼦中使⽤repeat循环语句及加法和移位操作来实现⼀个乘法器。
parameter size=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
3.while语句
while语句的格式如下:
while(表达式) 语句
或⽤如下格式:
while(表达式)
begin
多条语句
end
下⾯举⼀个while语句的例⼦,该例⼦⽤while循环语句对rega这个⼋位⼆进制数中值为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
4.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<memsize;tempi=tempi+1)
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这个⼋位⼆进制数中值为1的位进⾏计数的另⼀种⽅法。见下例:
begin: count1s
reg[7:0] tempreg;
count=0;
for( tempreg=rega; tempreg; tempreg=tempreg>>1 )
if(tempreg[0])
count=count+1;
end
⽬前:四种循环语句中,综合⼯具只⽀持for循环语句
本⽂⾸发于“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注⼀下。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。