Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> VHDL

Maîtriser les instructions Generate VHDL : Créer des anti-rebonds réutilisables facilement

L'instruction generate de VHDL permet aux concepteurs de répliquer automatiquement un bloc de code sur plusieurs instances, chacune câblée à des signaux distincts. Considérez-la comme une boucle for à la compilation qui peut créer des processus chaînés ou des instanciations de modules, réduisant considérablement le code boilerplate et améliorant la maintenabilité.

Contrairement à une boucle traditionnelle, confinée à un processus ou un sous-programme, generate se situe directement dans la région d'architecture. Combinée avec des génériques, elle devient un mécanisme puissant pour créer des composants VHDL hautement configurables et réutilisables.

Syntaxe de l'instruction Generate

[label :] for <constant_name> in <range> generate [declarations_local_to_each_loop_iteration] [begin] <processes_and_instantiations> end generate [label];

Les éléments optionnels sont entre crochets. Vous pouvez omettre la région déclarative et le mot-clé begin si aucun objet local n'est déclaré. Le <range> suit la syntaxe standard d'entier en utilisant to ou downto.

Anti-rebond (debouncer) sur un bit

Avant de plonger dans generate, révisons un anti-rebond simple qui nettoie une entrée d'interrupteur unique. Un générique timeout_cycles permet au module de s'adapter à toute fréquence d'horloge. L'anti-rebond supprime les glitches transitoires qui se produisent lors de la transition d'un interrupteur mécanique.

entity debouncer is generic ( timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switch : in std_logic; switch_debounced : out std_logic ); end debouncer;

L'implémentation repose sur un compteur entier dont la largeur est dictée par le générique. Un signal fantôme debounced est utilisé en interne pour garder la logique de sortie propre.

architecture rtl of debouncer is signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin -- Copier le signal interne vers la sortie switch_debounced <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switch; else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switch /= debounced then counter <= 0; debounced <= switch; end if; end if; end if; end process; end architecture;

La simulation dans ModelSim confirme que switch_debounced suit l'entrée seulement après le timeout spécifié, filtrant efficacement les artefacts de rebond.

Maîtriser les instructions Generate VHDL : Créer des anti-rebonds réutilisables facilement

Téléchargez le projet ModelSim complet, incluant les bancs de test, en fournissant votre adresse e-mail ci-dessous. Toutes les mises à jour sont envoyées depuis VHDLwhiz, et vous pouvez vous désabonner à tout moment.

Boucle Generate avec instanciations

Pour étendre l'anti-rebond à un tableau d'interrupteurs, nous utilisons une instruction generate pour créer automatiquement plusieurs instances.

entity debouncer_gen_inst is generic ( switch_count : positive; timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switches : in std_logic_vector(switch_count - 1 downto 0); switches_debounced : out std_logic_vector(switch_count - 1 downto 0) ); end debouncer_gen_inst;

L'architecture utilise une boucle generate pour instancier debouncer pour chaque bit d'interrupteur. Chaque instance partage la même horloge et le même reset mais se connecte à un élément distinct du vecteur.

architecture rtl of debouncer_gen_inst is begin MY_GEN : for i in 0 to switch_count - 1 generate DEBOUNCER : entity work.debouncer(rtl) generic map ( timeout_cycles => timeout_cycles ) port map ( clk => clk, rst => rst, switch => switches(i), switch_debounced => switches_debounced(i) ); end generate; end architecture;

L'étiquetage du bloc generate (par ex. MY_GEN) améliore la lisibilité dans la hiérarchie du simulateur et les rapports de synthèse, facilitant le débogage.

Maîtriser les instructions Generate VHDL : Créer des anti-rebonds réutilisables facilement

Le banc de test ne bascule que l'interrupteur 3, donc la forme d'onde se concentre sur MY_GEN(3). Exécutez cet exemple dans ModelSim pour voir la logique d'anti-rebond en action.

Boucle Generate contenant des processus

Alternativement, vous pouvez intégrer la logique de l'anti-rebond dans le bloc generate lui-même, éliminant les instanciations de composants séparés. Cette approche démontre qu'une boucle generate peut aussi créer des processus identiques avec des signaux locaux.

architecture rtl of debouncer_gen_proc is begin MY_GEN : for i in 0 to switch_count - 1 generate signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin switches_debounced(i) <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switches(i); else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switches(i) /= debounced then counter <= 0; debounced <= switches(i); end if; end if; end if; end process; end generate; end architecture;

Le comportement résultant correspond à l'approche par instanciation de modules, mais le code est autonome dans l'architecture. Les deux méthodes sont valides ; choisissez celle qui correspond le mieux à votre style de conception.

Tous les exemples de code, y compris le projet ModelSim complet, sont disponibles en téléchargement via le formulaire ci-dessous. Abonnez-vous à VHDLwhiz pour les mises à jour, et n'hésitez pas à vous désabonner à tout moment.

Avez-vous une utilisation créative pour generate ? Partagez vos idées dans les commentaires ci-dessous !

VHDL

  1. Exemple de procédure VHDL : incrémenter un std_logic_vector
  2. Exploiter les records VHDL pour des interfaces FIFO propres et réutilisables
  3. Variables VHDL expliquées : exemples pratiques et règles pour un design fiable
  4. Configuration analyse AC, DC, transitoire, Fourier et options SPICE
  5. Comprendre les interrupteurs électriques : types, fonctions et applications
  6. Maîtriser l'instruction Switch C# : Syntaxe, exemples et bonnes pratiques
  7. Instruction Break C# : Comment et quand l'utiliser
  8. Maîtriser l'instruction Continue C# : Comment ignorer efficacement les itérations de boucle
  9. Maîtriser le switch-case en C++ : Syntaxe, utilisation et exemples pratiques