miten käyttää ehdollisia lausekkeita VHDL: ssä: If-Then-Elsif-Else

edellisessä tutoriaalissa käytimme ehdollista lauseketta, jossa oli Wait Until-lauseke. Lauseke varmisti, että prosessi käynnistyi vain, kun kaksi vastasignaalia missä yhtä. Mutta mitä jos haluaisimme ohjelman prosessissa tehdä erilaisia toimia, jotka perustuvat erilaisiin syötteisiin?

If-Then-Elsif-Else-lausekkeita voidaan käyttää haarojen luomiseen ohjelmassamme. Riippuen muuttujan arvosta, tai lausekkeen tuloksesta, ohjelma voi kulkea eri polkuja.

tämä blogikirjoitus on osa VHDL: n perusopetus-sarjaa.

perussyntaksi on:

if <condition> then
elsif <condition> then
else
end if;

elsif ja else ovat valinnaisia, ja elsif voidaan käyttää useita kertoja. <condition> voi olla Boolen true tai false, tai se voi olla lauseke, joka arvioi arvon true tai false.

esimerkin lauseke, joka on true jos MyCounter on pienempi kuin 10:

MyCounter < 10

Relaatiotoimijat:

= yhtä suuri
/= ei tasa-arvoinen
< alle
<= pienempi tai yhtä suuri
> suurempi kuin
>= suurempi tai yhtä suuri

loogiset operaattorit:

Ei a tosi, jos A on epätosi
A ja b tosi, jos A ja b ovat tosi
A tai b tosi, jos A tai b ovat tosi
a nand b tosi, jos A tai b on epätosi
a nor b tosi, jos A ja b ovat epätosia
a xor b tosi, jos tasan yksi A: sta tai b: stä on tosi
a xnor b totta, jos A ja b ovat yhtä suuret

harjoitus

tässä opetusvideossa opimme käyttämään If-Then-Elsif-Else-lausekkeita VHDL: ssä:

tässä opetusohjelmassa luomamme loppukoodin:

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;

tuloste simulaattorikonsoliin, kun painoimme run-painiketta 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...

analyysi

annoimme CountDown alkuarvoksi 10 ja CountUp arvoksi 0. Ensimmäinen prosessi muuttaa molemmat laskurit täsmälleen samaan aikaan, joka 10 ns. Kun näin tapahtuu, käynnistyy toinen prosessi, koska ohjelma odottaa aina wait on CountUp, CountDown; – linjalla. Ohjelma on aina odottaa siellä, koska jos-sitten-Elsif-Else ja raportin lausunnot kuluttavat nolla simulointi aikaa.

If-Then-Elsif-Else-lauseke aiheuttaa sen, että ohjelma ottaa yhden kolmesta luomastamme haarasta. Kaksi ensimmäistä haaraa kattavat tapaukset, joissa kahdella laskurilla on eri arvot. Olisimme voineet pudottaa singlen else ja käyttää elsif CountUp = CountDown then, jolla olisi ollut sama tulos. On kuitenkin hyvä suunnittelutapa kattaa kaikki haarat, ja else – lauseke kattaa kaikki tahalliset ja ennakoimattomat tapaukset.

kuten tulosteesta näkyy, toinen prosessi vie yhden kolmesta haarasta aina, kun laskurit vaihtuvat.

Hanki yksinoikeus harjoituksiin ja vastauksiin!

Takeaway

  • If-Then voidaan käyttää yksinään tai yhdessä Elsifin ja Else: n kanssa.
  • lausekkeet voivat sisältää relaatio-ja loogisia vertailuja ja matemaattisia laskutoimituksia

siirry seuraavaan tutoriaaliin ”