Menu
Coddy logo textTech

Asignación no bloqueante

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 50 de 90.

En la lección anterior, cubrimos la asignación bloqueante (=), que se ejecuta paso a paso. Ahora cubriremos la asignación no bloqueante (<=), que se ejecuta toda a la vez — en paralelo.

La asignación no bloqueante utiliza el operador <=. Se llama "no bloqueante" porque no bloquea la ejecución de la siguiente instrucción. Todas las asignaciones no bloqueantes de un bloque se ejecutan al mismo tiempo.

Sintaxis:

variable <= expression;

Cuándo usar la asignación no bloqueante

La asignación no bloqueante (<=) se utiliza para la lógica secuencial: circuitos que usan un reloj y tienen memoria. Las salidas cambian solo en un flanco de reloj (generalmente el flanco de subida).

Ejemplos de lógica secuencial:

  • Flip-flops
  • Registros
  • Contadores
  • Máquinas de estados
  • Registros de desplazamiento

Ejemplo de Verilog:

initial begin
  a <= 5;      // Programado, pero aún no ejecutado
  b <= a + 2;  // Programado, usa el valor ANTIGUO de a
  c <= b * 3;  // Programado, usa el valor ANTIGUO de b
end

Las tres asignaciones ocurren al mismo tiempo usando los valores anteriores. Al final del paso de tiempo, todas las actualizaciones ocurren juntas.

No bloqueante en bloques Always (Lógica secuencial)

La asignación no bloqueante se utiliza para la lógica secuencial: circuitos que usan un reloj y tienen memoria (flip-flops, registros, contadores).

always @(posedge clk) begin
  q <= d;           // q obtiene d en el flanco del reloj
  count <= count + 1; // count se incrementa en el flanco del reloj
end

Ambas asignaciones ocurren al mismo tiempo, usando valores de antes del flanco de reloj.

Resumen

ReglaExplicación
Use <= para lógica secuencialalways @(posedge clk)
Use = para lógica combinacionalalways @(*)
La asignación no bloqueante se ejecuta en paraleloTodas las asignaciones ocurren a la vez
Los valores se actualizan al final del paso de tiempoNo inmediatamente
challenge icon

Desafío

Complete the Non-Blocking Assignment

Añada las asignaciones no bloqueantes que faltan para que este registro de desplazamiento (shift register) de 2 bits funcione.

Cómo funciona:

  • En cada flanco de reloj (clock edge), q1 obtiene d
  • q2 obtiene el valor antiguo de q1

Qué hacer:

  1. Asigne d a q1 (no bloqueante)
  2. Asigne q1 a q2 (no bloqueante)

Pruébalo tú mismo

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Añadir lógica de desplazamiento
      // Paso 1: Asignar d a q1 (no bloqueante)
      // Paso 2: Asignar q1 a q2 (no bloqueante)
    end
  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