Case 语句
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 55 课,共 90 课。
case 语句可以根据单个表达式的值,在许多不同操作中进行选择。与多个 if-else 语句相比,如果要将同一个变量与许多不同的值进行比较,使用它会更简洁。
case 语句会将表达式与一组值进行比较,并执行匹配的代码块。它类似于多路分支。
语法:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcase强烈建议在组合 case 语句中始终包含 default。如果没有 default,当 sel 取值不在任何 case 分支中时,out 不会被赋值,并会保留之前的值。当 sel 的值仅由 0 和 1 位组成,但没有对应分支时,综合会构建出非预期的存储器(锁存器),而不是纯组合逻辑。在仿真中,sel 上的 X 或 Z 也会使 out 保持不变,但不会创建锁存器。
简单示例
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcase如果 sel 是 00,out 就取值 a。如果 sel 是 01,out 就取值 b。如果 sel 是 10,out 就取值 c。
否则,out 会得到 0。
每个分支中的多条语句
使用 begin 和 end 来包含多条语句:
case (state)
2'b00: begin
out = a;
flag = 1;
end
2'b01: begin
out = b;
flag = 0;
end
default: out = 0;
endcase重要规则
| 规则 | 说明 |
|---|---|
| case 值应该唯一 | 如果有重复值,只会执行第一个匹配的分支 |
| 值的位宽应该匹配 | 写 2'b01,不要写 1'b1(较短的值会用零补齐) |
default 是可选的,但建议使用 | 用于捕获未映射的值 |
没有 default 时,未映射的值会导致锁存器 | 在组合逻辑中 |
Case 与 If-Else
| Case | If-Else | |
|---|---|---|
| 适用于 | 一个变量,多个值 | 复杂条件 |
| 可读性 | 非常清晰 | 可能变得杂乱 |
| 示例 | 多路复用器、解码器 | 比较器、范围检查 |
挑战
补全 case 语句
要做什么:
添加缺失的 case 语句,让这个多路复用器正常工作。
工作原理:
- 当
select = 2'b00时,result = in0 - 当
select = 2'b01时,result = in1 - 当
select = 2'b10时,result = in2 - 当
select = 2'b11时,result = in3
亲手试试
module mux4 (
input [1:0] select,
input in0, in1, in2, in3,
output reg result
);
always @(*) begin
// TODO: 添加 case 语句
// select=00 -> result = in0
// select=01 -> result = in1
// select=10 -> result = in2
// select=11 -> result = in3
// default -> result = 0
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器