Een For-Loop gebruiken in VHDL
In de vorige tutorial hebben we geleerd om een oneindige lus te maken met behulp van de loop
uitspraak. We hebben ook geleerd hoe je een lus kunt doorbreken met behulp van de exit
uitspraak. Maar wat als we willen dat de lus een bepaald aantal keren wordt herhaald? De For-Loop is de gemakkelijkste manier om dit te bereiken.
Met de For-Loop kunt u een vast bereik van gehele getallen of opgesomde items herhalen. Het item dat bij de huidige iteratie hoort, is binnen de lus beschikbaar via een impliciet gedeclareerde constante.
Deze blogpost maakt deel uit van de serie Basic VHDL Tutorials.
De syntaxis van de For-Loop is:
for <c> in <r> loop
end loop;
De <c>
is een willekeurige naam voor een constante die binnen de lus beschikbaar zal zijn. De <r>
is een bereik van gehele getallen of opgesomde waarden waarover de lus zal herhalen. Een geheel getal kan zowel toenemend als afnemend zijn.
De VHDL-code voor een oplopend bereik inclusief alle 10 cijfers van 0 tot 9:
0 to 9
De VHDL-code voor een aflopend bereik inclusief alle 10 cijfers van 9 tot 0:
9 downto 0
De VHDL-code voor een bereik dat alleen het cijfer 0 bevat:
0 to 0
De VHDL-code voor een leeg bereik dat helemaal geen cijfers heeft:
0 to -1
Oefening
De laatste code die we in deze tutorial hebben gemaakt:
entity T04_ForLoopTb is end entity; architecture sim of T04_ForLoopTb is begin process is begin for i in 1 to 10 loop report "i=" & integer'image(i); end loop; wait; end process; end architecture;
De uitvoer naar de simulatorconsole toen we op de run-knop in ModelSim drukten:
VSIM 2> run # ** Note: i=1 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=2 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=3 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=4 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=5 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=6 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=7 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=8 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=9 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=10 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb
Analyse
Niet geheel onverwachts herhaalde onze For-Loop zich tien keer voordat hij stopte. De waarde van i
wordt tien keer afgedrukt naar de simulatorconsole op simulatietijd 0. Er is geen wait-instructie in de lus, en daarom kost de lus geen tijd om te voltooien. Ten slotte gaat het programma in een oneindige pauze op de wait;
.
We hebben geleerd hoe we een geheel getal naar een tekenreeks kunnen converteren met behulp van integer'image()
, en we gebruikten de &
teken om de twee strings samen te voegen.
Afhaalmaaltijden
- De For-Loop kan herhalen over een oplopend of aflopend geheeltallig bereik
- Een oplopend bereik wordt aangegeven met
to
, en een afnemend bereik metdownto
- Een geheel getal kan worden geconverteerd naar een tekenreeks met
integer'image()
- Twee strings kunnen worden samengevoegd met behulp van het tekenreeksaaneenschakeling
&
Ga naar de volgende tutorial »
VHDL
- Hoe gebruiken we molybdeen?
- Een lijst met strings maken in VHDL
- Simulatie stoppen in een VHDL-testbench
- Een PWM-controller maken in VHDL
- Hoe willekeurige getallen te genereren in VHDL
- Een procedure gebruiken in een proces in VHDL
- Een onzuivere functie gebruiken in VHDL
- Een functie gebruiken in VHDL
- Een eindige-toestandsmachine maken in VHDL
- Een procedure gebruiken in VHDL
- Hoe een snijmolen te gebruiken