Menu
Coddy logo textTech

条件演算子

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 28/90。

条件演算子 ? : は、条件に基づいて2つの値のいずれかを選択します。これは三項演算子とも呼ばれます。条件演算子は条件を評価し、2つの値のうちの1つを返します。

condition ? value_if_true : value_if_false

条件が真(1)の場合、最初の値が返されます。偽(0)の場合、2番目の値が返されます。

条件演算子を使用する理由

これは、単純な if-else ロジックを 1 行で記述するコンパクトな方法です。主な用途は次のとおりです。

  • 2つの信号のいずれかを選択する
  • マルチプレクサの作成
  • デフォルト値の設定
  • インラインでの条件付き代入

構文と例

基本的な例:

result = (a > b) ? a : b;   // result には a と b のうち大きい方が代入されます

値の選択:

data_out = (enable) ? data_in : 8'b00000000;   // 有効な場合はデータを出力し、そうでない場合は0を出力

条件付きで信号を反転:

out = (invert) ? ~in : in;   // invertが1の場合、出力を反転。それ以外の場合は変更なし

コード例

module conditional_demo;
  reg [3:0] a, b, max;
  reg enable;
  reg [3:0] data_in, data_out;
  
  initial begin
    a = 4'd7;
    b = 4'd9;
    enable = 1;
    data_in = 4'b1010;
    
    max = (a > b) ? a : b;           // 9
    data_out = (enable) ? data_in : 4'b0000;   // 1010
    
    $display("max = %d", max);
    $display("data_out = %b", data_out);
    $finish;
  end
endmodule

出力:

max = 9
data_out = 1010

入れ子になった条件演算子

複数の選択肢がある場合、条件演算子を入れ子(ネスト)にすることができます:

result = (a > b) ? a : (b > c) ? b : c;   // 3つの値の中から最大値を見つける

括弧を使用して、入れ子になった条件を明確にします。

重要な注意事項

  • 条件は1ビット(または0か1に評価される式)である必要があります
  • 両方の値のオプションは、同じビット幅である必要があります
  • この演算子は、継続的代入(assign)および手続き型ブロック(alwaysinitial)で使用できます
challenge icon

チャレンジ

各タスクに対して正しい条件演算式を記述してください。

作業内容:

  1. maxxy のうち大きい方の値を設定します
  2. absval の絶対値を設定します(負の場合は正にします)
  3. enable が 1 の場合は output_datadata を設定し、そうでない場合は 8'b0 を設定します

チートシート

条件演算子(三項演算子) ? : は、条件に基づいて2つの値のいずれかを選択します:

condition ? value_if_true : value_if_false

例:

max      = (a > b) ? a : b;                  // aとbの大きい方
data_out = (enable) ? data_in : 8'b0;        // 有効な場合はデータを出力し、それ以外は0
out      = (invert) ? ~in : in;              // 条件に応じて信号を反転

入れ子になった条件演算子:

result = (a > b) ? a : (b > c) ? b : c;     // 3つの値の中で最大のもの

注意点:

  • 条件は0または1として評価される必要があります
  • 両方の値の選択肢は同じビット幅である必要があります
  • assignalways、および initial ブロックで使用可能です

自分で試してみよう

module conditional_challenge;
  reg [3:0] x, y;
  reg [3:0] max;
  reg signed [3:0] val;
  reg [3:0] abs;
  reg enable;
  reg [7:0] data;
  reg [7:0] output_data;
  
  initial begin
    x = 4'd12;
    y = 4'd8;
    val = -4'sd5;
    enable = 1;
    data = 8'b10101010;
    
    max = ______;          // xとyの大きい方
    abs = ______;          // valの絶対値
    output_data = ______;  // enableならdata、そうでなければ0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン