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_falseJeś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 bWybieranie między wartościami:
data_out = (enable) ? data_in : 8'b00000000; // Output data if enabled, else 0Warunkowo odwróć sygnał:
out = (invert) ? ~in : in; // Jeśli invert wynosi 1, wynik jest odwrócony; w przeciwnym razie pozostaje bez zmianPrzykł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
endmoduleWyjście:
max = 9
data_out = 1010Zagnież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 cUż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)
Wyzwanie
Napisz poprawne wyrażenia warunkowe dla każdego zadania.
Co zrobić:
- Ustaw
maxna większą z wartościxiy - Ustaw
absna wartość bezwzględnąval(jeśli jest ujemna, zamień ją na dodatnią) - Ustaw
output_datanadata, jeślienablewynosi 1, a w przeciwnym razie na8'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
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online