Exploiter les records VHDL pour des interfaces FIFO propres et réutilisables
En VHDL, les records offrent un moyen puissant de rationaliser votre design, à l'image des structs en C. En regroupant des signaux liés en un seul type, vous pouvez réduire drastiquement la duplication de code, améliorer la lisibilité et simplifier les port maps à travers de multiples entités.
Les records brillent quand vous travaillez avec de larges interfaces récurrentes — comme celles se connectant à des mémoires hors puce ou des FIFOs — où le même ensemble de signaux de contrôle et de données apparaît répétitivement. Définir un record une fois dans un package et le réutiliser partout garde vos interfaces d'entité propres et facilite les futures modifications.
L'exemple suivant montre comment créer deux types de records dans un package dédié (example_record_pkg.vhd) et les utiliser pour modélier les signaux d'entrée et de sortie d'une FIFO. Un unique signal record représente toutes les entrées depuis la FIFO, et un autre représente toutes les sorties vers la FIFO.
Points clés :
- Les records simplifient les déclarations d'entité et les port maps en VHDL.
- Ils peuvent contenir des éléments de types variés —
std_logic,integer,std_logic_vector, etc. - Les records sont analogues aux structs C, offrant un paradigme familier pour de nombreux ingénieurs.
- Les types de records partagés devraient résider dans un unique package pour la cohérence.
- Les signaux record peuvent être initialisés avec des constantes pour des valeurs de démarrage prévisibles.
- Les tableaux de records permettent une gestion structurée des données, comme une table de configurations FIFO.
Voici la définition du package, suivie d'une entité exemple qui utilise les types record pour gérer la logique de lecture/écriture FIFO. Le code est pleinement conforme au standard IEEE 1076‑2008.
library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- Sorties depuis la FIFO. type t_FROM_FIFO is record wr_full : std_logic; -- Flag FIFO Plein rd_empty : std_logic; -- Flag FIFO Vide rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- Entrées vers la FIFO. type t_TO_FIFO is record wr_en : std_logic; wr_data : std_logic_vector(7 downto 0); rd_en : std_logic; end record t_TO_FIFO; constant c_FROM_FIFO_INIT : t_FROM_FIFO := (wr_full => '0', rd_empty => '1', rd_dv => '0', rd_data => (others => '0')); constant c_TO_FIFO_INIT : t_TO_FIFO := (wr_en => '0', wr_data => (others => '0'), rd_en => '0'); end package example_record_pkg;
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.example_record_pkg.all; -- USING PACKAGE HERE! entity example_record is port ( i_clk : in std_logic; i_fifo : in t_FROM_FIFO; o_fifo : out t_TO_FIFO := c_TO_FIFO_INIT -- initialiser record sortie ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- Gère les écritures vers la FIFO p_FIFO_WR : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.wr_full = '0' then o_fifo.wr_en <= '1'; o_fifo.wr_data <= std_logic_vector(r_WR_DATA + 1); end if; end if; end process p_FIFO_WR; -- Gère les lectures depuis la FIFO p_FIFO_RD : process (i_clk) is begin if rising_edge(i_clk) then if i_fifo.rd_empty = '0' then o_fifo.rd_en <= '1'; end if; end if; end process p_FIFO_RD; end behave;
VHDL
- Introduction à VHDL : construire votre première porte ET
- Guide complet des conversions de types VHDL avec Numeric_Std et Std_Logic_Arith
- Exemple de procédure VHDL : incrémenter un std_logic_vector
- 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
- Configuration analyse AC, DC, transitoire, Fourier et options SPICE
- L'art et le processus de production des disques vinyles LP
- Maîtriser la vérification formelle de modules VHDL avec PSL
- Créer des listes de chaînes en VHDL : Bonnes pratiques et exemple