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 truevagy 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.

 exkluzív hozzáférést kap a gyakorlatokhoz és a válaszokhoz!

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 “