cum se utilizează declarații condiționale în VHDL: If-Then-Elsif-Else

în tutorialul anterior am folosit o expresie condițională cu instrucțiunea Wait Until. Expresia a asigurat că procesul a fost declanșat numai atunci când cele două semnale contra în cazul în care egal. Dar dacă am dori ca programul într-un proces să întreprindă acțiuni diferite bazate pe intrări diferite?

declarațiile If-Then-Elsif-Else pot fi folosite pentru a crea sucursale în programul nostru. În funcție de valoarea unei variabile sau de rezultatul unei expresii, programul poate lua căi diferite.

această postare pe blog face parte din seria de tutoriale VHDL de bază.

sintaxa de bază este:

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

elsif și else sunt opționale și elsif pot fi utilizate de mai multe ori. <condition> poate fi un boolean true sau false, sau poate fi o expresie care se evaluează la truesau false.

exemplu de Expresie care este true dacă MyCounter este mai mică decât 10:

MyCounter < 10

operatorii relaționali:

= egal
/= nu este egal
< mai puțin de
<= mai mică sau egală
> mai mare decât
>= mai mare sau egal

operatori logici:

nu este un adevărat dacă a este fals
a și b adevărat dacă a și b sunt adevărate
a sau b adevărat dacă a sau b sunt adevărate
a NAND b adevărat dacă a sau b este fals
a nici b adevărat dacă a și b sunt false
a xor b adevărat dacă exact unul dintre a sau b sunt adevărate
a xnor b adevărat dacă a și b sunt egale

exercițiu

în acest tutorial video vom învăța cum să folosim declarațiile If-Then-Elsif-Else în VHDL:

codul final pe care l-am creat în acest 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;

ieșirea la consola simulator atunci când am apăsat butonul run în 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...

analiza

am dat CountDown o valoare inițială de 10 și CountUp o valoare de 0. Primul proces modifică ambele valori ale contorului în același timp, la fiecare 10 ns. Când se întâmplă acest lucru, al doilea proces este declanșat, deoarece programul va aștepta întotdeauna la linia wait on CountUp, CountDown;. Programul va aștepta întotdeauna acolo, deoarece declarațiile If-Then-Elsif-Else și raportul consumă timp de simulare zero.

declarația If-Then-Elsif-Else va determina programul să ia una dintre cele trei ramuri pe care le-am creat. Cele două prime ramuri acoperă cazurile în care cele două contoare au valori diferite. Am fi putut renunța la single-ul else și am fi folosit elsif CountUp = CountDown then care ar fi avut același rezultat. Dar este o bună practică de proiectare să acopere toate ramurile, iar clauza else acoperă toate cazurile intenționate și neprevăzute.

după cum putem vedea din imprimare, al doilea proces ia una dintre cele trei ramuri de fiecare dată când contoarele se schimbă.

obțineți acces exclusiv la exerciții și răspunsuri!

Takeaway

  • If-Then poate fi utilizat singur sau în asociere cu Elsif și altele.
  • expresiile pot conține comparații relaționale și logice și calcule matematice

mergeți la următorul tutorial ”