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

 få exklusiv tillgång till övningar och svar!

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 ”