Voorwaardelijke instructies gebruiken in VHDL:If-Then-Elsif-Else
In de vorige tutorial gebruikten we een voorwaardelijke expressie met de Wait Until-instructie. De uitdrukking zorgde ervoor dat het proces alleen werd geactiveerd als de twee tegensignalen gelijk waren. Maar wat als we willen dat het programma in een proces verschillende acties onderneemt op basis van verschillende inputs?
De If-Then-Elsif-Else statements kunnen worden gebruikt om branches in ons programma te maken. Afhankelijk van de waarde van een variabele of de uitkomst van een uitdrukking, kan het programma verschillende paden inslaan.
Deze blogpost maakt deel uit van de serie Basic VHDL Tutorials.
De basissyntaxis is:
if <condition> then
elsif <condition> then
else
end if;
De elsif
en else
zijn optioneel, en elsif
kan meerdere keren worden gebruikt. De <condition>
kan een booleaanse true
zijn of false
, of het kan een uitdrukking zijn die resulteert in true
of false
.
Voorbeelduitdrukking die true
. is als MyCounter
is kleiner dan 10:
MyCounter < 10
Relationele operatoren:
= | gelijk |
/= | niet gelijk |
< | minder dan |
<= | kleiner dan of gelijk aan |
> | groter dan |
>= | groter dan of gelijk |
Logische operatoren:
niet een | waar als a is onwaar |
a en b | waar als a en b zijn waar |
a of b | waar als a of b zijn waar |
a nand b | waar als a of b is onwaar |
a noch b | waar als a en b zijn vals |
a xor b | waar als precies één van a of b zijn waar |
a xnor b | waar als a en b zijn gelijk |
Oefening
In deze video-tutorial leren we hoe je If-Then-Elsif-Else-statements in VHDL kunt gebruiken:
De laatste code die we in deze tutorial hebben gemaakt:
entity T08_IfTb is end 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 simulatorconsole toen we op de run-knop in ModelSim drukten:
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 tellerwaarden 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;
lijn. Het programma zal daar altijd wachten omdat de If-Then-Elsif-Else en de rapportoverzichten nul simulatietijd verbruiken.
De If-Then-Elsif-Else-instructie zorgt ervoor dat het programma een van de drie takken neemt die we hebben gemaakt. De twee eerste takken hebben betrekking op de gevallen waarin de twee tellers verschillende waarden hebben. We hadden de single else
kunnen laten vallen , en gebruikte elsif CountUp = CountDown then
wat hetzelfde resultaat zou hebben gehad. Maar het is een goede ontwerppraktijk om alle branches te dekken, en de else
clausule dekt alle opzettelijke en onvoorziene gevallen.
Zoals we op de afdruk kunnen zien, neemt het tweede proces een van de drie takken in beslag telkens wanneer de tellers veranderen.
Afhaalmaaltijden
- If-Then kan alleen of in combinatie met Elsif en Else worden gebruikt.
- Uitdrukkingen kunnen relationele en logische vergelijkingen en wiskundige berekeningen bevatten
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