Come usare le istruzioni condizionali in VHDL: If-Then-Elsif-Else

Nel tutorial precedente abbiamo usato un’espressione condizionale con l’istruzione Wait Until. L’espressione assicurava che il processo fosse attivato solo quando i due segnali del contatore erano uguali. Ma cosa succede se volessimo che il programma in un processo intraprenda azioni diverse basate su input diversi?

Le istruzioni If-Then-Elsif-Else possono essere utilizzate per creare rami nel nostro programma. A seconda del valore di una variabile o del risultato di un’espressione, il programma può assumere percorsi diversi.

Questo post del blog fa parte della serie di tutorial VHDL di base.

La sintassi di base è:

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

elsif e else sono opzionali e elsif possono essere utilizzati più volte. <condition> può essere un booleano true o false, oppure può essere un’espressione che valuta trueo false.

Espressione di esempio che è true se MyCounter è inferiore a 10:

MyCounter < 10

Operatori relazionali:

= uguale
/= non è uguale
< a meno di
<= inferiore o uguale
> maggiore
>= maggiore o uguale

gli operatori Logici:

non un true se a è falso
a e b vero se a e b sono vere
a o b true se a o b sono vere
un nand b true se a o b è falso
a né b vero se a e b sono false
a xor b true se uno solo di a o b sono vere
un xnor b vero se a e b sono uguali

Esercizio

In questo video tutorial impareremo come utilizzare Se-Poi-Elsif-Else in VHDL:

Il codice finale che abbiamo creato a questo 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;

L’output del simulatore di console, quando abbiamo premuto il pulsante esegui nella 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...

Analisi

Abbiamo dato CountDown un valore iniziale di 10 e CountUp un valore di 0. Il primo processo modifica entrambi i valori del contatore allo stesso tempo, ogni 10 ns. Quando ciò accade, il secondo processo viene attivato perché il programma sarà sempre in attesa alla riga wait on CountUp, CountDown;. Il programma sarà sempre in attesa lì perché le istruzioni If-Then-Elsif-Else e il report consumano zero tempo di simulazione.

L’istruzione If-Then-Elsif-Else farà sì che il programma prenda uno dei tre rami che abbiamo creato. I due primi rami coprono i casi in cui i due contatori hanno valori diversi. Avremmo potuto eliminare il singolo else e usare elsif CountUp = CountDown then che avrebbe avuto lo stesso risultato. Ma è buona pratica di progettazione coprire tutti i rami e la clausola else copre tutti i casi intenzionali e imprevisti.

Come possiamo vedere dalla stampa, il secondo processo prende uno dei tre rami ogni volta che i contatori cambiano.

Ottieni l'accesso esclusivo agli esercizi e alle risposte!

Da asporto

  • If-Then può essere usato da solo o in combinazione con Elsif e Else.
  • Le espressioni possono contenere confronti relazionali e logici e calcoli matematici

Vai al prossimo tutorial ”