Comment utiliser les instructions conditionnelles en VHDL: If-Then-Elsif-Else
Dans le tutoriel précédent, nous avons utilisé une expression conditionnelle avec l’instruction Wait Until. L’expression garantissait que le processus n’était déclenché que lorsque les deux signaux de compteur étaient égaux. Mais que se passe-t-il si nous voulions que le programme dans un processus prenne différentes mesures en fonction de différentes entrées?
Les instructions If-Then-Elsif-Else peuvent être utilisées pour créer des branches dans notre programme. Selon la valeur d’une variable ou le résultat d’une expression, le programme peut prendre des chemins différents.
Cet article de blog fait partie de la série de tutoriels VHDL de base.
La syntaxe de base est:
if <condition> then
elsif <condition> then
else
end if;
Les elsif
et else
sont facultatifs et elsif
peuvent être utilisés plusieurs fois. Le <condition>
peut être un booléen true
ou false
, ou il peut s’agir d’une expression qui s’évalue à true
ou false
.
Expression d’exemple qui est true
si MyCounter
est inférieur à 10:
MyCounter < 10
Opérateurs relationnels:
= | égal |
/= | pas égal |
< | moins de |
<= | inférieur ou égal |
> | supérieur à |
>= | supérieur ou égal |
Opérateurs logiques:
pas a | true si a est faux |
a et b | vrai si a et b sont vrais |
a ou b | vrai si a ou b sont vrais |
a nand b | vrai si a ou b est faux |
a ni b | vrai si a et b sont faux |
a xor b | vrai si exactement l’un des a ou b est vrai |
a xnor b | vrai si a et b sont égaux |
Exercice
Dans ce tutoriel vidéo nous allons apprendre à utiliser les instructions If-Then-Elsif-Else en VHDL :
Le code final que nous avons créé dans ce tutoriel:
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;
La sortie vers la console du simulateur lorsque nous avons appuyé sur le bouton Exécuter dans 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...
Analyse
Nous avons donné CountDown
une valeur initiale de 10 et CountUp
une valeur de 0. Le premier processus modifie les deux valeurs de compteur exactement au même moment, toutes les 10 ns. Lorsque cela se produit, le deuxième processus est déclenché car le programme attendra toujours à la ligne wait on CountUp, CountDown;
. Le programme y attendra toujours car les instructions If-Then-Elsif-Else et report ne consomment aucun temps de simulation.
L’instruction If-Then-Elsif-Else fera que le programme prendra l’une des trois branches que nous avons créées. Les deux premières branches couvrent les cas où les deux compteurs ont des valeurs différentes. Nous aurions pu laisser tomber le single else
, et utiliser elsif CountUp = CountDown then
qui aurait eu le même résultat. Mais il est de bonne pratique de conception de couvrir toutes les branches, et la clause else
couvre tous les cas intentionnels et imprévus.
Comme on peut le voir sur l’impression, le deuxième processus prend l’une des trois branches chaque fois que les compteurs changent.
Plats à emporter
- If-Then peut être utilisé seul ou en association avec Elsif et Else.
- Les expressions peuvent contenir des comparaisons relationnelles et logiques et des calculs mathématiques
Aller au tutoriel suivant «