VHDL Wait-statements onder de knie: Wait On, Wait Until en gecombineerd gebruik
In onze vorige tutorial verkenden we de verschillen tussen signalen en variabelen in VHDL, met de nadruk dat signalen een bredere scope hebben dan variabelen, die beperkt zijn tot één proces. De volgende logische vraag is hoe meerdere processen te coördineren met signalen.
Naast de bekende wait; (oneindige pauze) en wait for (tijdgebaseerde pauze), biedt VHDL twee krachtige statements voor gebeurtenisgestuurde synchronisatie: Wait On en Wait Until. Deze kunnen ook gecombineerd worden met wait for om geavanceerde stroomcontroleregelingen te creëren.
Wait On
Het wait on-statement schort een proces op totdat een van de opgegeven signalen zijn waarde verandert.
wait on <signaalnaam1>, <signaalnaam2>, ...;
Wait Until
Het wait until-statement pauzeert de uitvoering totdat een opgegeven booleaanse conditie waar wordt.
wait until <conditie>;
Wait-statements combineren
Alle drie constructen kunnen samen gebruikt worden voor genuanceerde timing-gedrag:
wait on <signaalnaam1> until <conditie> for <tijdwaarde>;
Bijvoorbeeld, de volgende regel pauzeert 10 ns of totdat signaal1 verandert en signaal2 gelijk is aan signaal3:
wait on signaal1 until signaal2 = signaal3 for 10 ns;
Praktisch voorbeeld
Hieronder een complete testbench die demonstreert hoe wait on en wait until gebruikt kunnen worden voor inter-procescommunicatie.
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;
De console-output in ModelSim illustreert de gebeurtenisvolgorde:
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
Het eerste proces werkt CountUp en CountDown gelijktijdig elke 10 ns bij. Omdat signaaltoewijzingen pas effect hebben na een wait-statement, worden beide tellers samen bijgewerkt bij elke simulatiestap.
Het tweede proces gebruikt wait on CountUp, CountDown;, wat opschort totdat een van de tellers verandert. Zoals getoond, triggert dit op 0 ns (de initiële update) en daarna bij elke wijziging van een van de signalen.
Het derde proces gebruikt wait until CountUp = CountDown;. Het wordt gewekt bij elke signaalwijziging, maar gaat alleen door als de gelijkheid geldt. Daardoor verschijnt het bericht "Jackpot!" slechts één keer – op 40 ns wanneer beide tellers 5 bereiken.

Kernpunten
- Wait On pauzeert totdat een opgegeven signaal verandert.
- Wait Until ontwaakt bij een signaalwijziging, maar gaat alleen door als een conditie evalueert naar waar.
- Alle drie constructen –
wait on,wait untilenwait for– kunnen gecombineerd worden voor fijnmazige controle.
Ga verder naar de volgende tutorial voor diepere inzichten in VHDL-synchronisatie.
VHDL
- PIC18-microcontrollers: kenmerken, prestaties en hoe u ze gebruikt
- Referentieaanduidingen begrijpen: hoe PCB-montageverbindingen te labelen
- In-process procedures benutten voor schonere VHDL FSM-ontwerpen
- Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
- VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp
- Procedures in VHDL gebruiken: je ontwerp vereenvoudigen met herbruikbare code
- Constants en generic maps in VHDL benutten voor flexibele modulontwerpen
- VHDL port map instantiation onder de knie krijgen: een praktische gids
- De Case-When-statement in VHDL onder de knie krijgen: efficiënte multiplexer-ontwerpen
- Signed en unsigned types in VHDL onder de knie krijgen: een praktische gids
- Gratis VHDL-simulator & editor setup: Een studentengids