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 le conoce como operador ternario. El operador condicional evalúa una condición y devuelve uno de los dos valores:

condition ? value_if_true : value_if_false

Si 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. Los usos comunes 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

Select between values:

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

Invertir señal condicionalmente:

out = (invert) ? ~in : in;   // Si invert es 1, salida invertida; si no, 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 múltiples selecciones:

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

Utilice paréntesis para hacer claras las condiciones anidadas.

Notas importantes

  • La condición debe ser un solo bit (o una expresión que se evalúe como 0 o 1)
  • Mantén ambas opciones de valor con el mismo ancho de bits; si difieren, Verilog extiende silenciosamente la más estrecha
  • El operador se puede utilizar 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 valor más grande entre x e y
  2. Asigna a abs el valor absoluto de val (si es negativo, hazlo positivo)
  3. Asigna a output_data el valor de data si enable es 1, de lo contrario 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