Sådan bruges betingede udsagn i VHDL: If-Then-Elsif-Else

i den forrige tutorial brugte vi et betinget udtryk med Vent til erklæring. Udtrykket sikrede, at processen kun blev udløst, når de to modsignaler var ens. Men hvad nu hvis vi ønskede, at programmet i en proces skulle tage forskellige handlinger baseret på forskellige input?

If-Then-Elsif-Else-udsagnene kan bruges til at oprette filialer i vores program. Afhængigt af værdien af en variabel eller resultatet af et udtryk kan programmet gå forskellige veje.

dette blogindlæg er en del af den grundlæggende VHDL Tutorials serie.

den grundlæggende syntaks er:

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

elsif og else er valgfri, og elsif kan bruges flere gange. <condition> kan være en boolsk true eller false, eller det kan være et udtryk, der evalueres til trueeller false.

Eksempeludtryk, som er true hvis MyCounter er mindre end 10:

MyCounter < 10

relationelle operatører:

= lige
/= ikke lige
< mindre end
<= mindre end eller lig
> større end
>= større end eller lig

logiske operatorer:

ikke a sandt, hvis A er falsk
A og b sandt hvis a og b er sandt
A eller b sandt, hvis a eller b er sandt
a nand b sandt, hvis a eller b er falsk
a nor b sandt, hvis A og b er falske
B sandt, hvis en af a eller b er sand
B sandt, hvis a og b er ens

øvelse

i denne video tutorial vi lærer at bruge If-Then-Elsif-Else-udsagn i VHDL:

den endelige kode, vi oprettede i denne tutorial:

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;

udgangen til simulatorkonsollen, da vi trykkede på Kør-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 gav CountDown en indledende værdi på 10 og CountUp en værdi på 0. Den første proces ændrer begge tællerværdier på nøjagtig samme tid, hver 10 ns. Når dette sker, udløses den anden proces, fordi programmet altid venter på wait on CountUp, CountDown; linjen. Programmet vil altid vente der, fordi If-Then-Elsif-Else og rapportens udsagn forbruger nul simuleringstid.

If-Then-Elsif-Else-erklæringen får programmet til at tage en af de tre grene, vi oprettede. De to første grene dækker de tilfælde, hvor de to tællere har forskellige værdier. Vi kunne have droppet singlen else og brugt elsif CountUp = CountDown then, som ville have haft det samme resultat. Men det er god designpraksis at dække alle grene, og else klausulen dækker alle forsætlige og uforudsete tilfælde.

som vi kan se fra udskriften, tager den anden proces en af de tre grene hver gang tællerne ændres.

 få eksklusiv adgang til øvelser og svar!

afhentning

  • If-Then kan bruges alene eller i kombination med Elsif og Else.
  • udtryk kan indeholde relationelle og logiske sammenligninger og matematiske beregninger

gå til næste tutorial “