So verwenden Sie „Warten auf“ und „Warten bis“ in VHDL
Im vorherigen Tutorial haben wir die Hauptunterschiede zwischen Signalen und Variablen kennengelernt. Wir haben gelernt, dass Signale einen größeren Anwendungsbereich haben als Variablen, die nur innerhalb eines Prozesses zugänglich sind. Wie können wir also Signale für die Kommunikation zwischen mehreren Prozessen verwenden?
Wir haben bereits gelernt, wait;
zu verwenden um unendlich zu warten, und wait for
eine bestimmte Zeit zu warten. Es gibt zwei weitere Arten von Wait-Anweisungen in VHDL.
Dieser Blogpost ist Teil der Reihe Basic VHDL Tutorials.
Die Wait On-Anweisung hält den Prozess an, bis sich eines der angegebenen Signale ändert:wait on <signal_name1>, <signal_name2> ...;
Die Wait Until-Anweisung wird angehalten, bis ein Ereignis dazu führt, dass die Bedingung wahr wird:wait until <condition>;
Tatsächlich können Wait On, Wait Until und Wait For kombiniert werden:wait on <signal_name1> until <condition> for <time_value>;
Dieses Beispiel pausiert für 10 Nanosekunden oder bis signal1
Änderungen und signal2
ist gleich signal3
:wait on signal1 until signal2 = signal3 for 10 ns;
Übung
In diesem Video-Tutorial lernen wir, wie man die Wait On- und Wait Until-Anweisungen für die Kommunikation zwischen Prozessen in VHDL verwendet:
Der endgültige Code, den wir in diesem Tutorial erstellt haben:
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;
Die Ausgabe an die Simulatorkonsole, wenn wir in ModelSim die Run-Taste gedrückt haben:
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
Der erste Prozess erhöht den CountUp
Zähler und dekrementiert den CountDown
Zähler. Sie werden gleichzeitig aktualisiert. Obwohl die Signalzuweisungen der beiden Signale dabei auf unterschiedlichen Zeilen liegen, werden zugewiesene Signalwerte erst wirksam, wenn das Programm auf eine Wait-Anweisung trifft. Der Prozess führt diesen Vorgang zu Beginn der Simulation und dann alle 10 Nanosekunden durch.
Die erste Zeile des zweiten Prozesses ist wait on CountUp, CountDown;
. Das Programm wartet an dieser Zeile, bis sich eines oder beide Signale ändern. Wie wir dem Ausdruck entnehmen können, geschieht dies bei 0 ns Simulationszeit, wenn die Zähler zum ersten Mal geändert werden, und jedes Mal, wenn sie sich danach ändern.
Die erste Zeile des dritten Prozesses ist wait until CountUp = CountDown;
. Das Programm wacht jedes Mal auf, wenn sich eines der beiden Signale ändert, genau wie beim ersten Prozess. Aber es wird nur fortgesetzt, wenn der Ausdruck zu true
ausgewertet wird , sonst schläft es wieder ein. Wie wir dem Ausdruck entnehmen können, „Jackpot!“ wird nur einmal gedruckt, bei 40 ns, wenn beide Zähler den gleichen Wert haben.
Imbiss
- Wait On wartet, bis sich eines der Signale ändert
- Wait Until wacht auf, wenn sich eines der Signale ändert, wird aber nur fortgesetzt, wenn der Ausdruck
true
ist - Warten auf, Warten bis und Warten auf können kombiniert werden
Weiter zum nächsten Tutorial »
VHDL
- So verwenden Sie eine Prozedur in einem Prozess in VHDL
- So verwenden Sie eine unreine Funktion in VHDL
- So verwenden Sie eine Funktion in VHDL
- So verwenden Sie eine Prozedur in VHDL
- So verwenden Sie Konstanten und generische Karten in VHDL
- So verwenden Sie die Port Map-Instanziierung in VHDL
- So verwenden Sie eine Case-When-Anweisung in VHDL
- So installieren Sie kostenlos einen VHDL-Simulator und -Editor
- PIC18-Mikrocontroller:Was er ist und wie er verwendet wird
- Was ist ein Referenzdesignator und wie verwenden wir ihn in der Montage?