Maîtriser les boucles For en VHDL : guide pratique
Dans le tutoriel précédent, nous avons exploré comment créer une boucle infinie en utilisant l'instruction loop et en sortir avec exit. Et si nous avons besoin que la boucle s'exécute un nombre spécifique de fois ? La boucle For est la solution la plus directe.
Une boucle For itère sur une plage fixe d'entiers ou d'éléments énumérés. La valeur d'itération courante est automatiquement disponible à l'intérieur de la boucle via une constante implicitement déclarée.
Cet article fait partie de la série Tutoriels VHDL de base.
Syntaxe
for <constant> in <range> loop -- corps de la boucle end loop;
Ici, <constant> est un nom défini par l'utilisateur pour le compteur de boucle, et <range> peut être une plage d'entiers (croissante ou décroissante) ou un ensemble de valeurs énumérées.
Plages d'entiers
- Plage croissante :
0 to 9– itère 0,1,2,…,9. - Plage décroissante :
9 downto 0– itère 9,8,7,…,0. - Valeur unique :
0 to 0– itère seulement 0. - Plage vide :
0 to -1– le corps de la boucle ne s'exécute jamais.
Exemple de code
entity T04_ForLoopTb is end entity; architecture sim of T04_ForLoopTb is begin process is begin for i in 1 to 10 loop report "i=" & integer'image(i); end loop; wait; end process; end architecture;
Sortie de simulation (ModelSim)
VSIM 2> run # ** Note: i=1 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=2 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=3 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=4 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=5 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=6 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=7 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=8 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=9 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb # ** Note: i=10 # Time: 0 ns Iteration: 0 Instance: /t04_forlooptb
Analyse
La boucle For a exécuté exactement dix itérations, affichant la valeur du compteur au temps de simulation 0. Comme il n'y a pas de wait à l'intérieur de la boucle, la boucle entière se termine instantanément. Le wait; final place le processus en pause infinie, ce qui est courant dans les testbenches.
Nous avons également démontré deux opérations de chaîne essentielles :
integer'image(i)– convertit un entier en chaîne.&– concatène deux chaînes.
Points clés à retenir
- Les boucles For peuvent itérer sur des plages croissantes (
to) et décroissantes (downto). - Les valeurs entières sont converties en chaînes avec
integer'image(). - La concaténation de chaînes utilise l'opérateur
&.
Passez au tutoriel suivant pour des concepts VHDL plus approfondis.
VHDL
- Comment le molybdène façonne l'industrie moderne : usages, avantages et dynamiques d'approvisionnement
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple
- Terminer proprement une simulation de banc de test VHDL
- Implémenter un contrôleur PWM en VHDL : Conception, simulation et démo FPGA
- Générer des nombres aléatoires en VHDL : De l'uniforme à OSVVM
- Exploiter les procédures in-process pour un design FSM VHDL plus propre
- Utilisation des fonctions impures en VHDL : Améliorer la lisibilité et la maintenabilité des FSM
- Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
- Maîtriser les techniques de la rectifieuse d'outils : guide pratique