hur man använder villkorliga uttalanden i VHDL: If-Then-Elsif-Else
i föregående handledning använde vi ett villkorat uttryck med Wait to-uttalandet. Uttrycket säkerställde att processen endast utlöstes när de två motsignalerna var lika. Men vad händer om vi ville att programmet i en process skulle vidta olika åtgärder baserat på olika insatser?
de If-Then-Elsif-Else uttalanden kan användas för att skapa grenar i vårt program. Beroende på värdet på en variabel eller resultatet av ett uttryck kan programmet ta olika vägar.
detta blogginlägg är en del av den grundläggande VHDL Tutorials serien.
den grundläggande syntaxen är:
if <condition> then
elsif <condition> then
else
end if;
elsif
och else
är valfria och elsif
kan användas flera gånger. <condition>
kan vara en boolesk true
eller false
, eller det kan vara ett uttryck som utvärderas till true
eller false
.
Exempeluttryck som är true
om MyCounter
är mindre än 10:
MyCounter < 10
Relationsoperatörer:
= | lika |
/= | inte lika |
< | mindre än |
<= | mindre än eller lika |
> | större än |
>= | större än eller lika |
logiska operatorer:
inte a | sant om a är falskt |
A och b | sant om a och b är sanna |
A eller b | sant om a eller b är sanna |
a nand b | sant om a eller b är falskt |
a nor b | sant om a och b är falska |
a xor b | sant om exakt en av a eller b är sant |
a xnor b | sant om a och b är lika |
övning
i denna videohandledning vi lär oss hur du använder If-Then-Elsif-Else-uttalanden i VHDL:
den slutliga koden vi skapade i denna handledning:
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;
utgången till simulatorkonsolen när vi tryckte på knappen Kör 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...
analys
vi gav CountDown
ett initialvärde på 10 och CountUp
ett värde på 0. Den första processen ändrar båda räknarvärdena exakt samtidigt, var 10: e ns. När detta händer utlöses den andra processen eftersom programmet alltid väntar på wait on CountUp, CountDown;
– raden. Programmet kommer alltid att vänta där eftersom If-Then-Elsif-Else och rapportens uttalanden förbrukar noll simuleringstid.
If-Then-Elsif-Else-uttalandet kommer att få programmet att ta en av de tre grenarna vi skapade. De två första grenarna täcker de fall där de två räknarna har olika värden. Vi kunde ha tappat singeln else
och använt elsif CountUp = CountDown then
vilket skulle ha haft samma resultat. Men det är bra designpraxis att täcka alla grenar, och else
– klausulen täcker alla avsiktliga och oförutsedda fall.
som vi kan se från utskriften tar den andra processen en av de tre grenarna varje gång räknarna ändras.
Takeaway
- If-Then kan användas ensamt eller i kombination med Elsif och Else.
- uttryck kan innehålla relationella och logiska jämförelser och matematiska beräkningar
gå till nästa handledning ”