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 s'appliquent à tous les bits d'un vecteur unique et les réduisent en un résultat sur un seul bit. Contrairement aux opérateurs bit à bit qui comparent deux nombres bit par bit, les opérateurs de réduction prennent un seul nombre et effectuent une opération sur l'ensemble de 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   // tous les bits sont à 1
&4'b1011 = 0   // tous les bits ne sont pas à 1
&4'b0000 = 0   // tous les bits sont à 0

Réduction OU (<strong>|</strong>) :

|4'b0000 = 0   // aucun bit n'est à 1
|4'b0100 = 1   // au moins un bit est à 1
|4'b1111 = 1   // tous les bits sont à 1

Réduction XOR (<strong>^</strong>) :

^4'b1010 = 0   // deux 1 (pair) → 0
^4'b1000 = 1   // un 1 (impair) → 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 au moins un bit est à 1 :

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

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

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

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 n'importe quel bit de b est à 1 et stockez le résultat dans any_one
  3. Vérifiez si c possède un nombre impair de 1 et stockez le résultat dans odd_parity

Aide-mémoire

Les opérateurs de réduction agissent sur tous les bits d'un seul vecteur et les réduisent à un résultat d'un seul bit.

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

Utilisations courantes :

all_ones   = &data;   // 1 si tous les bits sont à 1
any_one    = |data;   // 1 si n'importe quel bit est à 1 (data != 0)
odd_parity = ^data;   // 1 si nombre impair de 1
all_zeros  = ~|data;  // 1 si data == 0

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