Dominando sentencias Wait en VHDL: Wait On, Wait Until y uso combinado
En nuestro tutorial previo exploramos las diferencias entre señales y variables en VHDL, enfatizando que las señales tienen alcance más amplio que las variables, confinadas a un solo proceso. La siguiente pregunta lógica es cómo coordinar múltiples procesos usando señales.
Más allá del familiar wait; (pausa infinita) y wait for (pausa basada en tiempo), VHDL ofrece dos sentencias poderosas para sincronización event-driven: Wait On y Wait Until. Estas también pueden combinarse con wait for para crear flujos de control sofisticados.
Wait On
La sentencia wait on suspende un proceso hasta que cualquiera de las señales listadas cambia de valor.
wait on <signal_name1>, <signal_name2>, ...;
Wait Until
La sentencia wait until pausa ejecución hasta que una condición booleana especificada se vuelve true.
wait until <condition>;
Combinando sentencias Wait
Los tres constructos pueden usarse juntos para crear comportamientos de timing matizados:
wait on <signal_name1> until <condition> for <time_value>;
Por ejemplo, la siguiente línea pausará por 10 ns o hasta que signal1 cambie y signal2 iguale signal3:
wait on signal1 until signal2 = signal3 for 10 ns;
Ejemplo práctico
Abajo hay un testbench completo que demuestra cómo wait on y wait until pueden usarse para comunicación inter-proceso.
entity T07_WaitOnUntilTb is end entity; architecture sim of T07_WaitOnUntilTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin wait on CountUp, CountDown; report "CountUp=" & integer'image(CountUp) & " CountDown=" & integer'image(CountDown); end process; process is begin wait until CountUp = CountDown; report "Jackpot!"; end process; end architecture;
La salida de consola en ModelSim ilustra la secuencia de eventos:
VSIM 2> run # ** Note: CountUp=1 CountDown=9 # Time: 0 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=2 CountDown=8 # Time: 10 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=3 CountDown=7 # Time: 20 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=4 CountDown=6 # Time: 30 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=5 CountDown=5 # Time: 40 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: Jackpot! # Time: 40 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=6 CountDown=4 # Time: 50 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=7 CountDown=3 # Time: 60 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=8 CountDown=2 # Time: 70 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=9 CountDown=1 # Time: 80 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=10 CountDown=0 # Time: 90 ns Iteration: 1 Instance: /t07_waitonuntiltb # ** Note: CountUp=11 CountDown=-1 # Time: 100 ns Iteration: 1 Instance: /t07_waitonuntiltb
Análisis
El primer proceso actualiza CountUp y CountDown simultáneamente cada 10 ns. Como las asignaciones de señal solo toman efecto tras una sentencia wait, ambos contadores se actualizan juntos en cada paso de simulación.
El segundo proceso usa wait on CountUp, CountDown;, suspendiendo hasta que cualquiera de los contadores cambia. Como se muestra, esto dispara a 0 ns (la actualización inicial) y subsecuentemente cuando cualquiera señal cambia.
El tercer proceso emplea wait until CountUp = CountDown;. Despierta en cada cambio de señal pero procede solo cuando la igualdad se cumple. Consecuentemente, el mensaje "Jackpot!" aparece solo una vez —a 40 ns cuando ambos contadores alcanzan 5.

Conclusión
- Wait On pausa hasta que cualquier señal especificada cambia.
- Wait Until despierta en cambio de señal pero continua solo si una condición evalúa a true.
- Los tres constructos —
wait on,wait untilywait for— pueden combinarse para control granular.
Proceda al siguiente tutorial para insights más profundos en sincronización VHDL.
VHDL
- Microcontroladores PIC18: Características, Rendimiento y Cómo Usarlos
- Entendiendo Designadores de Referencia: Cómo Etiquetar Conexiones en Ensamblaje PCB
- Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente
- Uso de procedimientos en VHDL: Simplifique su diseño con código reutilizable
- Aprovechando constantes y generic maps en VHDL para diseño de módulos flexibles
- Dominando la instanciación con port map en VHDL: Guía práctica
- Dominando la sentencia Case-When en VHDL: Diseño eficiente de multiplexores
- Dominando tipos Signed y Unsigned en VHDL: Guía práctica
- Configuración gratis de simulador y editor VHDL: Guía para estudiantes