Menu
CoddyTech

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_false

Se 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 b

Seleziona tra i valori:

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

Inverti il segnale in modo condizionale:

out = (invert) ? ~in : in;   // Se invert è 1, l'uscita è invertita; altrimenti rimane invariata

Esempio 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
endmodule

Uscita:

max = 9
data_out = 1010

Operatori 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 c

Usa 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)
challenge icon

Sfida

Scrivi le espressioni condizionali corrette per ogni attività.

Cosa fare:

  1. Imposta max al valore più grande tra x e y
  2. Imposta abs al valore assoluto di val (se negativo, rendilo positivo)
  3. Imposta output_data su data se enable è 1, altrimenti su 8'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
endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online