Concevoir des architectures structurelles en VHDL : déclaration de composants, port map, generic map, et instanciation directe.
Une hiérarchie organise le circuit en blocs dont les ports sont reliés. Le style comportemental décrit une fonction ; le style structurel assemble des blocs déjà définis.
Style
Description
Comportemental (RTL)
On décrit ce que fait le circuit (process, affectations)
Structurel
On assemble des composants existants comme sur un schéma
Instancier un bloc
Avec component, déclare l'interface dans la zone déclarative avant l'instanciation :
architecture rtl of top_level is -- Déclaration du composant (copie de l'entité) component additionneur is generic ( g_WIDTH : integer := 8 ); port ( i_a : in std_logic_vector(g_WIDTH-1 downto 0); i_b : in std_logic_vector(g_WIDTH-1 downto 0); o_sum : out std_logic_vector(g_WIDTH-1 downto 0); o_cout : out std_logic ); end component additionneur; -- Signaux de connexion signal w_result : std_logic_vector(7 downto 0); signal w_carry : std_logic;begin -- Instanciation U_ADD : additionneur generic map (g_WIDTH => 8) port map ( i_a => i_operande_a, i_b => i_operande_b, o_sum => w_result, o_cout => w_carry );end architecture rtl;
Les labels U_ADD, U_ ou U1 identifient les instances selon la convention choisie.
Depuis VHDL-93, l'instanciation directe permet de viser l'entité sans redéclarer son interface :
architecture rtl of top_level is signal w_sum : std_logic_vector(7 downto 0); signal w_carry : std_logic;begin U_ADD : entity work.additionneur generic map (g_WIDTH => 8) port map ( i_a => i_op_a, i_b => i_op_b, o_sum => w_sum, o_cout => w_carry );end architecture rtl;
work désigne la bibliothèque de travail courante. Compile les unités dans l'ordre nécessaire pour que l'entité soit disponible.
L'association nommée rend chaque connexion explicite et résiste mieux aux changements d'ordre des ports :
-- Association nommée (recommandée - explicite et sûre)port map ( i_clk => i_clk, i_rst => i_reset, o_data => w_data_out);-- Association positionnelle (déconseillée - fragile)port map (i_clk, i_reset, w_data_out);
Une sortie inutilisée peut être laissée open :
U_CPT : entity work.compteur port map ( i_clk => i_clk, i_rst => i_rst, o_count => w_count, o_tc => open -- Terminal Count non utilisé );
Connecte une entrée à un signal ou à une valeur. open est possible pour une entrée munie d'une valeur par défaut dans l'entité.
Construire le top-level
Cet assemblage relie un compteur BCD à un décodeur sept segments :
library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity top_afficheur is port ( i_clk : in std_logic; i_rst : in std_logic; o_seg : out std_logic_vector(6 downto 0) );end entity top_afficheur;architecture structural of top_afficheur is signal w_bcd : std_logic_vector(3 downto 0);begin -- Compteur BCD : compte de 0 à 9 U_CPT : entity work.bcd_counter port map ( i_clk => i_clk, i_rst => i_rst, i_en => '1', o_count => w_bcd, o_tc => open ); -- Décodeur 7 segments : BCD → afficheur U_DEC : entity work.decodeur_7seg port map ( i_bcd => w_bcd, o_seg => o_seg );end architecture structural;
Le signal w_bcd transporte la valeur entre les deux blocs. Les deux entités doivent être présentes dans la bibliothèque de travail.
Pour répéter une structure, generate crée plusieurs instances à l'élaboration. Voici quatre bascules D formant un registre à décalage :
architecture structural of shift_reg_4 is signal w_chain : std_logic_vector(4 downto 0);begin w_chain(0) <= i_data; GEN_FF : for i in 0 to 3 generate U_FF : entity work.bascule_d port map ( i_clk => i_clk, i_rst => i_rst, i_d => w_chain(i), o_q => w_chain(i+1) ); end generate GEN_FF; o_data <= w_chain(4);end architecture structural;
Mélanger les styles avec une structure claire
Une architecture peut contenir des instances et de la logique comportementale :
architecture rtl of exemple_mixte is signal w_count : unsigned(7 downto 0); signal w_done : std_logic;begin -- Bloc comportemental (process) p_ctrl : process(i_clk) begin if rising_edge(i_clk) then if w_done = '1' then o_led <= '1'; end if; end if; end process p_ctrl; -- Bloc structurel (instanciation) U_CPT : entity work.compteur_8bit port map ( i_clk => i_clk, i_rst => i_rst, o_count => w_count, o_tc => w_done );end architecture rtl;
Pour faciliter la lecture d'un grand design, garde autant que possible le top-level consacré aux connexions et place les fonctions complexes dans des sous-blocs. C'est une règle d'organisation, pas une restriction du langage.