Comprendre la différence entre signaux et variables en VHDL
Dans notre tutoriel précédent, nous avons exploré comment déclarer une variable au sein d'un processus. Les variables sont idéales pour un travail algorithmique local, mais elles ne peuvent pas être vues en dehors de ce processus. Lorsque vous avez besoin qu'une valeur soit partagée avec d'autres parties du design, vous utilisez un signal.
Les signaux sont déclarés dans la région déclarative d'une architecture — c'est-à-dire entre la ligne architecture <architecture_name> of <entity_name> is et le mot-clé begin.
Cet article fait partie de la série Tutoriels VHDL de base.
La syntaxe pour déclarer un signal est :signal <name> : <type>;
Un signal peut être déclaré avec une valeur initiale optionnelle :signal <name> : <type> := <initial_value>;
Exercice
Dans ce tutoriel vidéo, nous apprenons à déclarer un signal et découvrons la différence fondamentale entre une variable et un signal.
Le code final que nous avons créé dans ce tutoriel :
entity T06_SignalTb is end entity; architecture sim of T06_SignalTb is signal MySignal : integer := 0; begin process is variable MyVariable : integer := 0; begin report "*** Process begin ***"; MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); wait for 10 ns; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); end process; end architecture;
La sortie sur la console du simulateur lorsque nous avons appuyé sur le bouton run dans ModelSim :
VSIM 2> run # ** Note: *** Process begin *** # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=1, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: *** Process begin *** # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=3, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=2 # Time: 20 ns Iteration: 0 Instance: /t06_signaltb ...
Analyse
Nous avons créé un signal et une variable avec la même valeur initiale de 0. Bien que nous les ayons traités de manière identique dans le processus, la sortie console révèle des comportements distincts. Les différences clés sont :
- Les variables utilisent l'opérateur
:=et sont mises à jour immédiatement au sein du processus. - Les signaux utilisent l'opérateur
<=; la nouvelle valeur est planifiée et ne prend effet que lorsque le processus se suspend (par exemple, à une instructionwait). - Lorsqu'un signal est affecté plusieurs fois avant que le processus ne reprenne, seule la dernière affectation « gagne » car les valeurs planifiées antérieures sont écrasées.
Dans notre exemple, les deux premiers incréments de MySignal ont été perdus car ils ont été écrasés avant l'instruction wait for 10 ns; qui a causé la suspension du processus et la mise à jour du signal. L'incrément subséquent apparaît après la suspension, correspondant au comportement attendu.
À retenir
- Utilisez des variables pour des valeurs temporaires nécessitant des mises à jour immédiates et locales.
- Utilisez des signaux lorsque vous devez communiquer des changements à d'autres processus ou composants.
- Rappelez-vous que les affectations de signaux sont planifiées et ne sont validées que lorsque le processus fait une pause ; plusieurs affectations sans pause ne feront survivre que la dernière valeur.
Allez au tutoriel suivant »
VHDL
- Maîtriser les types Signé vs Non-signé en VHDL : insights pratiques
- Variables VHDL expliquées : exemples pratiques et règles pour un design fiable
- Cloud Computing vs Informatique Traditionnelle : Comparaison Pratique
- 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
- Système de navigation par satellite BeiDou expliqué : comment il se démarque du GPS