Opérateur conditionnel
Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 28 sur 90.
L'opérateur conditionnel ? : sélectionne entre deux valeurs en fonction d'une condition. Il est également appelé l'opérateur ternaire. L'opérateur conditionnel évalue une condition et renvoie l'une des deux valeurs :
condition ? value_if_true : value_if_falseSi la condition est vraie (1), la première valeur est retournée. Si elle est fausse (0), la seconde valeur est retournée.
Pourquoi utiliser l'opérateur conditionnel
C'est un moyen compact d'écrire une logique simple if-else sur une seule ligne. Les utilisations courantes incluent :
- La sélection entre deux signaux
- La création de multiplexeurs
- La définition de valeurs par défaut
- Les affectations conditionnelles en ligne
Syntaxe et exemples
Exemple de base :
result = (a > b) ? a : b; // result reçoit la plus grande valeur entre a et bSélectionner entre des valeurs :
data_out = (enable) ? data_in : 8'b00000000; // Sortie des données si activé, sinon 0Inverser le signal de manière conditionnelle :
out = (invert) ? ~in : in; // Si invert est 1, la sortie est inversée ; sinon elle est inchangéeExemple de code
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
endmoduleSortie :
max = 9
data_out = 1010Opérateurs conditionnels imbriqués
Vous pouvez imbriquer des opérateurs conditionnels pour des sélections multiples :
result = (a > b) ? a : (b > c) ? b : c; // Trouver la plus grande des trois valeursUtilisez des parenthèses pour clarifier les conditions imbriquées.
Notes importantes
- La condition doit être un bit unique (ou une expression qui s'évalue à 0 ou 1)
- Les deux options de valeur doivent avoir la même largeur de bits
- L'opérateur peut être utilisé dans des affectations continues (
assign) et des blocs procéduraux (always,initial)
Défi
Écrivez les expressions conditionnelles correctes pour chaque tâche.
Ce qu'il faut faire :
- Définissez
maxsur la plus grande valeur entrexety - Définissez
abssur la valeur absolue deval(si négative, rendez-la positive) - Définissez
output_datasurdatasienableest 1, sinon sur8'b0
Aide-mémoire
L'opérateur conditionnel (ternaire) ? : sélectionne entre deux valeurs en fonction d'une condition :
condition ? value_if_true : value_if_falseExemples :
max = (a > b) ? a : b; // le plus grand de a et b
data_out = (enable) ? data_in : 8'b0; // sort les données si activé, sinon 0
out = (invert) ? ~in : in; // inverse le signal de manière conditionnelleOpérateurs conditionnels imbriqués :
result = (a > b) ? a : (b > c) ? b : c; // le plus grand des trois valeursRemarques :
- La condition doit s'évaluer à 0 ou 1
- Les deux options de valeur doivent avoir la même largeur de bits
- Utilisable dans les blocs
assign,alwaysetinitial
Essayez vous-même
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 = ______; // le plus grand entre x et y
abs = ______; // valeur absolue de val
output_data = ______; // data si enable, sinon 0
$display("max = %d", max);
$display("abs = %d", abs);
$display("output_data = %b", output_data);
$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