Menu
CoddyTech

Opérateur conditionnel

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 28 sur 90.

L’opérateur conditionnel ? : choisit entre deux valeurs en fonction d’une condition. On l’appelle également l’opérateur ternaire. L’opérateur conditionnel évalue une condition et renvoie l’une de deux valeurs :

condition ? value_if_true : value_if_false

Si la condition est vraie (1), la première valeur est renvoyée. Si elle est fausse (0), la deuxième valeur est renvoyée.

Pourquoi utiliser l’opérateur conditionnel

C’est une manière compacte d’écrire une logique simple de type if-else sur une seule ligne. Parmi ses utilisations courantes :

  • Choisir entre deux signaux
  • Créer des multiplexeurs
  • Définir des valeurs par défaut
  • 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;   // Output data if enabled, else 0

Inverser le signal sous condition :

out = (invert) ? ~in : in;   // Si invert vaut 1, la sortie est inversée ; sinon, elle reste 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

Tu peux imbriquer des opérateurs conditionnels pour effectuer plusieurs sélections :

result = (a > b) ? a : (b > c) ? b : c;   // a si a > b, sinon le plus grand de b et c

Utilise des parenthèses pour clarifier les conditions imbriquées.

Remarques importantes

  • La condition est considérée comme vraie lorsqu’elle s’évalue à une valeur connue non nulle
  • Gardez les deux options de valeur sur la même largeur de bits ; si elles diffèrent, Verilog étend silencieusement la plus étroite
  • 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.

Que faire :

  1. Définissez max comme étant la plus grande valeur entre x et y
  2. Définissez abs comme étant la valeur absolue de val (si elle est négative, rendez-la positive)
  3. Définissez output_data sur data si enable vaut 1, sinon sur 8'b0

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 = ______;          // la plus grande valeur entre x et y
    abs = ______;          // la 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

Entraînez-vous par vous-même : Compilateur Verilog en ligne