Operatore condizionale
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 28 di 90.
L’operatore condizionale ? : seleziona tra due valori in base a una condizione. È anche chiamato 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 recebe o maior valor entre 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'output è invertito; altrimenti rimane invariatoEsempio 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
endmoduleOutput:
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 deve essere un singolo bit (o un'espressione che restituisce 0 o 1)
- Mantieni entrambe le opzioni di valore della stessa larghezza in bit; se differiscono, Verilog estende silenziosamente quella più corta
- 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
maxsul maggiore traxey - Imposta
abssul 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 = ______; // el mayor de x e y
abs = ______; // valor absoluto de val
output_data = ______; // data si enable; de lo contrario, 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