Aprovechando records VHDL para interfaces FIFO limpias y reutilizables
En VHDL, los records ofrecen una forma poderosa de agilizar su diseño, de forma similar a los structs en C. Al agrupar señales relacionadas en un solo tipo, puede reducir drásticamente la duplicación de código, mejorar la legibilidad y simplificar los mapas de puertos a través de múltiples entidades.
Los records brillan cuando trabaja con interfaces grandes y recurrentes —como las que conectan a memorias off-chip o FIFOs— donde el mismo conjunto de señales de control y datos aparece repetidamente. Definir un record una vez en un paquete y reutilizarlo en todas partes mantiene sus interfaces de entidad ordenadas y facilita futuras modificaciones.
El siguiente ejemplo demuestra cómo crear dos tipos de record en un paquete dedicado (example_record_pkg.vhd) y usarlos para modelar las señales de entrada y salida de una FIFO. Una única señal record representa todas las entradas desde la FIFO, y otra representa todas las salidas hacia la FIFO.
Puntos clave:
- Los records simplifican declaraciones de entidad y mapas de puertos en VHDL.
- Pueden contener elementos de tipos variados —
std_logic,integer,std_logic_vector, etc. - Los records son análogos a structs en C, proporcionando un paradigma familiar para muchos ingenieros.
- Los tipos de record compartidos deben residir en un solo paquete para consistencia.
- Las señales record pueden inicializarse con constantes para valores de arranque predecibles.
- Arrays de records permiten manejo estructurado de datos, como una tabla de configuraciones de FIFO.
A continuación se muestra la definición del paquete, seguida de una entidad de ejemplo que usa los tipos de record para gestionar lógica de lectura/escritura FIFO. El código es totalmente compatible con el estándar IEEE 1076‑2008.
library ieee; use ieee.std_logic_1164.all; package example_record_pkg is -- Outputs desde la FIFO. type t_FROM_FIFO is record wr_full : std_logic; -- Bandera FIFO Llena rd_empty : std_logic; -- Bandera FIFO Vacía rd_dv : std_logic; rd_data : std_logic_vector(7 downto 0); end record t_FROM_FIFO; -- Inputs hacia 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; -- USANDO PAQUETE AQUÍ! 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 -- inicializar record de salida ); end example_record; architecture behave of example_record is signal r_WR_DATA : unsigned(7 downto 0) := (others => '0'); begin -- Maneja escrituras a 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; -- Maneja lecturas desde 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
- El arte y proceso de producción de discos LP de vinilo
- Configuración de análisis AC: Curvas, puntos y barrido de frecuencia
- Introducción a VHDL: Construyendo tu primera compuerta AND
- Guía completa de conversiones de tipos VHDL con Numeric_Std y Std_Logic_Arith
- Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
- Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas
- Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
- Dominando la verificación formal de módulos VHDL con PSL
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Dominando las sentencias Generate de VHDL: Cree desrebotadores reutilizables fácilmente
- Finalizar elegantemente una simulación de testbench VHDL