Dominando la instanciación con port map en VHDL: Guía práctica
En VHDL, un módulo es una unidad autocontenida que se comunica con el mundo exterior a través de su entidad. La cláusula port map de una instanciación conecta los puertos formales de la entidad a señales en el diseño circundante.
Módulos, Entidades y Testbenches
Cuando desarrollamos para un FPGA o ASIC, la lógica de diseño vive en módulos que tienen puertos de entrada y salida claramente definidos. Un módulo que no tiene puertos es un testbench —un envoltorio de simulación que alimenta estímulos al device under test (DUT) pero nunca aparece en un chip físico.
En entradas anteriores escribimos todo el VHDL en un solo archivo, lo cual es conveniente para experimentos rápidos pero no adecuado para diseños de producción. Separar el DUT de su testbench mejora la legibilidad, reutilizabilidad y hace clara la jerarquía de simulación.
Convenciones de nomenclatura comunes
Muchos equipos siguen un esquema simple: el archivo de diseño es MyModule.vhd, mientras que su testbench es MyModuleTb.vhd. La arquitectura del DUT a menudo se llama rtl (register-transfer level), y la arquitectura del testbench se nombra sim. Esta convención le dice instantáneamente si un archivo está destinado a síntesis o simulación.
Sintaxis VHDL para instanciación con port map
Defina la interfaz de un módulo con la palabra clave entity:
entity <entity_name> is
port(
<entity_signal_name> : in|out|inout <signal_type>;
...
);
end entity;
Instancie el módulo en otro archivo VHDL con un port map explícito:
<label> : entity <library_name>.<entity_name>(<architecture_name>)
port map(
<entity_signal_name> => <local_signal_name>,
...
);
El <label> aparece en la jerarquía del simulador, <library_name> por defecto es work, y cada puerto formal debe vincularse a una señal local.
Ejemplo práctico: MUX 4-a-1
A continuación se muestra un par completo de testbench y DUT que implementa un multiplexor 4-a-1 usando señales unsigned de 8 bits.
Código del 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
-- Instanciar el MUX con arquitectura rtl
i_Mux1 : entity work.T15_Mux(rtl)
port map(
Sel => Sel,
Sig1 => Sig1,
Sig2 => Sig2,
Sig3 => Sig3,
Sig4 => Sig4,
Output=> Output
);
-- Proceso de estímulo
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;
Código del Módulo
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T15_Mux is
port(
-- Entradas
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);
-- Salida
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;
Análisis de forma de onda
Ejecutar el testbench en ModelSim produce una forma de onda que coincide con el comportamiento esperado del MUX. La captura de forma de onda siguiente confirma que el DUT cambia correctamente entre las cuatro señales de entrada a medida que la señal Sel cambia.
Conclusiones clave
- Los módulos exponen entradas y salidas a través de los puertos de su
entity. - Los testbenches no contienen puertos y son solo para simulación.
- El mapeo de puertos explícito es la forma más transparente de instanciar un módulo VHDL.
- Nomenclatura consistente (ej.
rtlpara DUT,simpara testbench) mejora la legibilidad entre proyectos.
Continúe al siguiente tutorial para obtener insights más profundos sobre patrones de diseño VHDL.
VHDL
- Dominando las Técnicas de Afiladora de Herramientas: Guía Práctica
- Cómo el molibdeno moldea la industria moderna: usos, beneficios y dinámica de suministro
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Creación de un testbench dirigido por Tcl para un módulo VHDL de cerradura por código
- Finalizar elegantemente una simulación de testbench VHDL
- Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
- Generación de números aleatorios en VHDL: De uniforme a OSVVM
- Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente
- Diseño de máquina de estados finitos en VHDL: Ejemplo práctico de semáforo