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
endLas 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
endAmbas asignaciones ocurren al mismo tiempo, utilizando los valores anteriores al flanco del reloj.
Resumen
| Regla | Explicación |
|---|---|
Usa <= para la lógica secuencial | always @(posedge clk) |
Usa = para la 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
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,
q1obtiened q2obtiene el valor anterior deq1
Qué hacer:
- Asigna
daq1(sin bloqueo) - Asigna
q1aq2(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
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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: 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 condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un módulo9Bloques procedurales
Bloque AlwaysBloque InitialLista de sensibilidadAsignación bloqueanteAsignación no bloqueanteRepaso: Always vs InitialPractica por tu cuenta: Compilador de Verilog online