hoe conditionele statements te gebruiken in VHDL: If-Then-Elsif-Else
in de vorige tutorial gebruikten we een conditionele expressie met het wacht tot statement. De uitdrukking zorgde ervoor dat het proces alleen werd geactiveerd wanneer de twee teller signalen gelijk waren. Maar wat als we wilden dat het programma in een proces om verschillende acties te nemen op basis van verschillende input?
de IF-Then-Elsif-Else statements kunnen gebruikt worden om branches aan te maken in ons programma. Afhankelijk van de waarde van een variabele, of de uitkomst van een expressie, kan het programma verschillende paden nemen.
deze blogpost maakt deel uit van de basisreeks VHDL-Tutorials.
de basissyntaxis is:
if <condition> then
elsif <condition> then
else
end if;
elsif
en else
zijn facultatief en elsif
mag meerdere keren worden gebruikt. De <condition>
kan een Booleaanse true
of false
zijn, of een uitdrukking die resulteert in true
of false
.
Example expression which is true
if MyCounter
is kleiner dan 10:
MyCounter < 10
relationele operatoren:
= | gelijk |
/= | niet gelijk |
< | minder dan |
<= | minder dan of gelijk |
> | groter dan |
>= | groter dan of gelijk |
Logische operatoren:
geen | true als false |
a en b | true als a en b waar zijn |
a of b | true als a of b waar zijn |
een nand b | true als a of b is onwaar |
a noch b | true als a en b zijn onjuist |
a xor b | true als precies één van de a-of b-ware |
een xnor b | true als a en b gelijk zijn |
Oefening
In deze video tutorial we zullen leren hoe je If-Then-Elsif-Else statements in VHDL kunt gebruiken:
de uiteindelijke code die we in deze tutorial hebben aangemaakt:
entity T08_IfTb isend entity;architecture sim of T08_IfTb 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 if CountUp > CountDown then report "CountUp is larger"; elsif CountUp < CountDown then report "CountDown is larger"; else report "They are equal"; end if; wait on CountUp, CountDown; end process;end architecture;
de uitvoer naar de simulator console toen we op de knop Uitvoeren in ModelSim:
VSIM 2> run# ** Note: CountDown is larger# Time: 0 ns Iteration: 0 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 0 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 10 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 20 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 30 ns Iteration: 1 Instance: /t08_iftb# ** Note: They are equal# Time: 40 ns Iteration: 1 Instance: /t08_iftb# ** Note: Countup is larger# Time: 50 ns Iteration: 1 Instance: /t08_iftb# ** Note: Countup is larger# Time: 60 ns Iteration: 1 Instance: /t08_iftb...
analyse
we gaven CountDown
een beginwaarde van 10, en CountUp
een waarde van 0. Het eerste proces verandert beide teller waarden op exact hetzelfde moment, elke 10 ns. Wanneer dit gebeurt, wordt het tweede proces geactiveerd omdat het programma altijd zal wachten op de wait on CountUp, CountDown;
regel. Het programma zal daar altijd wachten omdat de If-Then-Elsif-Else en de rapportverklaringen nul simulatietijd verbruiken.
het If-Then-Elsif-Else commando zorgt ervoor dat het programma een van de drie branches neemt die we gemaakt hebben. De twee eerste vertakkingen hebben betrekking op de gevallen waarin de twee tellers verschillende waarden hebben. We hadden de single else
kunnen laten vallen, en elsif CountUp = CountDown then
kunnen gebruiken wat hetzelfde resultaat zou hebben gehad. Maar het is een goede ontwerppraktijk om alle takken te bestrijken, en de else
– clausule heeft betrekking op alle opzettelijke en onvoorziene gevallen.
zoals we kunnen zien aan de afdruk, neemt het tweede proces een van de drie branches elke keer dat de tellers veranderen.
Afhaalmaaltijd
- If-Then kan alleen of in combinatie met Elsif en Else worden gebruikt.
- expressies kunnen relationele en logische vergelijkingen en wiskundige berekeningen bevatten
Ga naar de volgende les “