Menu
Coddy logo textTech

Operador condicional

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 condición 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 simple de if-else en una sola línea. Entre los usos comunes se incluyen:

  • Seleccionar entre dos señales
  • 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

Invertir la señal condicionalmente:

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

Salida:

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 condición debe ser un solo bit (o una expresión que evalúe a 0 o 1)
  • Mantén ambas opciones de valor con el mismo ancho de bit; si difieren, Verilog amplía silenciosamente la más estrecha
  • El operador se puede usar en asignaciones continuas (assign) y bloques procedurales (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