VHDL Wait-Statements meistern: Wait On, Wait Until und kombinierte Nutzung
Im vorherigen Tutorial untersuchten wir die Unterschiede zwischen Signalen und Variablen in VHDL – Signale haben einen größeren Geltungsbereich als Variablen, die auf einen einzelnen Prozess beschränkt sind. Die nächste logische Frage ist, wie man mehrere Prozesse mithilfe von Signalen koordiniert.
Neben dem bekannten wait; (endloser Halt) und wait for (zeitbasierter Halt) bietet VHDL zwei leistungsfähige Statements für ereignisgesteuerte Synchronisation: Wait On und Wait Until. Diese lassen sich auch mit wait for kombinieren, um komplexe Steuerungsflüsse zu erzeugen.
Wait On
Das wait on-Statement hält einen Prozess an, bis sich eines der aufgeführten Signale ändert.
wait on <signal_name1>, <signal_name2>, ...;
Wait Until
Das wait until-Statement pausiert die Ausführung, bis eine angegebene boolesche Bedingung wahr wird.
wait until <Bedingung>;
Kombination von Wait-Statements
Alle drei Konstrukte können zusammen verwendet werden, um feingranulare Timing-Verhalten zu erzeugen:
wait on <signal_name1> until <Bedingung> for <zeitwert>;
Beispiel: Die folgende Zeile hält für 10 ns an oder bis signal1 sich ändert und signal2 gleich signal3 ist:
wait on signal1 until signal2 = signal3 for 10 ns;
Praktisches Beispiel
Unten steht ein vollständiger Testbench, der zeigt, wie wait on und wait until für die Kommunikation zwischen Prozessen eingesetzt werden können.
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 Konsolenausgabe in ModelSim veranschaulicht die Ereignisfolge:
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 aktualisiert CountUp und CountDown gleichzeitig alle 10 ns. Da Signalzuweisungen erst nach einem wait-Statement wirksam werden, werden beide Zähler bei jedem Simulationsschritt gemeinsam aktualisiert.
Der zweite Prozess nutzt wait on CountUp, CountDown; und hält an, bis sich einer der Zähler ändert. Wie gezeigt, löst dies bei 0 ns (initiales Update) und anschließend bei jeder Signaländerung aus.
Der dritte Prozess verwendet wait until CountUp = CountDown;. Er wird bei jeder Signaländerung geweckt, setzt die Ausführung aber nur fort, wenn die Gleichheit gilt. Daher erscheint die Meldung „Jackpot!“ nur einmal – bei 40 ns, wenn beide Zähler 5 erreichen.

Zusammenfassung
- Wait On hält an, bis eines der angegebenen Signale sich ändert.
- Wait Until weckt bei Signaländerung auf, führt aber nur fort, wenn die Bedingung wahr ist.
- Alle drei Konstrukte –
wait on,wait untilundwait for– lassen sich für granularen Steuerung kombinieren.
Weiter zum nächsten Tutorial für tiefere Einblicke in VHDL-Synchronisation.
VHDL
- In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
- Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
- VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
- Prozeduren in VHDL: Wiederverwendbaren Code für einfachere Designs
- Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen
- VHDL Port Map Instanziierung meistern: Praktischer Leitfaden
- Case-When Statement in VHDL meistern: Effizientes Multiplexer-Design
- Kostenloser VHDL-Simulator & Editor: Ein Leitfaden für Studierende
- PIC18 Mikrocontroller: Eigenschaften, Performance & Programmierung
- Referenzbezeichner verstehen: PCB-Bestückungsanschlüsse korrekt kennzeichnen