Comment utiliser les instructions conditionnelles en VHDL :If-Then-Elsif-Else
Dans le didacticiel 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 passerait-il si nous voulions que le programme d'un processus entreprenne différentes actions 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 emprunter des chemins différents.
Cet article de blog fait partie de la série de didacticiels VHDL de base.
La syntaxe de base est :
if <condition> then
elsif <condition> then
else
end if;
Le elsif
et else
sont facultatifs, et elsif
peut être utilisé plusieurs fois. Le <condition>
peut être un booléen true
ou false
, ou il peut s'agir d'une expression évaluée à true
ou false
.
Exemple d'expression 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 un | vrai si un est faux |
un et b | vrai si un et b sont vrais |
un ou b | vrai si un ou b sont vrais |
un et b | vrai si un ou b est faux |
un ni b | vrai si un et b sont faux |
un xor b | true si exactement l'un des a ou b sont vrais |
un xnor b | vrai si un et b sont égaux |
Exercice
Dans ce didacticiel 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 is end 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 d'exécution 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 au wait on CountUp, CountDown;
ligne. Le programme attendra toujours là car les instructions If-Then-Elsif-Else et le rapport ne consomment aucun temps de simulation.
L'instruction If-Then-Elsif-Else forcera le programme à prendre 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 supprimer le seul else
, et utilisé elsif CountUp = CountDown then
qui aurait eu le même résultat. Mais c'est une bonne pratique de conception de couvrir toutes les branches, et le else
clause couvre tous les cas intentionnels et imprévus.
Comme nous pouvons le voir sur l'impression, le deuxième processus prend l'une des trois branches à chaque fois que les compteurs changent.
À emporter
- If-Then peut être utilisé seul ou en combinaison avec Elsif et Else.
- Les expressions peuvent contenir des comparaisons relationnelles et logiques et des calculs mathématiques
Aller au tutoriel suivant »
VHDL
- Comment utilisons-nous le molybdène?
- Comment créer une liste de chaînes en VHDL
- Comment arrêter la simulation dans un testbench VHDL
- Comment créer un contrôleur PWM en VHDL
- Comment générer des nombres aléatoires en VHDL
- Comment utiliser une procédure dans un processus en VHDL
- Comment utiliser une fonction impure en VHDL
- Comment utiliser une fonction en VHDL
- Comment utiliser une meuleuse de coupe