Menu
Coddy logo textTech

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_false

Wenn 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 b

Zwischen Werten wählen:

data_out = (enable) ? data_in : 8'b00000000;   // Daten ausgeben, wenn aktiviert, sonst 0

Signal bedingt invertieren:

out = (invert) ? ~in : in;   // Wenn invert 1 ist, wird der Ausgang invertiert; sonst unverändert

Code-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
endmodule

Ausgabe:

max = 9
data_out = 1010

Verschachtelte Bedingungsoperatoren

Sie können Bedingungsoperatoren für Mehrfachauswahlen verschachteln:

result = (a > b) ? a : (b > c) ? b : c;   // Findet den größten von drei Werten

Verwenden 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
challenge icon

Aufgabe

Schreiben Sie die korrekten bedingten Ausdrücke für jede Aufgabe.

Was zu tun ist:

  1. Setzen Sie max auf den größeren Wert von x und y
  2. Setzen Sie abs auf den Absolutwert von val (wenn negativ, machen Sie ihn positiv)
  3. Setzen Sie output_data auf data , wenn enable 1 ist, andernfalls auf 8'b0

Spickzettel

Der bedingte (ternäre) Operator ? : wählt basierend auf einer Bedingung zwischen zwei Werten aus:

condition ? value_if_true : value_if_false

Beispiele:

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 invertieren

Verschachtelte bedingte Operatoren:

result = (a > b) ? a : (b > c) ? b : c;     // der größte von drei Werten

Hinweise:

  • Die Bedingung muss zu 0 oder 1 ausgewertet werden
  • Beide Wertoptionen müssen die gleiche Bitbreite haben
  • Verwendbar in assign-, always- und initial-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
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen