Menu
Coddy logo textTech

Conditional Operator

Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 28 de 90.

El operador condicional ? : selecciona entre dos valores según una condición. También se denomina operador ternario. El operador condicional evalúa una condición y devuelve uno de dos valores:

condition ? value_if_true : value_if_false

Si la condition es verdadera (1), se devuelve el primer valor. Si es falsa (0), se devuelve el segundo valor.

Por qué usar el operador condicional

Es una forma compacta de escribir una lógica if-else simple en una sola línea. Entre sus usos comunes se incluyen:

  • Seleccionar entre dos signal
  • Crear multiplexores
  • Establecer valores predeterminados
  • Asignaciones condicionales en línea

Sintaxis y ejemplos

Ejemplo básico:

result = (a > b) ? a : b;   // result obtiene el mayor de a y b

Selecciona entre valores:

data_out = (enable) ? data_in : 8'b00000000;   // Output data if enabled, else 0

Invert signal conditionally:

out = (invert) ? ~in : in;   // Si invert es 1, salida invertida; de lo contrario, sin cambios

Ejemplo de código

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

Output:

max = 9
data_out = 1010

Operadores condicionales anidados

Puedes anidar operadores condicionales para realizar selecciones múltiples:

result = (a > b) ? a : (b > c) ? b : c;   // a si a > b, de lo contrario el mayor de b y c

Usa paréntesis para que las condiciones anidadas sean claras.

Notas importantes

  • La condition debe ser un solo bit (o una expresión que se evalúe como 0 o 1)
  • Mantén ambas opciones de valores con el mismo ancho de bit; si difieren, Verilog extiende silenciosamente la más estrecha
  • El operador puede utilizarse en asignaciones continuas (assign) y bloques procedimentales (always, initial)
challenge icon

Desafío

Escribe las expresiones condicionales correctas para cada tarea.

Qué hacer:

  1. Establece max como el mayor entre x y y
  2. Establece abs como el valor absoluto de val (si es negativo, hazlo positivo)
  3. Establece output_data en data si enable es 1; de lo contrario, en 8'b0

Pruébalo tú mismo

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 = ______;          // el mayor de x e y
    abs = ______;          // valor absoluto de val
    output_data = ______;  // data si enable, sino 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos

Practica por tu cuenta: Compilador de Verilog online