赞
踩
if语句用来判断给定的条件是否满足,根据判断的结果决定要执行的操作。verilog HDL提供了3种形式的if语句。
if(score>90) level=1;
else if(score>80) level=2;
else if(score>70) level=3;
else if(score>60) level=4;
else level=5;
if(a>b)
begin
out1=in1;
out2=in2;
end
else
begin
out1=in2;
out2=in1;
end
case语句是一种多分支语句,通常包含两个或多个分支语句。
其结构形式为:
module mux4_to_1(out,i0,i1,i2,i3,s1,s0); //输入输出端口声明 output out; input i0,i1,i2,i3; input s1,s0; //输出变量类型声明 reg out; //任何输入信号变化,都会引起输出信号的状态更新 always@(s1 or s0 or i0 or i1 or i2 or i3) begin case({s1,s0}) 2'b00: out = i0; 2'b01: out = i1; 2'b10: out = i2; 2'b11: out = i3; default: out = 1'bx; endcase end endmodule
在verilog HDL中存在着4种类型的循环语句,用来控制执行语句的执行次数。
forever语句,常用于产生周期性的波形,用作仿真测试信号。与always的不同之处在于它不能独立写在程序中,而是必须写在initial块中。
格式如下:
forever 语句;
或
forever
begin
多条语句;
end
格式如下:
repeat(表达式) 语句
或
repeat(表达式)
begin
多条语句;
end
在repeat语句中,其表达式通常为常量表达式。
如:使用repeat循环语句及加法和移位操作来实现一个乘法器:
paremeter 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
格式如下:
while(表达式) 语句;
或
while(表达式)
begin
多条语句;
end
如:统计1个八位二进制数中1的个数:
begin: count1s
reg[7:0] tempreg;
count = 0 ;
tempreg = rega;
while(tempreg)
begin
if(tempreg[0]) count = count + 1;
tempreg = tempre >> 1;
end
end
格式如下:
for(表达式1;表达式2;表达式3)
语句;
表达式1对变量初始化,表达式2对变量满足的条件进行判断,如果满足,执行表达式3,否则结束循环。
最常见的形式如下:
for(循环变量赋初值;循环结束条件;循环变量增值)
如(1)初始化memeory:
begin: init_mem
reg[7:0] tempi;
for(tempi=0;tempi<memsize;tempi=tempi+1)
memory[tempi]=0;
end
(2)实现乘法器(与repeat语句中的例子执行结果相同)
parameter size=8,longsize=16;
reg[size:1] opa,opb;
reg[longsize:1] result;
begin:mult
integer cnt;
result = 0;
for(cnt=1;cnt<=size;cnt=cnt+1)
if(opb[cnt])
result=result+(opa<<(cnt-1));
end
块语句包含两种类型:
块语句具有3个特点:
嵌套块,在块语句内部调用其他块语句。
如:
initial
begin
x=1'b0;
fork//内部嵌套
#5 y=1'b1;//在第5个单位时间开始执行
#10 z={x,y};//将x与y拼接,然后赋值给z,在第10个单位时间开始执行
join
#20 w={y,x};//在第20个单位时间开始执行
end
endmodule
命名块,指的是给块赋予名字。其特点如下:
module top;//指定模块名为top
initial
begin:block1//为顺序块命名为block1
integer i;//整形变量i是block1命名块的静态局部变量,在其他模块或者命名块中可以使用层次名top.block1.i对其进行访问
...
end
intial
fork:block2//为顺序块命名为block2
reg i;//寄存器变量i是block2命名块的静态局部变量,在其他模块或者命名块中可以使用层次名top.block2.i对其进行访问
...
join
endmodule
verilog通过关键字disable提供了一种中止命令块执行的方法。disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。对块语句的禁用导致紧跟在块后面的那条语句被执行。
使用上与C语言的break类似,但是break只能退出当前所在的循环,而disable可以禁用任意一个命名块。
如:
reg[15:0] flag; integer i; initial begin flag = 16'b0010_1110_0100_1000; i = 0; begin:block1 while(i<16) begin if(flag[i]) begin $display("encounted a true bit at element number %d",i); disable(block1);//当在寄存器中找到值为1的第一个位置,禁用block1 end else i=i+1; end end end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。