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, vimos la asignación bloqueante (=), que se ejecuta paso a paso. Ahora veremos la asignación no bloqueante (<=), que se ejecuta toda a la vez, en paralelo.

La asignación no bloqueante utiliza el operador <=. Se denomina «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 únicamente en un flanco de reloj (normalmente el flanco ascendente).

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 antiguos. Al final del paso de tiempo, todas las actualizaciones ocurren juntas.

No predeterminados en bloques Always (lógica secuencial)

Las asignaciones no bloqueantes se usan para la lógica secuencial: circuitos que utilizan un reloj y tienen memoria (flip-flops, registros, contadores).

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

Ambas asignaciones ocurren al mismo tiempo, utilizando los valores anteriores al flanco del reloj.

Resumen

ReglaExplicación
Usa <= para la lógica secuencialalways @(posedge clk)
Usa = para la 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

Completa la asignación no bloqueante

Añade las asignaciones no bloqueantes que faltan para que este registro de desplazamiento de 2 bits funcione.

Cómo funciona:

  • En cada flanco de reloj, q1 obtiene d
  • q2 obtiene el valor anterior de q1

Qué hacer:

  1. Asigna d a q1 (sin bloqueo)
  2. Asigna q1 a q2 (sin bloqueo)

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

Practica por tu cuenta: Compilador de Verilog online