case 文
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 55/90。
case 制御文を使用すると、単一の expression の値に基づいて多くの異なるアクションの中から1つを選択できます。同じ変数を多くの異なる値と比較する場合、複数の if-else 制御文よりもすっきりとした代替手段となります。
case statementは、expressionを値のリストと比較し、一致するブロックを実行します。これは多分岐(マルチウェイブランチ)のようなものです。
構文:
case (expression)
value1: statement1;
value2: statement2;
default: default_statement;
endcase組み合わせ <strong>case</strong> 文には、常に <strong>default</strong> を含めることが強く推奨されます。default がない場合、sel が予期しない値(X や Z など)をとると out に値が退入されず、以前の値をラッチしてしまいます。これにより、純粋な組み合わせ論理ではなく、意図しないメモリ(ラッチ)が生成されてしまいます。
簡単な例
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = 0;
endcaseselが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値は一意である必要があります | 重複がある場合、最初に一致したブランチのみが実行されます |
| 値のビット幅は一致している必要があります | 1'b1 ではなく 2'b01 |
default はオプションですが推奨されます | マップされていない値をキャッチします |
default がない場合、マップされていない値によってラッチが発生します | 組み合わせ論理回路において |
Case vs If-Else
| Case | If-Else | |
|---|---|---|
| 最適な用途 | 1つの変数と多数の値 | 複雑な条件 |
| 可読性 | 非常に明確 | 煩雑になりやすい |
| 例 | マルチプレクサ、デコーダ | 比較器、範囲チェック |
チャレンジ
Case 文を完成させる
作業内容:
不足している case 文を追加して、このマルチプレクサを機能させてください。
動作原理:
select = 2'b00のとき、result = in0select = 2'b01のとき、result = in1select = 2'b10のとき、result = in2select = 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。