Comment utiliser Wait On et Wait Until en VHDL
Dans le didacticiel précédent, nous avons appris les principales différences entre les signaux et les variables. Nous avons appris que les signaux ont une portée plus large que les variables, qui ne sont accessibles qu'au sein d'un processus. Alors, comment pouvons-nous utiliser des signaux pour la communication entre plusieurs processus ?
Nous avons déjà appris à utiliser wait;
attendre indéfiniment, et wait for
attendre un certain temps. Il existe deux autres types d'instructions d'attente en VHDL.
Cet article de blog fait partie de la série de didacticiels VHDL de base.
L'instruction Wait On mettra le processus en pause jusqu'à ce que l'un des signaux spécifiés change :wait on <signal_name1>, <signal_name2> ...;
L'instruction Wait Until s'interrompra jusqu'à ce qu'un événement rende la condition vraie :wait until <condition>;
En fait, Wait On, Wait Until et Wait For peuvent être combinés :wait on <signal_name1> until <condition> for <time_value>;
Cet exemple fera une pause de 10 nanosecondes, ou jusqu'à signal1
modifications et signal2
est égal à signal3
:wait on signal1 until signal2 = signal3 for 10 ns;
Exercice
Dans ce didacticiel vidéo, nous allons apprendre à utiliser les instructions Wait On et Wait Until pour la communication inter-processus en VHDL :
Le code final que nous avons créé dans ce tutoriel :
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 vers la console du simulateur lorsque nous avons appuyé sur le bouton d'exécution dans ModelSim :
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 incrémente le CountUp
compteur et décrémente le CountDown
compteur. Ils sont mis à jour simultanément. Bien que les affectations de signal des deux signaux soient sur des lignes différentes dans le processus, les valeurs de signal affectées ne deviennent effectives que lorsque le programme atteint une instruction Wait. Le processus effectue cette opération au début de la simulation, puis toutes les 10 nanosecondes.
La première ligne du deuxième processus est wait on CountUp, CountDown;
. Le programme attendra sur cette ligne jusqu'à ce qu'un ou les deux signaux changent. Comme nous pouvons le voir sur l'impression, cela se produit à un temps de simulation de 0 ns lorsque les compteurs sont modifiés pour la première fois, et à chaque fois qu'ils changent par la suite.
La première ligne du troisième processus est wait until CountUp = CountDown;
. Le programme se réveillera chaque fois que l'un des deux signaux changera, tout comme le premier processus l'a fait. Mais cela ne continuera que si l'expression est évaluée à true
, sinon il se rendormira. Comme nous pouvons le voir sur l'imprimé, "Jackpot!" n'est imprimé qu'une seule fois, à 40 ns lorsque les deux compteurs ont la même valeur.
À emporter
- Wait On attendra que l'un des signaux change
- Wait Until se réveillera si l'un des signaux change, mais ne continuera que si l'expression est
true
- Wait On, Wait Until et Wait For peuvent être combinés
Aller au tutoriel suivant »
VHDL
- Comment utiliser une procédure dans un processus en VHDL
- Comment utiliser une fonction impure en VHDL
- Comment utiliser une fonction en VHDL
- Comment utiliser une procédure en VHDL
- Comment utiliser les constantes et la carte générique en VHDL
- Comment utiliser l'instanciation de Port Map dans VHDL
- Comment installer un simulateur et un éditeur VHDL gratuitement
- Microcontrôleur PIC18 :qu'est-ce que c'est et comment l'utiliser
- Qu'est-ce qu'un désignateur de référence et comment l'utiliser dans l'assemblage ?