Menu
Coddy logo textTech

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 が予期しない値(XZ など)をとると out に値が退入されず、以前の値をラッチしてしまいます。これにより、純粋な組み合わせ論理ではなく、意図しないメモリ(ラッチ)が生成されてしまいます。

簡単な例

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

sel00の場合、outaを受け取ります。sel01の場合、outbを受け取ります。sel10の場合、outcを受け取ります。

それ以外の場合、out0 になります。

ケースごとの複数文

複数の文を使用する場合は beginend を使用します:

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

 CaseIf-Else
最適な用途1つの変数と多数の値複雑な条件
可読性非常に明確煩雑になりやすい
マルチプレクサ、デコーダ比較器、範囲チェック
challenge icon

チャレンジ

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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン