Verilog HDL基础之:条件语句
if语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了3种形式的if语句。
(1)无分支。
语法形式:
if (表达式) 语句;
例如:
if (a > b) out1 = int1; //若a大于b,将int1赋予out1
(2)单级分支。
语法形式:
if(表达式)语句1;
else 语句2;
例如:
if(a>b) out1=int1; //若a大于b,将int1赋予out1;否则,将int2赋予out1
else out1=int2;
(3)多级分支
语法形式:
if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
...
else if(表达式m) 语句m;
else 语句n;
例如:
if(a>b) out1=int1; //若a大于b,将int1赋予out1
else if(a==b) out1=int2; //否则,如果a等于b,将int2赋予out1
else out1=int3; //否则,将int3赋予out1
关于if语句有如下6点说明:
(1)3种形式的if语句中,在if后面都有“表达式”,一般为逻辑表达式或关系表达式。系统对表达式的值进行判断,若为0、x或z,按“假”处理;若为1,按“真”处理,执行指定的语句。
(2)第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。
这是由于分号是Verilog HDL语句中不可缺少的部分,这个分号是if语句中的内嵌套语句所要求的。如果无此分号,则出现语法错误。
但应注意,不要误认为上面是两个语句(if语句和else语句)。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
(3)在if和else后面可以包含一个内嵌的操作语句,也可以有多个操作语句,此时用begin和end这两个关键词将几个语句包含起来成为一个复合块语句如下所示。
if(a>b)begin //使用begin_end语句实现多个赋值操作
out1=int1;
out2=int2;
end
else begin
out1=int2;
out2=int1;
end
注意 | 在end后不需要再加分号,因为begin_end内是一个完整的复合语句,不需再附加分号。 |
(4)允许一定形式的表达式简写方式,例如:
if(expression) 等同于 if( expression == 1 )
if(!expression) 等同于 if( expression != 1 )
(5)if语句的嵌套。
在if语句中又包含一个或多个if语句,称为if语句的嵌套,一般形式如下:
if(expression1)
if(expression2) 语句1 (内嵌if)
else 语句2
else if(expression3) 语句3 (内嵌if)
else 语句4
应当注意if与else的配对关系,else总是与它上面的最近的if配对。如果if与else的数目不一样,为了实现程序设计者的企图,可以用begin_end块语句来确定配对关系,例如:
if() begin
if() 语句1 (内嵌if)
end
else 语句2
这时begin_end块语句限定了内嵌if语句的范围,因此else与第一个if配对。注意begin_end块语句在if_else语句中的使用,因为有时begin_end块语句的不慎使用会改变逻辑行为,如下所示:
if(index>0) //内嵌for语句,无else分支
for(scani=0;scaniindex;scani=scani+1) //内嵌if语句
if(memory[scani]>0) begin //使用begin_end语句,有else分支
$display(...);
memory[scani]=0;
end
else //此处为内嵌if语句的分支
$display(error-indexiszero);
...
尽管程序设计者把else写在与第一个if(外层if)同一列上,希望与第一个if对应,但实际上else是与第二个if对应,因为它们相距最近。正确的写法如下:
if(index>0) begin //内嵌for语句,有else分支
for(scani=0;scaniindex;scani=scani+1) //内嵌if语句
if(memory[scani]>0) begin //使用begin_end语句,无else分支
$display(...);
memory[scani]=0;
end
end
else //此处为外部if语句的分支
$display(error-indexiszero);
(6)if_else例子。
下面这段程序用if_else语句来检测变量index以决定modify-seg1、modify-seg2、modify-seg3中哪一个的值应当与index相加作为memory的寻址地址。并且将相加值存入寄存器index以备下次检测使用。程序的前10行定义寄存器和参数。
reg [31:0] instruction, segment_area[255:0]; //定义寄存器
reg [7:0] index;
reg [5:0] modify_seg1, modify_seg2, modify_seg3;
parameter //定义参数
segment1=0, inc_seg1=1,
segment2=20, inc_seg2=2,
segment3=64, inc_seg3=4,
data=128;
//检测寄存器index的值
if(indexsegment2) begin //index<20时,执行下列操作
instruction = segment_area[index + modify_seg1];
index = index + inc_seg1;
end
else if(indexsegment3)
VerilogHDL 华清远见 相关文章:
- Verilog门电平模型化(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(06-06)
- VHDL:中文版Verilog HDL简明教程:第2章 HDL指南(06-06)
- VHDL:中文版Verilog HDL简明教程:第1章 简介(06-06)
- VHDL:中文版Verilog HDL简明教程:第3章 Verilog语言要素(续)(06-06)
- 基于Verilog应用(06-06)