While-lussen in VHDL: Dynamische iteratiecontrole
Opbouwend op onze eerdere verkenning van for-lussen, duikt deze tutorial in de while-lus – een krachtig construct waarmee je iteratie kunt controleren op basis van dynamische voorwaarden in plaats van een vooraf bepaald bereik.
De while-lus voert zijn body herhaaldelijk uit zolang de gespecificeerde conditie true blijft. Dit maakt het ideaal voor scenario's waar het aantal iteraties afhangt van runtime-data of complexe logica.
Dit bericht is onderdeel van de serie Basistutorials VHDL.
Syntaxis
while <conditie> loop
-- lus body
end loop;
De <conditie> moet evalueren naar een booleaanse waarde. Het kan een eenvoudige vergelijking of een meer uitgebreide expressie zijn. De conditie wordt voor elke pas gecontroleerd, zodat de lus alleen doorgaat zolang het true blijft.
Voorbeelden van condities
i < 10– waar zolangikleiner is dan 10.i /= 10– waar zolanginiet gelijk is aan 10.i >= 0 and i < 2**8– waar voor waarden van 0 tot 255.
Relationele operatoren
| = | gelijk |
| /= | ongelijk |
| < | kleiner dan |
| <= | kleiner dan of gelijk |
| > | groter dan |
| >= | groter dan of gelijk |
Logische operatoren
| not a | waar als a onwaar is |
| a and b | waar als a en b waar zijn |
| a or b | waar als a of b waar is |
| a nand b | waar als a of b onwaar is |
| a nor b | waar als a en b onwaar zijn |
| a xor b | waar als precies een van a of b waar is |
| a xnor b | waar als a en b gelijk zijn |
Oefening
Bekijk de videotutorial hieronder om te zien hoe een variabele een while-lus in de praktijk kan sturen:
Voorbeeldcode
entity T05_WhileLoopTb is end entity;
architecture sim of T05_WhileLoopTb is
begin
process is
variable i : integer := 0;
begin
while i < 10 loop
report "i=" & integer'image(i);
i := i + 2;
end loop;
wait;
end process;
end architecture;
Simulator-output
VSIM 2> run # ** Note: i=0 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=2 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=4 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=6 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb # ** Note: i=8 # Time: 0 ns Iteration: 0 Instance: /t05_whilelooptb
Analyse
We initialiseren i op 0 en gebruiken i < 10 als luswacht. Omdat de lus i met 2 verhoogt per cyclus, is de laatste geprintte waarde 8. Bij de volgende pas evalueert de conditie naar false (10 is niet kleiner dan 10), en de lus stopt. Het daaropvolgende wait; schort het proces oneindig op, een gebruikelijk patroon voor testbenches.

Belangrijkste punten
- De
while-lus draait zolang de conditietrueblijft. - De conditie wordt voor elke iteratie geëvalueerd.
- Variabelen kunnen binnen een proces gedeclareerd en binnen de lus bijgewerkt worden.
Doe de Basic VHDL Quiz – deel 1 of ga verder naar de volgende tutorial.
VHDL
- Freesmes Slijper Technieken Beheersen: Een Praktische Gids
- Hoe molybdeen de moderne industrie vormt: toepassingen, voordelen en leveringsdynamiek
- Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
- Een VHDL-testbench netjes beëindigen: methoden en best practices
- Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
- Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
- 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
- Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld
- Procedures in VHDL gebruiken: je ontwerp vereenvoudigen met herbruikbare code