Menu
Coddy logo textTech

Operatori di riduzione

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 25 di 90.

Gli operatori di riduzione agiscono su tutti i bit di un singolo vettore e li riducono a un risultato di un singolo bit. A differenza degli operatori bitwise, che confrontano due numeri bit per bit, gli operatori di riduzione prendono un numero ed eseguono un’operazione su tutti i suoi bit per produrre un unico risultato.

 

OperatoreOperazioneRisultato
&AND di riduzione1 se tutti i bit sono 1
|OR di riduzione1 se almeno un bit è 1
^XOR di riduzione1 se un numero dispari di bit è 1
~&NAND di riduzione0 se tutti i bit sono 1
~|NOR di riduzione0 se almeno un bit è 1
~^XNOR di riduzione1 se un numero pari di bit è 1

Come funzionano

AND di riduzione (<strong>&</strong>):

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // non tutti i bit sono 1
&4'b0000 = 0   // all bits are 0

OR di riduzione (<strong>|</strong>):

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // almeno un bit è 1
|4'b1111 = 1   // all bits are 1

XOR di riduzione (<strong>^</strong>):

^4'b1010 = 0   // two 1's (even) → 0
^4'b1000 = 1   // one 1 (odd) → 1
^4'b1111 = 0   // quattro 1 (pari) → 0

Esempio di codice

module reduction_demo;
  reg [3:0] a, b, c;
  reg and_red, or_red, xor_red;
  
  initial begin
    a = 4'b1111;
    b = 4'b1010;
    c = 4'b1000;
    
    and_red = &a;      // 1111 → 1
    or_red  = |b;      // 1010 → 1
    xor_red = ^c;      // 1000 → 1
    
    $display("&4'b1111 = %d", and_red);
    $display("|4'b1010 = %d", or_red);
    $display("^4'b1000 = %d", xor_red);
    $finish;
  end
endmodule

Output:

&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1

Usi comuni

Verifica se tutti i bit sono 1:

all_ones = &data;   // 1 se data == 8'b11111111

Verifica se almeno un bit è 1:

any_one = |data;    // 1 se data != 0

Verifica la parità (numero dispari di 1):

odd_parity = ^data; // 1 se il numero di 1 è dispari

Verifica se tutti i bit sono 0:

all_zeros = ~|data; // 1 se data == 0
challenge icon

Sfida

Scrivi le espressioni di riduzione corrette per ciascun compito.

Cosa fare:

  1. Verifica se tutti i bit di a sono 1 e memorizza il risultato in all_ones
  2. Verifica se almeno un bit di b è 1 e memorizza il risultato in any_one
  3. Verifica se c ha un numero dispari di 1 e memorizza il risultato in odd_parity

Provalo tu

module reduction_challenge;
  reg [3:0] a, b, c;
  reg all_ones, any_one, odd_parity;
  
  initial begin
    a = 4'b1111;
    b = 4'b0100;
    c = 4'b1011;
    
    all_ones  = ______;   // all bits 1?
    any_one   = ______;   // any bit 1?
    odd_parity = ______;   // odd number of 1's?
    
    $display("&4'b1111 = %d", all_ones);
    $display("|4'b0100 = %d", any_one);
    $display("^4'b1011 = %d", odd_parity);
    $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