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 todo 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 sentencia. Todas las asignaciones no bloqueantes en 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 utilizan un reloj y tienen memoria. Las salidas cambian solo en un flanco de reloj (normalmente el flanco de subida).
Ejemplos de lógica secuencial:
- Flip-flops
- Registros
- Contadores
- Máquinas de estado
- 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 utilizando los valores antiguos. Al final del paso de tiempo, todas las actualizaciones ocurren juntas.
Non-Blocking en bloques Always (Lógica secuencial)
Non-blocking se utiliza para lógica secuencial — circuitos que utilizan un reloj y tienen memoria (flip-flops, registros, contadores).
always @(posedge clk) begin
q <= d; // q recibe d en el flanco de reloj
count <= count + 1; // count se incrementa en el flanco de reloj
endAmbas asignaciones ocurren al mismo tiempo, utilizando los 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 @(*) |
| Las asignaciones no bloqueantes se ejecutan en paralelo | Todas las asignaciones ocurren a la vez |
| Los valores se actualizan al final del paso de tiempo | No inmediatamente |
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,
q1recibed q2recibe el valor anterior deq1
Qué hacer:
- Asigna
daq1(no bloqueante) - Asigna
q1aq2(no bloqueante)
Hoja de referencia
La asignación no bloqueante (<=) ejecuta todas las sentencias en paralelo — utilizando los valores antiguos y actualizándolos al final del paso de tiempo.
// Todos usan los valores ANTIGUOS de a y b
a <= 5;
b <= a + 2; // usa el valor antiguo de a
c <= b * 3; // usa el valor antiguo de bUse <= para lógica secuencial (flip-flops, registros, contadores) dentro de bloques always sincronizados por reloj:
always @(posedge clk) begin
q <= d; // no bloqueante
count <= count + 1; // no bloqueante
end| Asignación | Uso para | Se ejecuta |
|---|---|---|
<= | Lógica secuencial (posedge clk) | En paralelo |
= | Lógica combinacional (always @(*)) | Paso a paso |
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: Agregar 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