Maîtriser les instructions Wait en VHDL : Wait On, Wait Until et utilisation combinée
Dans notre tutoriel précédent, nous avons exploré les différences entre signaux et variables en VHDL, en soulignant que les signaux ont une portée plus large que les variables, confinées à un seul processus. La question logique suivante est de savoir comment coordonner plusieurs processus à l'aide de signaux.
Au-delà du familier wait; (pause infinie) et wait for (pause basée sur le temps), VHDL offre deux instructions puissantes pour la synchronisation pilotée par événements : Wait On et Wait Until. Elles peuvent également être combinées avec wait for pour créer des flux de contrôle sophistiqués.
Wait On
L'instruction wait on suspend un processus jusqu'à ce que l'un des signaux listés change de valeur.
wait on <signal_name1>, <signal_name2>, ...;
Wait Until
L'instruction wait until met en pause l'exécution jusqu'à ce qu'une condition booléenne spécifiée devienne vraie.
wait until <condition>;
Combinaison des instructions Wait
Les trois constructions peuvent être utilisées ensemble pour créer des comportements de timing nuancés :
wait on <signal_name1> until <condition> for <time_value>;
Par exemple, la ligne suivante mettra en pause pendant 10 ns ou jusqu'à ce que signal1 change et que signal2 soit égal à signal3 :
wait on signal1 until signal2 = signal3 for 10 ns;
Exemple pratique
Voici un testbench complet qui démontre comment wait on et wait until peuvent être utilisés pour la communication inter-processus.
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 sortie console dans ModelSim illustre la séquence d'événements :
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
Analyse
Le premier processus met à jour CountUp et CountDown simultanément toutes les 10 ns. Comme les affectations de signaux ne prennent effet qu'après une instruction wait, les deux compteurs sont mis à jour ensemble à chaque pas de simulation.
Le second processus utilise wait on CountUp, CountDown;, se suspendant jusqu'à ce que l'un des compteurs change. Comme montré, cela se déclenche à 0 ns (la mise à jour initiale) et ensuite chaque fois que l'un des signaux change.
Le troisième processus utilise wait until CountUp = CountDown;. Il se réveille à chaque changement de signal mais ne continue que si l'égalité est vérifiée. Par conséquent, le message « Jackpot! » n'apparaît qu'une seule fois — à 40 ns lorsque les deux compteurs atteignent 5.

À retenir
- Wait On met en pause jusqu'à ce qu'un des signaux spécifiés change.
- Wait Until se réveille sur un changement de signal mais continue seulement si une condition évalue à true.
- Les trois constructions —
wait on,wait untiletwait for— peuvent être combinées pour un contrôle granulaire.
Passez au tutoriel suivant pour des insights plus profonds sur la synchronisation VHDL.
VHDL
- Exploiter les procédures in-process pour un design FSM VHDL plus propre
- Utilisation des fonctions impures en VHDL : Améliorer la lisibilité et la maintenabilité des FSM
- Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
- Utilisation des procédures en VHDL : Simplifiez votre design avec du code réutilisable
- Exploiter les constantes et generic maps en VHDL pour un design de module flexible
- Maîtriser l'instanciation par port map en VHDL : Guide pratique
- Installation gratuite d'un simulateur et éditeur VHDL : guide étudiant
- Microcontrôleurs PIC18 : Caractéristiques, Performances et Utilisation
- Comprendre les Désignateurs de Référence : Comment Étiqueter les Connexions d'Assemblage PCB