Menu
Coddy logo textTech

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. Nazywany jest również operatorem trójargumentowym. Operator warunkowy sprawdza 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 zapisu 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 jednej linii

Składnia i przykłady

Podstawowy przykład:

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

Wybieranie między wartościami:

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

Warunkowo odwróć sygnał:

out = (invert) ? ~in : in;   // Jeśli invert wynosi 1, wynik jest odwrócony; 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

Wyjście:

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żyj nawiasów, aby wyraźnie zapisać zagnieżdżone warunki.

Ważne uwagi

  • Warunek musi być pojedynczym bitem (lub wyrażeniem, którego wynikiem jest 0 albo 1)
  • Zadbaj o to, by obie opcje wartości miały 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

Napisz 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, a w przeciwnym razie 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