Menu
CoddyTech

Operator warunkowy

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 28 z 90.

Operator warunkowy ? : wybiera jedną z dwóch wartości na podstawie warunku. Jest również nazywany operatorem trójargumentowym. Operator warunkowy ocenia warunek i zwraca jedną z dwóch wartości:

condition ? value_if_true : value_if_false

Jeśli warunek jest prawdziwy (1), zwracana jest pierwsza wartość. Jeśli jest fałszywy (0), zwracana jest druga wartość.

Dlaczego warto używać operatora warunkowego

To zwięzły sposób na zapisanie prostej logiki if-else w jednym wierszu. Typowe zastosowania obejmują:

  • Wybieranie między dwoma sygnałami
  • Tworzenie multiplekserów
  • Ustawianie wartości domyślnych
  • Przypisania warunkowe w jednym wierszu

Składnia i przykłady

Podstawowy przykład:

result = (a > b) ? a : b;   // result otrzymuje większą z wartości a i b

Wybierz jedną z wartości:

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

Odwróć sygnał warunkowo:

out = (invert) ? ~in : in;   // Jeśli invert ma wartość 1, wyjście jest zanegowane; w przeciwnym razie pozostaje bez zmian

Przykład kodu

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

Wynik:

max = 9
data_out = 1010

Zagnieżdżone operatory warunkowe

Możesz zagnieżdżać operatory warunkowe, aby dokonywać wielu wyborów:

result = (a > b) ? a : (b > c) ? b : c;   // a, jeśli a > b, w przeciwnym razie większa z wartości b i c

Używaj nawiasów, aby warunki zagnieżdżone były czytelne.

Ważne uwagi

  • Warunek jest uznawany za prawdziwy, gdy jego obliczenie daje wartość różną od zera (znaną)
  • Obie opcje wartości powinny mieć tę samą szerokość bitową; jeśli się różnią, Verilog po cichu rozszerza węższą z nich
  • Operatora można używać w przypisaniach ciągłych (assign) i blokach proceduralnych (always, initial)
challenge icon

Wyzwanie

Zapisz poprawne wyrażenia warunkowe dla każdego zadania.

Co zrobić:

  1. Ustaw max na większą z wartości x i y
  2. Ustaw abs na wartość bezwzględną val (jeśli jest ujemna, zamień ją na dodatnią)
  3. Ustaw output_data na data , jeśli enable wynosi 1, w przeciwnym razie ustaw na 8'b0

Spróbuj swoich sił

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 = ______;          // większa z wartości x i y
    abs = ______;          // wartość bezwzględna val
    output_data = ______;  // data, jeśli enable, w przeciwnym razie 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online