Menu
Coddy logo textTech

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_false

Si 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 b

Sélectionner entre des valeurs :

data_out = (enable) ? data_in : 8'b00000000;   // Sortie des données si activé, sinon 0

Inverser le signal de manière conditionnelle :

out = (invert) ? ~in : in;   // Si invert est 1, la sortie est inversée ; sinon elle est inchangée

Exemple 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
endmodule

Sortie :

max = 9
data_out = 1010

Opé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 valeurs

Utilisez 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)
challenge icon

Défi

Écrivez les expressions conditionnelles correctes pour chaque tâche.

Ce qu'il faut faire :

  1. Définissez max sur la plus grande valeur entre x et y
  2. Définissez abs sur la valeur absolue de val (si négative, rendez-la positive)
  3. Définissez output_data sur data si enable est 1, sinon sur 8'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_false

Exemples :

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 conditionnelle

Opérateurs conditionnels imbriqués :

result = (a > b) ? a : (b > c) ? b : c;     // le plus grand des trois valeurs

Remarques :

  • 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, always et initial

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