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 true
eller 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.
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 “