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