Conditionele logica in VHDL: If-Then-Elsif-Else uitgelegd
In de vorige tutorial gebruikten we een conditionele expressie met het Wait Until-statement om een proces te activeren alleen wanneer twee tellersignalen overeenkwamen. Maar wat als het programma verschillende acties moet ondernemen op basis van variërende invoeren?
Het If-Then-Elsif-Else-construct laat ons de logica vertakken. Afhankelijk van de waarde van een variabele of het resultaat van een expressie, kan het programma verschillende paden volgen.
Dit artikel is onderdeel van de serie Basistutorials VHDL.
Basissyntaxis
De canonieke vorm is:
if <conditie> then elsif <conditie> then else end if;
De elsif- en else-delen zijn optioneel, en elsif mag meerdere keren voorkomen. Een <conditie> mag een booleaanse letterlijke waarde zijn of een expressie die evalueert naar true of false.
Voorbeeld: MijnTeller < 10 is waar wanneer MijnTeller kleiner is dan tien.
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
Hieronder staat een compleet VHDL-voorbeeld dat het If-Then-Elsif-Else-construct in actie demonstreert.
Eindcode:
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 groter";
elsif CountUp < CountDown then
report "CountDown is groter";
else
report "Ze zijn gelijk";
end if;
wait on CountUp, CountDown;
end process;
end architecture;
Simulator-console-output bij uitvoering in ModelSim:
VSIM 2> run # ** Note: CountDown is groter # Time: 0 ns Iteration: 0 Instance: /t08_iftb # ** Note: CountDown is groter # Time: 0 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is groter # Time: 10 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is groter # Time: 20 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is groter # Time: 30 ns Iteration: 1 Instance: /t08_iftb # ** Note: Ze zijn gelijk # Time: 40 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountUp is groter # Time: 50 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountUp is groter # Time: 60 ns Iteration: 1 Instance: /t08_iftb ...
Analyse
We initialiseerden CountDown op 10 en CountUp op 0. Beide tellers worden gelijktijdig elke 10 ns bijgewerkt in het eerste proces. Het tweede proces wacht op deze signalen, dus het triggerd telkens wanneer ze veranderen. Het If-Then-Elsif-Else-blok selecteert dan een van drie takken: CountUp > CountDown, CountUp < CountDown, of CountUp = CountDown. Hoewel een expliciete else niet verplicht is, is het opnemen ervan een best practice om alle randgevallen af te vangen.
De console-trace bevestigt dat het tweede proces de conditie na elke update evalueert en het passende bericht print.
Kernpunten
- Gebruik If-Then alleen of combineer met Elsif en Else om alle mogelijke scenario's te dekken.
- Condities kunnen relationele, logische en rekenkundige expressies bevatten.
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