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érateur | Opération | Résultat |
|---|---|---|
& | ET de réduction | 1 si tous les bits sont à 1 |
| | OU de réduction | 1 si au moins un bit est à 1 |
^ | XOR de réduction | 1 si un nombre impair de bits sont à 1 |
~& | NAND de réduction | 0 si tous les bits sont à 1 |
~| | NOR de réduction | 0 si au moins un bit est à 1 |
~^ | XNOR de réduction | 1 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 à 0Ré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 à 1Réduction XOR (<strong>^</strong>) :
^4'b1010 = 0 // deux 1 (pair) → 0
^4'b1000 = 1 // un 1 (impair) → 1
^4'b1111 = 0 // quatre 1 (pair) → 0Exemple 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
endmoduleSortie :
&4'b1111 = 1
|4'b1010 = 1
^4'b1000 = 1Utilisations courantes
Vérifier si tous les bits sont à 1 :
all_ones = &data; // 1 si data == 8'b11111111Vérifier si au moins un bit est à 1 :
any_one = |data; // 1 si data != 0Vérifier la parité (nombre impair de 1) :
odd_parity = ^data; // 1 si le nombre de 1 est impairVérifier si tous les bits sont à 0 :
all_zeros = ~|data; // 1 si data == 0Défi
Écrivez les expressions de réduction correctes pour chaque tâche.
Ce qu'il faut faire :
- Vérifiez si tous les bits de
asont à 1 et stockez le résultat dansall_ones - Vérifiez si n'importe quel bit de
best à 1 et stockez le résultat dansany_one - Vérifiez si
cpossède un nombre impair de 1 et stockez le résultat dansodd_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érateur | Opération | Résultat |
|---|---|---|
& | ET de réduction | 1 si tous les bits sont à 1 |
| | OU de réduction | 1 si au moins un bit est à 1 |
^ | XOR de réduction | 1 si un nombre impair de bits sont à 1 |
~& | NAND de réduction | 0 si tous les bits sont à 1 |
~| | NOR de réduction | 0 si au moins un bit est à 1 |
~^ | XNOR de réduction | 1 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 == 0Essayez 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
endmoduleCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1Introduction
Qu'est-ce que VerilogHardware vs SoftwareNiveaux d'abstraction de conceptionVotre premier moduleCommentaires4Opérateurs - Partie 1
Opérateurs arithmétiquesOpérateur moduloOpérateurs de comparaisonRécapitulatif - Mathématiques simplesOpérateurs bit à bit7Assignation et portes logiques
Assignation continueAssignation avec opérateursPrimitives de portes intégréesPortes AND OR NOTPortes XOR XNORRécapitulatif - Circuit à portes logiques10Prise de décision
Instruction IfIf - ElseRécapitulatif - Comparateur simpleInstruction CaseCasex et CasezRécapitulatif - Conception d'ALU2Types de données
Type WireType RegEntiers et RéelsVecteursTableauxParamètresRécapitulatif - Déclarer des signaux5Opérateurs - Partie 2
Opérateurs logiquesOpérateurs de réductionOpérateurs de décalageOpérateur de concaténationOpérateur conditionnelRécapitulatif - Défi sur les opérateurs11Boucles
Boucle ForBoucle WhileBoucle RépéterBoucle InfinieInstruction DisableRécapitulatif - Modèles de boucles3Système de numération
Représentation binaireNombres avec tailleNombres sans tailleNombres négatifsValeurs spéciales X et ZRécapitulatif - Formats de nombres6Modules
Structure d'un modulePorts d'entrée et de sortiePorts InoutInstanciation de moduleMappage de ports par nomMappage de ports par ordreRécapitulatif - Créer un module9Blocs procéduraux
Bloc AlwaysBloc InitialListe de sensibilitéAffectation bloquanteAffectation non bloquanteRécapitulatif - Always vs Initial12Projet Multiplexeur
Conception d'un Mux 2 vers 1Conception d'un Mux 4 vers 115Contrôleur de feux de circulation
Définition des étatsLogique de la machine à états