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 basándose en una condición. También se le 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 if-else 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

Seleccionar entre valores:

data_out = (enable) ? data_in : 8'b00000000;   // Salida de datos si está habilitado, de lo contrario 0

Invertir 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 selecciones múltiples:

result = (a > b) ? a : (b > c) ? b : c;   // Encontrar el mayor de tres valores

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

Notas importantes

  • La condición debe ser un solo bit (o una expresión que se evalúe como 0 o 1)
  • Ambas opciones de valor deben tener el mismo ancho de bits
  • 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. Establece max al mayor entre x e y
  2. Establece abs al valor absoluto de val (si es negativo, hazlo positivo)
  3. Establece output_data a data si enable es 1, de lo contrario a 8'b0

Hoja de referencia

El operador condicional (ternario) ? : selecciona entre dos valores basándose en una condición:

condition ? value_if_true : value_if_false

Ejemplos:

max      = (a > b) ? a : b;                  // el mayor de a y b
data_out = (enable) ? data_in : 8'b0;        // salida de datos si está habilitado, de lo contrario 0
out      = (invert) ? ~in : in;              // invertir señal condicionalmente

Operadores condicionales anidados:

result = (a > b) ? a : (b > c) ? b : c;     // el mayor de tres valores

Notas:

  • La condición debe evaluarse como 0 o 1
  • Ambas opciones de valor deben tener el mismo ancho de bits
  • Utilizable en bloques assign, always e initial

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