slik bruker du betingede setninger I VHDL:If-Then-Elsif-Else

i den forrige opplæringen brukte vi et betinget uttrykk Med Vent Til setningen. Uttrykket sørget for at prosessen bare ble utløst når de to motsignalene var like. Men hva om vi ønsket at programmet i en prosess skulle ta forskjellige handlinger basert på ulike innganger?

If-Then-Elsif-Else-setningene kan brukes til å lage grener i vårt program. Avhengig av verdien av en variabel, eller utfallet av et uttrykk, kan programmet ta forskjellige baner.

dette blogginnlegget er en del Av Basic Vhdl Tutorials-serien.

den grunnleggende syntaksen er:

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

elsif og else er valgfrie, og elsif kan brukes flere ganger. <condition> kan være en boolsk true eller false, eller det kan være et uttrykk som evaluerer til true eller false.

Eksempeluttrykk som er true hvis MyCounter er mindre enn 10:

MyCounter < 10

Relasjonelle operatører:

= lik
/= ikke like
< mindre enn
<= mindre enn eller lik
> større enn
>= større enn eller lik

Logiske operatorer:

ikke a sant hvis a er usann
a og b sann hvis a og b er sann
a eller b sant hvis a eller b er sant
a nand b sann hvis a eller b er usann
a nor b sant hvis a og b er falske
a xor b sann hvis nøyaktig en av a eller b er sann
a xnor b sant hvis a og b er like

Øvelse

i denne videoopplæringen vi lærer Å bruke If-Then-Elsif-Else-setninger I VHDL:

den endelige koden vi opprettet i denne opplæringen:

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;

utgangen til simulatorkonsollen når vi trykket på run-knappen I 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...

Analyse

vi ga CountDown en startverdi på 10 og CountUp en verdi på 0. Den første prosessen endrer begge tellerverdiene på nøyaktig samme tid, hver 10 ns. Når dette skjer, utløses den andre prosessen fordi programmet alltid venter på wait on CountUp, CountDown; – linjen. Programmet vil alltid vente der fordi If-Then-Elsif-Else og rapporten uttalelser forbruke null simulering tid.

If-Then-Elsif-Else-setningen vil føre til at programmet tar en av de tre grenene vi opprettet. De to første grenene dekker tilfellene der de to tellerne har forskjellige verdier. Vi kunne ha droppet singelen else, og brukt elsif CountUp = CountDown then som ville ha hatt samme resultat. Men det er god designpraksis å dekke alle grener, og else – klausulen dekker alle forsettlige og uforutsette tilfeller.

som vi kan se fra utskriften, tar den andre prosessen en av de tre grenene hver gang tellerne endres.

Få eksklusiv tilgang til øvelser og svar!

Takeaway

  • Hvis-da kan brukes alene eller i kombinasjon Med Elsif og Annet.
  • Uttrykk kan inneholde relasjonelle og logiske sammenligninger og matematiske beregninger

Gå til neste veiledning «