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 true
o 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.
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 ”