Menu
CoddyTech

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_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?

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 b

Zwischen Werten auswählen:

data_out = (enable) ? data_in : 8'b00000000;   // Output data if enabled, else 0

Signal bedingt invertieren:

out = (invert) ? ~in : in;   // Wenn invert 1 ist, wird die Ausgabe invertiert; andernfalls bleibt sie unverändert

Codebeispiel

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 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 c

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

Aufgabe

Schreibe die richtigen bedingten Ausdrücke für jede Aufgabe.

Was zu tun ist:

  1. Setze max auf den größeren Wert von x und y
  2. Setze abs auf den Absolutwert von val (wenn negativ, mache ihn positiv)
  3. Setze output_data auf data , wenn enable 1 ist, andernfalls auf 8'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
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

Übe selbstständig: Online-Verilog-Compiler