Verilog HDL条件语句
发布时间:2008/5/28 0:00:00 访问次数:1780
4.7 条件语句
if 语句的语法如下:
if(condition_1)
procedural_statement_1
2004-08-16 第25页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
{else if(condition_2)
procedural_statement_2}
{else
procedural_statement_3}
如果对condition_1 求值的结果为个非零值,那么procedural_statement_1 被执,如果
condition_1 的值为0 、x 或z ,那么procedural_statement_1 不执行。如果存在一个else 分支,那么这
个分支被执行。以下是一个例子。
if(sum < 60)
begin
grade = c;
total_c = total _c + 1;
end
else if(sum < 75)
begin
grade = b;
total_b = total_b + 1;
end
else
begin
grade = a;
total_a = total_a + 1;
end
注意条件表达式必须总是被括起来,如果使用if - if - else 格式,那么可能会有二义性,如下例
所示:
if(c l k)
if(r e s e t)
q = 0;
else
q = d;
问题是最后一个else 属于哪一个if? 它是属于第一个if 的条件(clk)还是属于第二个if的条件
(reset)? 这在verilog hdl 中已通过将else 与最近的没有else 的if 相关联来解决。在这个例子中,
else 与内层if 语句相关联。
以下是另一些if 语句的例子。
if(sum < 100)
sum = sum + 10;
if(nickel_in)
deposit = 5;
2004-08-16 第26页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
elseif (dime_in)
deposit = 10;
else if(quarter_in)
deposit = 25;
else
deposit = error;
书写建议:
1、条件表达式需用括号括起来。
2、若为if - if 语句,请使用块语句 begin --- end :
if(c l k)
begin
if(r e s e t)
q = 0;
else
q = d;
end
以上两点建议是为了使代码更加清晰,防止出错。
3、对if 语句,除非在时序逻辑中,if 语句需要有else 语句。若没有缺省语句,设计将产生一
个锁存器,锁存器在asic设计中有诸多的弊端(可看同步设计技术所介绍)。如下一例:
if (t)
q = d;
没有else 语句,当t为1(真)时,d 被赋值给q,当t为0(假)时,因为没有else 语句,电路
保持 q 以前的值,这就形成一个锁存器。
4.8 case 语句
case 语句是一个多路条件分支形式,其语法如下:
case(case_expr)
case_item_expr{ ,case_item_expr} :procedural_statement
. . .
. . .
[default:procedural_statement]
endcase
case 语句首先对条件表达式case_expr 求值,然后依次对各分支项求值并进行比较,第一个与
条件表达式值相匹配的分支中的语句被执行。可以在1 个分支中定义多个分支项;这些值不需要互
斥。缺省分支覆盖所有没有被分支表达式覆盖的其他分支。
例:
case (hex)
4'b0001 : led = 7'b1111001; // 1
2004-08-16 第27页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
4'b0010 : led = 7'b0100100; // 2
4'b0011 : led = 7'b0110000; // 3
4'b0100 : led = 7'b0011001; // 4
4'b0101 : led = 7'b0010010; // 5
4'b0110 : led = 7'b0000010; // 6
4'b0111 : led = 7'b1111000; // 7
4'b1000 : led = 7'b0000000; // 8
4'b1001 : led = 7'b0010000; // 9
4'b1010 : led = 7'b0001000; // a
4'b1011 : led = 7'b0000011; // b
4'b1100 : led = 7'b1000110; // c
4'b1101 : led = 7'b0100001; // d
4'b1110 : led = 7'b0000110; // e
4'b1111 : led = 7'b0001110; // f
default :led = 7'b1000000; // 0
endcase
书写建议:
case 的缺省项必须写,防止产生锁存器。
4.7 条件语句
if 语句的语法如下:
if(condition_1)
procedural_statement_1
2004-08-16 第25页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
{else if(condition_2)
procedural_statement_2}
{else
procedural_statement_3}
如果对condition_1 求值的结果为个非零值,那么procedural_statement_1 被执,如果
condition_1 的值为0 、x 或z ,那么procedural_statement_1 不执行。如果存在一个else 分支,那么这
个分支被执行。以下是一个例子。
if(sum < 60)
begin
grade = c;
total_c = total _c + 1;
end
else if(sum < 75)
begin
grade = b;
total_b = total_b + 1;
end
else
begin
grade = a;
total_a = total_a + 1;
end
注意条件表达式必须总是被括起来,如果使用if - if - else 格式,那么可能会有二义性,如下例
所示:
if(c l k)
if(r e s e t)
q = 0;
else
q = d;
问题是最后一个else 属于哪一个if? 它是属于第一个if 的条件(clk)还是属于第二个if的条件
(reset)? 这在verilog hdl 中已通过将else 与最近的没有else 的if 相关联来解决。在这个例子中,
else 与内层if 语句相关联。
以下是另一些if 语句的例子。
if(sum < 100)
sum = sum + 10;
if(nickel_in)
deposit = 5;
2004-08-16 第26页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
elseif (dime_in)
deposit = 10;
else if(quarter_in)
deposit = 25;
else
deposit = error;
书写建议:
1、条件表达式需用括号括起来。
2、若为if - if 语句,请使用块语句 begin --- end :
if(c l k)
begin
if(r e s e t)
q = 0;
else
q = d;
end
以上两点建议是为了使代码更加清晰,防止出错。
3、对if 语句,除非在时序逻辑中,if 语句需要有else 语句。若没有缺省语句,设计将产生一
个锁存器,锁存器在asic设计中有诸多的弊端(可看同步设计技术所介绍)。如下一例:
if (t)
q = d;
没有else 语句,当t为1(真)时,d 被赋值给q,当t为0(假)时,因为没有else 语句,电路
保持 q 以前的值,这就形成一个锁存器。
4.8 case 语句
case 语句是一个多路条件分支形式,其语法如下:
case(case_expr)
case_item_expr{ ,case_item_expr} :procedural_statement
. . .
. . .
[default:procedural_statement]
endcase
case 语句首先对条件表达式case_expr 求值,然后依次对各分支项求值并进行比较,第一个与
条件表达式值相匹配的分支中的语句被执行。可以在1 个分支中定义多个分支项;这些值不需要互
斥。缺省分支覆盖所有没有被分支表达式覆盖的其他分支。
例:
case (hex)
4'b0001 : led = 7'b1111001; // 1
2004-08-16 第27页,共41页
版权所有,侵权必究
绝密
verilog hdl 入门教程请输入文档编号
4'b0010 : led = 7'b0100100; // 2
4'b0011 : led = 7'b0110000; // 3
4'b0100 : led = 7'b0011001; // 4
4'b0101 : led = 7'b0010010; // 5
4'b0110 : led = 7'b0000010; // 6
4'b0111 : led = 7'b1111000; // 7
4'b1000 : led = 7'b0000000; // 8
4'b1001 : led = 7'b0010000; // 9
4'b1010 : led = 7'b0001000; // a
4'b1011 : led = 7'b0000011; // b
4'b1100 : led = 7'b1000110; // c
4'b1101 : led = 7'b0100001; // d
4'b1110 : led = 7'b0000110; // e
4'b1111 : led = 7'b0001110; // f
default :led = 7'b1000000; // 0
endcase
书写建议:
case 的缺省项必须写,防止产生锁存器。