Bedingter Operator
Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 28 von 90.
Der Bedingungsoperator ? : wählt basierend auf einer Bedingung zwischen zwei Werten aus. Er wird auch als ternärer Operator bezeichnet. 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
Es ist eine kompakte Art, einfache if-else-Logik in einer einzigen Zeile zu schreiben. Häufige Anwendungsfälle sind:
- Auswahl zwischen zwei Signalen
- Erstellen von Multiplexern
- Festlegen von Standardwerten
- Inline-Bedingungszuweisungen
Syntax und Beispiele
Grundlegendes Beispiel:
result = (a > b) ? a : b; // result erhält den größeren Wert von a und bZwischen Werten wählen:
data_out = (enable) ? data_in : 8'b00000000; // Daten ausgeben, wenn aktiviert, sonst 0Signal bedingt invertieren:
out = (invert) ? ~in : in; // Wenn invert 1 ist, wird der Ausgang invertiert; sonst unverändertCode-Beispiel
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 Bedingungsoperatoren
Sie können Bedingungsoperatoren für Mehrfachauswahlen verschachteln:
result = (a > b) ? a : (b > c) ? b : c; // Findet den größten von drei WertenVerwenden Sie Klammern, um verschachtelte Bedingungen zu verdeutlichen.
Wichtige Hinweise
- Die Bedingung muss ein einzelnes Bit sein (oder ein Ausdruck, der zu 0 oder 1 ausgewertet wird)
- Beide Wertoptionen müssen dieselbe Bitbreite haben
- Der Operator kann in kontinuierlichen Zuweisungen (
assign) und prozeduralen Blöcken (always,initial) verwendet werden
Aufgabe
Schreiben Sie die korrekten bedingten Ausdrücke für jede Aufgabe.
Was zu tun ist:
- Setzen Sie
maxauf den größeren Wert vonxundy - Setzen Sie
absauf den Absolutwert vonval(wenn negativ, machen Sie ihn positiv) - Setzen Sie
output_dataaufdata, wennenable1 ist, andernfalls auf8'b0
Spickzettel
Der bedingte (ternäre) Operator ? : wählt basierend auf einer Bedingung zwischen zwei Werten aus:
condition ? value_if_true : value_if_falseBeispiele:
max = (a > b) ? a : b; // der größere Wert von a und b
data_out = (enable) ? data_in : 8'b0; // Datenausgabe wenn aktiviert, sonst 0
out = (invert) ? ~in : in; // Signal bedingt invertierenVerschachtelte bedingte Operatoren:
result = (a > b) ? a : (b > c) ? b : c; // der größte von drei WertenHinweise:
- Die Bedingung muss zu 0 oder 1 ausgewertet werden
- Beide Wertoptionen müssen die gleiche Bitbreite haben
- Verwendbar in
assign-,always- undinitial-Blöcken
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 = ______; // 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. SoftwareAbstraktionsebenen im DesignDein erstes ModulKommentare4Operatoren Teil 1
Arithmetische OperatorenModulo-OperatorVergleichsoperatorenWiederholung – Einfache MathematikBitweise Operatoren7Zuweisung und Gatter
Kontinuierliche ZuweisungZuweisung mit OperatorenIntegrierte Gatter-PrimitiveAND OR NOT GatterXOR XNOR GatterZusammenfassung - Logikgatterschaltung10Entscheidungsfindung
If-AnweisungIf - ElseWiederholung - Einfacher KomparatorCase-AnweisungCasex und CasezWiederholung - ALU-Design5Operatoren Teil 2
Logische OperatorenReduktionsoperatorenShift-OperatorenVerkettungsoperatorBedingter OperatorZusammenfassung – Operator-Challenge11Schleifen
For-SchleifeWhile-SchleifeRepeat-SchleifeEndlosschleifeDisable-AnweisungRückblick – Schleifenmuster3Zahlensystem
Binäre DarstellungZahlen mit GrößenangabeZahlen ohne GrößenangabeNegative ZahlenSpezialwerte X und ZZusammenfassung – Zahlenformate6Module
ModulstrukturEingangs- und Ausgangs-PortsInout-PortsModul-InstanziierungPort-Mapping nach NamePort-Mapping nach ReihenfolgeZusammenfassung – Ein Modul erstellen