feltételes utasítások használata a VHDL-ben: If-Then-Elsif-Else
az előző oktatóanyagban feltételes kifejezést használtunk a Wait Until utasítással. A kifejezés biztosította, hogy a folyamat csak akkor vált ki, amikor a két ellenjel egyenlő. De mi lenne, ha azt akarnánk, hogy a program egy folyamatban különböző műveleteket hajtson végre különböző bemenetek alapján?
az If-Then-Elsif-Else utasításokkal ágakat hozhatunk létre a programunkban. A változó értékétől vagy egy kifejezés eredményétől függően a program különböző útvonalakat vehet fel.
ez a blogbejegyzés része az alapvető VHDL oktatóanyagok sorozat.
az alapvető szintaxis:
if <condition> then
elsif <condition> then
else
end if;
a elsif
és a else
opcionális, és a elsif
többször is használható. A <condition>
lehet logikai true
vagy false
, vagy lehet egy kifejezés, amely értékeli true
vagy false
.
példa kifejezés, amely true
ha MyCounter
kisebb, mint 10:
MyCounter < 10
relációs operátorok:
= | egyenlő |
/= | nem egyenlő |
< | kevesebb, mint |
<= | kisebb vagy egyenlő |
> | nagyobb, mint |
>= | nagyobb vagy egyenlő |
logikai operátorok:
nem | igaz, ha a hamis |
A és b | igaz, ha a és b igaz |
a vagy b | igaz, ha a vagy b igaz |
a nand b | igaz, ha a vagy b hamis |
a nor b | igaz, ha a és b hamis |
a xor B | igaz, ha pontosan egy a vagy b igaz |
a xnor B | igaz, ha a és b egyenlő |
gyakorlat
ebben a videóban bemutató megtanuljuk, hogyan kell használni az If-Then-Elsif-Else utasításokat a VHDL – ben:
a végső kódot, amelyet ebben az oktatóanyagban hoztunk létre:
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;
a szimulátor konzol kimenete, amikor megnyomtuk a Futtatás gombot a ModelSim-ben:
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...
elemzés
a CountDown
kezdeti értékét 10-nek, CountUp
0-nak adtuk. Az első folyamat mindkét számláló értékét pontosan ugyanabban az időben változtatja meg, minden 10 ns. Amikor ez megtörténik, a második folyamat elindul, mert a program mindig a wait on CountUp, CountDown;
sorban vár. A program mindig ott vár, mert az If-Then-Elsif-Else és a report utasítások nulla szimulációs időt fogyasztanak.
az If-Then-Elsif-Else utasítás hatására a program az általunk létrehozott három ág egyikét veszi fel. A két első ág azokat az eseteket fedi le, amikor a két számláló értéke eltérő. Elhagyhattuk volna a else
kislemezt, és használhattuk volna a elsif CountUp = CountDown then
– t, ami ugyanazt az eredményt hozta volna. De jó tervezési gyakorlat, hogy minden ágra kiterjed, és a else
záradék kiterjed minden szándékos és előre nem látható esetre.
amint a nyomtatásból láthatjuk, a második folyamat a három ág egyikét veszi igénybe minden alkalommal, amikor a számlálók megváltoznak.
elvihető
- If-Then alkalmazható önmagában vagy Elsif-el és mással kombinálva.
- a kifejezések relációs és logikai összehasonlításokat és matematikai számításokat tartalmazhatnak
ugrás a következő oktatóanyagra “