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
endLas 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
endAmbas asignaciones ocurren al mismo tiempo, usando valores de antes del flanco de reloj.
Resumen
| Regla | Explicación |
|---|---|
Use <= para lógica secuencial | always @(posedge clk) |
Use = para lógica combinacional | always @(*) |
| La asignación no bloqueante se ejecuta en paralelo | Todas las asignaciones ocurren a la vez |
| Los valores se actualizan al final del paso de tiempo | No inmediatamente |
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),
q1obtiened q2obtiene el valor antiguo deq1
Qué hacer:
- Asigne
daq1(no bloqueante) - Asigne
q1aq2(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
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
¿Qué es Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - Circuito de Compuertas Lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores Parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalResumen - Desafío de operadores3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo9Bloques procedimentales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteResumen - Always vs Initial