虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
一、学习内容
这节主要学习了条件语句if-ekse和case语句。
二、条件语句
条件语句有if-else和case两类,都属于顺序执行语句,都写在always块内。
(1)if-else语句
- 判定所给条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
- if-else语句有3种形式,其中“表达式”为逻辑表达式或关系表达式,或一位的变量;若表达式的值为0、或z,则判定的结果为“假”;若为1,则结果为“真”。语句可为单句,也可为多句;多句时一定要用“begin_end”语句括起来,形成一个复合块语句。
//方式1
if(表达式) 语句1;
//方式2
if(表达式) 语句1;
else 语句2;
//方式3
if(表达式1) 语句1;
else if(表达式2) 语句2;
...
else if(表达式n) 语句n;
- if语句可以嵌套;若if与else的数目不一样,注意用“begin_end”语句来确定if与else的配对关系!
if(表达式)
if(表达式2) 语句1;
else 语句2;
else
if(表达式3) 语句3;
else 语句4;
if (表达式1)begin
if (表达式2)语句1;
end
else begin
语句2;
语句3;
end
【例 1】
在always块内,语句是顺序执行的,always和assign是并发执行的。
(2)case语句
- 当敏感表达式取不同的值时, 执行不同的语句。
- 功能:当某个(控制)信号取不同的值时,给另一个(输出)信号赋不同的值。常用于多条件译码电路(如译码器、数据选择器、状态机、微处理器的指令译码)
- case语句有3种形式:case,casez,casex
case(敏感表达式)
值1:语句1;
值2:语句2;
…
值n:语句n;
default: 语句n+1;
endcase
说 明 :
- 其中“敏感表达式”又称为“控制表达式”,通常表示为控制信号的某些位。
- 值1~值n称为分支表达式,用控制信号的具体状态值表示,因此又称为常量表达式。
- default项可有可无,一个case语句里只能有一个default项!
- 值1~值n必须互不相同,否则矛盾。
- 值1~值n的位宽必须相等,且与控制表达式的位宽相同。
- 在case语句中,分支表达式每一位的值都是确定的(或者为0,或者为1);
- 在casez语句中,若分支表达式某些位的值为高阻值z,则不考虑对这些位的比较;
- 在casex语句中,若分支表达式某些位的值为z或不定值x,则不考虑对这些位的比较。
- 在分支表达式中,可用“?”来标识x或z
【例 2】用casez描述的数据选择器
module mux_z(out,a,b,c,d,select);
output out;
input a,b,c,d;
input[3:0] select;
reg out; //必须声明
always@ (select[3:0] or a or b or c or d) begin
casez (select)
4’b???1: out = a;//?表示高阻态
4’b??1? : out = b;
4’b? 1?? : out = c;
4’b 1??? : out = d;
endcase
end
endmodule
在组合电路中,左图缺少else,会生成锁存器,锁存器不利于时序收敛。避免生成锁存器的原则:如果用到if语句,最好写上else项;如果用到case语句,最好写上default项。
三、思考和小结
(1)思考
- 【例 3】用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
(2)小结
作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。