Conditional Operator
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 28 von 90.
Der bedingte Operator ? : wählt basierend auf einer Bedingung zwischen zwei Werten aus. Er wird auch als ternärer Operator bezeichnet. Der bedingte Operator wertet eine Bedingung aus und gibt einen von zwei Werten zurück:
condition ? value_if_true : value_if_falseWenn condition wahr (1) ist, wird der erste Wert zurückgegeben. Wenn sie falsch (0) ist, wird der zweite Wert zurückgegeben.
Warum den Conditional Operator verwenden
Er ist eine kompakte Möglichkeit, einfache If-Else-Logik in einer einzigen Zeile zu schreiben. Häufige Verwendungen sind:
- Zwischen zwei signal wählen
- Multiplexer erstellen
- Standardwerte festlegen
- Inline-bedingte Zuweisungen
Syntax und Beispiele
Grundlegendes Beispiel:
result = (a > b) ? a : b; // result erhält den größeren von a und bZwischen Werten auswählen:
data_out = (enable) ? data_in : 8'b00000000; // Output data if enabled, else 0signal bedingt invertieren:
out = (invert) ? ~in : in; // Wenn invert 1 ist, Ausgabe invertiert; sonst unverändertCodebeispiel
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
endmoduleAusgabe:
max = 9
data_out = 1010Verschachtelte bedingte Operatoren
Du kannst bedingte Operatoren für mehrere Auswahlen verschachteln:
result = (a > b) ? a : (b > c) ? b : c; // a wenn a > b, ansonsten der größere von b und cVerwende Klammern, um verschachtelte Bedingungen klar zu machen.
Wichtige Hinweise
- Die condition muss ein einzelnes Bit sein (oder ein Ausdruck, der zu 0 oder 1 ausgewertet wird)
- Beide value-Optionen müssen dieselbe Bitbreite haben. Falls sie sich unterscheiden, erweitert Verilog die schmalere Option stillschweigend
- Der Operator kann in kontinuierlichen Zuweisungen (
assign) und prozeduralen Blöcken (always,initial) verwendet werden
Aufgabe
Schreibe die korrekten bedingten Ausdrücke für jede Aufgabe.
Aufgabe:
- Setze
maxauf denlargeren Wert vonxundy - Setze
absauf denabsoluteWert vonval(falls negativ, mache ihn positiv) - Setze
output_dataaufdata, fallsenablegleich 1 ist, andernfalls auf8'b0
Probier es selbst
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 = ______; // größerer von x und y
abs = ______; // Absolutwert von val
output_data = ______; // data wenn enable, sonst 0
$display("max = %d", max);
$display("abs = %d", abs);
$display("output_data = %b", output_data);
$finish;
end
endmoduleDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Einführung
Was ist VerilogHardware vs. SoftwareIhr erstes ModulKommentareAbstraktionsebenen des Designs4Operators 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Übe selbstständig: Online-Verilog-Compiler