Operatore condizionale
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 28 di 90.
L'operatore condizionale ? : sceglie tra due valori in base a una condizione. È chiamato anche operatore ternario. L'operatore condizionale valuta una condizione e restituisce uno dei due valori:
condition ? value_if_true : value_if_falseSe la condizione è vera (1), viene restituito il primo valore. Se è falsa (0), viene restituito il secondo valore.
Perché usare l’operatore condizionale
È un modo compatto per scrivere una semplice logica if-else su una sola riga. Gli usi comuni includono:
- Selezionare tra due segnali
- Creare multiplexer
- Impostare valori predefiniti
- Assegnazioni condizionali inline
Sintassi ed esempi
Esempio di base:
result = (a > b) ? a : b; // result assume il valore maggiore tra a e bSeleziona tra i valori:
data_out = (enable) ? data_in : 8'b00000000; // Output data if enabled, else 0Inverti il segnale in modo condizionale:
out = (invert) ? ~in : in; // Se invert è 1, l'uscita è invertita; altrimenti rimane invariataEsempio di codice
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
endmoduleUscita:
max = 9
data_out = 1010Operatori condizionali annidati
Puoi annidare gli operatori condizionali per effettuare selezioni multiple:
result = (a > b) ? a : (b > c) ? b : c; // a se a > b, altrimenti il maggiore tra b e cUsa le parentesi per rendere chiare le condizioni annidate.
Note importanti
- La condizione è considerata vera quando restituisce un valore diverso da zero (noto)
- Mantieni entrambe le opzioni di valore con la stessa larghezza in bit; se differiscono, Verilog estende silenziosamente quella più stretta
- L'operatore può essere usato nelle assegnazioni continue (
assign) e nei blocchi procedurali (always,initial)
Sfida
Scrivi le espressioni condizionali corrette per ogni attività.
Cosa fare:
- Imposta
maxal valore più grande traxey - Imposta
absal valore assoluto dival(se negativo, rendilo positivo) - Imposta
output_datasudataseenableè 1, altrimenti su8'b0
Provalo tu
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 = ______; // il maggiore tra x e y
abs = ______; // valore assoluto di val
output_data = ______; // data se enable, altrimenti 0
$display("max = %d", max);
$display("abs = %d", abs);
$display("output_data = %b", output_data);
$finish;
end
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online