Menu
Coddy logo textTech

Opérateurs de réduction

Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 25 sur 90.

Les opérateurs de réduction fonctionnent sur tous les bits d'un seul vecteur et les réduisent à un résultat d'un seul bit. Contrairement aux opérateurs bit à bit qui comparent deux nombres bit à bit, les opérateurs de réduction prennent un seul nombre et effectuent une opération sur tous ses bits pour produire un résultat unique.

 

OpérateurOpérationRésultat
&ET de réduction1 si tous les bits sont à 1
|OU de réduction1 si au moins un bit est à 1
^XOR de réduction1 si un nombre impair de bits sont à 1
~&NAND de réduction0 si tous les bits sont à 1
~|NOR de réduction0 si au moins un bit est à 1
~^XNOR de réduction1 si un nombre pair de bits sont à 1

Comment ils fonctionnent

ET de réduction (<strong>&</strong>) :

&4'b1111 = 1   // all bits are 1
&4'b1011 = 0   // pas tous les bits sont à 1
&4'b0000 = 0   // all bits are 0

OU de réduction (<strong>|</strong>) :

|4'b0000 = 0   // no bits are 1
|4'b0100 = 1   // au moins un bit est à 1
|4'b1111 = 1   // all bits are 1

XOR de réduction (<strong>^</strong>) :

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

Exemple de code

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

Sortie :

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

Utilisations courantes

Vérifier si tous les bits sont à 1 :

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

Vérifier si un bit vaut 1 :

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

Vérifier la parité (nombre impair de 1) :

odd_parity = ^data; // 1 si nombre impair de 1

Vérifier si tous les bits sont à 0 :

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

Défi

Écrivez les expressions de réduction correctes pour chaque tâche.

Ce qu'il faut faire :

  1. Vérifiez si tous les bits de a sont à 1 et stockez le résultat dans all_ones
  2. Vérifiez si au moins un bit de b est à 1 et stockez le résultat dans any_one
  3. Vérifiez si c contient un number impair de 1 et stockez le résultat dans odd_parity

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux