Menu
CoddyTech

Operador condicional

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

El operador condicional ? : elige entre dos valores según una condición. También se llama 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 toma 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, la salida se invierte; de lo contrario, permanece 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 varias selecciones:

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

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

Notas importantes

  • La condición se considera verdadera cuando se evalúa como un valor distinto de cero (conocido)
  • Mantén ambas opciones de valor con el mismo ancho de bits; si difieren, Verilog extiende silenciosamente la más estrecha
  • El operador puede usarse en asignaciones continuas (assign) y bloques procedimentales (always, initial)
challenge icon

Desafío

Escribe las expresiones condicionales correctas para cada tarea.

Qué hacer:

  1. Asigna a max el mayor de x y y
  2. Asigna a abs el valor absoluto de val (si es negativo, conviértelo en positivo)
  3. Asigna a output_data el valor de data si enable es 1; de lo contrario, asígnale 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, de lo contrario 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