Conditional Operator
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 28/90。
条件演算子 ? : は、condition に基づいて2つの値のいずれかを選択します。三項演算子とも呼ばれます。条件演算子は condition を評価し、次の2つの値のいずれかを返します。
condition ? value_if_true : value_if_falsecondition が真(1)の場合、最初の値が返されます。偽(0)の場合、2 番目の値が返されます。
条件演算子を使用する理由
これは、単純な if-else ロジックを1行で記述するための簡潔な方法です。一般的な用途には次のようなものがあります。
- 2つの signal のいずれかを選択する
- マルチプレクサを作成する
- デフォルト値を設定する
- インライン条件付き代入
構文と例
基本的な例:
result = (a > b) ? a : b; // result は a と b のうち大きい方を取得する値の間から選択する:
data_out = (enable) ? data_in : 8'b00000000; // Output data if enabled, else 0信号を invert conditionally:
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; // a > b の場合は a、そうでなければ b と c の大きい方括弧を使って、ネストされた条件を明確にします。
重要な注意事項
- condition は単一ビット(または 0 または 1 に評価される式)でなければなりません
- 両方の値の選択肢のビット幅を同じに保ってください。異なる場合、Verilog は狭い方を暗黙的に拡張します
- この演算子は連続代入(
assign)および手続きブロック(always、initial)で使用できます
チャレンジ
各タスクに対する正しい条件式を書いてください。
行うこと:
maxをxとyのうち大きい方に設定するabsをvalの絶対値に設定する(負の場合は正にする)enableが 1 の場合はoutput_dataをdataに、それ以外の場合は8'b0に設定する
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logic自分で練習してみよう: Verilogオンラインコンパイラ