条件演算子
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)および手続き型ブロック(always、initial)で使用できます
チャレンジ
各タスクに対して正しい条件演算式を記述してください。
作業内容:
maxにxとyのうち大きい方の値を設定しますabsにvalの絶対値を設定します(負の場合は正にします)enableが 1 の場合はoutput_dataにdataを設定し、そうでない場合は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として評価される必要があります
- 両方の値の選択肢は同じビット幅である必要があります
assign、always、および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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。