Maîtriser l'instanciation par port map en VHDL : Guide pratique
En VHDL, un module est une unité autonome qui communique avec le monde extérieur à travers son entité. La clause port map d'une instanciation connecte les ports formels de l'entité aux signaux dans le design environnant.
Modules, Entités et Testbench
Quand nous développons pour un FPGA ou ASIC, la logique de design vit dans des modules qui ont des ports d'entrée et de sortie clairement définis. Un module qui n'a pas de ports est un testbench - une enveloppe de simulation qui fournit des stimuli au device under test (DUT) mais n'apparaît jamais sur une puce physique.
Dans les articles précédents, nous avons écrit tout le VHDL dans un seul fichier, ce qui est pratique pour des expériences rapides mais pas adapté pour des designs de production. Séparer le DUT de son testbench améliore la lisibilité, la réutilisabilité, et rend la hiérarchie de simulation claire.
Conventions de nommage courantes
De nombreuses équipes suivent un schéma simple : le fichier de design est MyModule.vhd, tandis que son testbench est MyModuleTb.vhd. L'architecture du DUT est souvent appelée rtl (register-transfer level), et l'architecture du testbench est nommée sim. Cette convention dit instantanément si un fichier est destiné à la synthèse ou à la simulation.
Syntaxe VHDL pour l'instanciation par port map
Définissez l'interface d'un module avec le mot-clé entity :
entity <entity_name> is
port(
<entity_signal_name> : in|out|inout <signal_type>;
...
);
end entity;
Instanciez le module dans un autre fichier VHDL avec un port map explicite :
<label> : entity <library_name>.<entity_name>(<architecture_name>)
port map(
<entity_signal_name> => <local_signal_name>,
...
);
Le <label> apparaît dans la hiérarchie du simulateur, <library_name> défaut à work, et chaque port formel doit être lié à un signal local.
Exemple pratique : MUX 4-vers-1
Ci-dessous se trouve une paire testbench et DUT complète qui implémente un multiplexeur 4-vers-1 en utilisant des signaux unsigned 8 bits.
Code du testbench
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T15_PortMapTb is
end entity;
architecture sim of T15_PortMapTb is
signal Sig1 : unsigned(7 downto 0) := x"AA";
signal Sig2 : unsigned(7 downto 0) := x"BB";
signal Sig3 : unsigned(7 downto 0) := x"CC";
signal Sig4 : unsigned(7 downto 0) := x"DD";
signal Sel : unsigned(1 downto 0) := (others => '0');
signal Output : unsigned(7 downto 0);
begin
-- Instancier le MUX avec l'architecture rtl
i_Mux1 : entity work.T15_Mux(rtl)
port map(
Sel => Sel,
Sig1 => Sig1,
Sig2 => Sig2,
Sig3 => Sig3,
Sig4 => Sig4,
Output => Output
);
-- Processus de stimulus
process is
begin
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= Sel + 1;
wait for 10 ns;
Sel <= "UU";
wait;
end process;
end architecture;
Code du module
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T15_Mux is
port(
-- Entrées
Sig1 : in unsigned(7 downto 0);
Sig2 : in unsigned(7 downto 0);
Sig3 : in unsigned(7 downto 0);
Sig4 : in unsigned(7 downto 0);
Sel : in unsigned(1 downto 0);
-- Sortie
Output : out unsigned(7 downto 0)
);
end entity;
architecture rtl of T15_Mux is
begin
process(Sel, Sig1, Sig2, Sig3, Sig4) is
begin
case Sel is
when "00" => Output <= Sig1;
when "01" => Output <= Sig2;
when "10" => Output <= Sig3;
when "11" => Output <= Sig4;
when others => Output <= (others => 'X');
end case;
end process;
end architecture;
Analyse de la forme d'onde
L'exécution du testbench dans ModelSim produit une forme d'onde qui correspond au comportement attendu du MUX. L'instantané de forme d'onde ci-dessous confirme que le DUT commute correctement entre les quatre signaux d'entrée alors que le signal Sel change.
Points clés à retenir
- Les modules exposent les entrées et sorties via les ports de leur
entity. - Les testbench ne contiennent pas de ports et sont uniquement pour la simulation.
- Le port mapping explicite est la façon la plus transparente d'instancier un module VHDL.
- Un nommage cohérent (ex:
rtlpour DUT,simpour testbench) améliore la lisibilité à travers les projets.
Continuez au tutoriel suivant pour des insights plus profonds sur les patterns de design VHDL.
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
- Créer un banc de test piloté par Tcl pour un module verrou code VHDL
- 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
- Maîtriser les fonctions VHDL : Guide pratique pour un design efficace
- Maîtriser les techniques de la rectifieuse d'outils : guide pratique