位置:51电子网 » 技术资料 » EDA/PLD

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 的缺省项必须写,防止产生锁存器。



相关IC型号

热门点击

 

推荐技术资料

声道前级设计特点
    与通常的Hi-Fi前级不同,EP9307-CRZ这台分... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!