Bedingter Operator
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy. Lektion 28 von 90.
Der Bedingungsoperator ? : wählt abhängig von einer Bedingung zwischen zwei Werten aus. Er wird auch ternärer Operator genannt. Der Bedingungsoperator wertet eine Bedingung aus und gibt einen von zwei Werten zurück:
condition ? value_if_true : value_if_falseWenn die Bedingung wahr (1) ist, wird der erste Wert zurückgegeben. Wenn sie falsch (0) ist, wird der zweite Wert zurückgegeben.
Warum den Bedingungsoperator verwenden?
Damit lässt sich eine einfache Wenn-sonst-Logik kompakt in einer einzigen Zeile schreiben. Häufige Anwendungsfälle sind:
- Auswahl zwischen zwei Signalen
- Erstellen von Multiplexern
- Festlegen von Standardwerten
- Bedingte Zuweisungen direkt in einer Zeile
Syntax und Beispiele
Grundlegendes Beispiel:
result = (a > b) ? a : b; // result erhält den größeren Wert 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, wird die Ausgabe invertiert; andernfalls bleibt sie 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 Auswahlmöglichkeiten verschachteln:
result = (a > b) ? a : (b > c) ? b : c; // a, wenn a > b, andernfalls der größere Wert von b und cVerwende Klammern, um verschachtelte Bedingungen verständlich zu machen.
Wichtige Hinweise
- Die Bedingung gilt als wahr, wenn sie zu einem Wert ungleich null (bekannt) ausgewertet wird
- Achte darauf, dass beide Wertoptionen dieselbe Bitbreite haben. Wenn 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 richtigen bedingten Ausdrücke für jede Aufgabe.
Was zu tun ist:
- Setze
maxauf den größeren Wert vonxundy - Setze
absauf den Absolutwert vonval(wenn negativ, mache ihn positiv) - Setze
output_dataaufdata, wennenable1 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 = ______; // der größere Wert von x und y
abs = ______; // der 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 Designs4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – einfache MathematikBitweise Operatoren7Zuweisungen und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-GrundelementeUND-, ODER- und NICHT-GatterXOR- und XNOR-GatterRückblick – Logikgatter-Schaltung10Entscheidungsfindung
If-AnweisungIf – ElseRückblick – Einfacher KomparatorCase-AnweisungCasex und CasezRückblick – ALU-Entwurf13Zeitsteuerung und Verzögerungen
Was sind Verzögerungen?GatterverzögerungenZuweisungsverzögerungenTimescale-DirektiveTakterzeugungZusammenfassung – Zeitsteuerung2Datentypen
Wire-TypReg-TypInteger und RealVektorenArraysParameterZusammenfassung – Signale deklarieren5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenSchiebeoperatorenVerkettungsoperatorBedingter OperatorRückblick – Operatoren-Herausforderung11Schleifen
For-SchleifeWhile-SchleifeWiederholungsschleifeEndlosschleifeAnweisung deaktivierenRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit fester BreiteZahlen ohne feste BreiteNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturInput- und Output-PortsInout-PortsModulinstanziierungPortzuordnung nach NamenPortzuordnung nach ReihenfolgeRückblick – Ein Modul erstellenÜbe selbstständig: Online-Verilog-Compiler