VHDL port map instantiation onder de knie krijgen: een praktische gids
In VHDL is een module een zelfstandige eenheid die communiceert met de buitenwereld via zijn entity. De port map-clausule van een instantie verbindt de formele poorten van de entity met signalen in het omringende ontwerp.
Modules, Entiteiten en Testbenches
Wanneer we voor een FPGA of ASIC ontwikkelen, leeft de ontwerplogica in modules met duidelijk gedefinieerde in- en outputpoorten. Een module zonder poorten is een testbench – een simulatie-wrapper die stimuli voedt aan het device under test (DUT) maar nooit op een fysieke chip verschijnt.
In eerdere posts schreven we alle VHDL in een enkel bestand, wat handig is voor snelle experimenten maar niet geschikt voor productieontwerpen. Het scheiden van de DUT van zijn testbench verbetert leesbaarheid, herbruikbaarheid en maakt de simulatiehiërarchie duidelijk.
Gebruikelijke naamconventies
Veel teams volgen een simpel schema: het ontwerpbestand is MyModule.vhd, terwijl de testbench MyModuleTb.vhd heet. De architectuur van de DUT heet vaak rtl (register-transfer level), en de testbench-architectuur heet sim. Deze conventie vertelt je direct of een bedoeld is voor synthetisering of voor simulatie.
VHDL-syntax voor port map instantiation
Definieer een module-interface met het entity-sleutelwoord:
entity <entity_name> is port( <entity_signal_name> : in|out|inout <signal_type>; ... ); end entity;
Instantieer de module in een ander VHDL-bestand met een expliciete port map:
<label> : entity <library_name>.<entity_name>(<architecture_name>) port map( <entity_signal_name> => <local_signal_name>, ... );
De <label> verschijnt in de simulatorhiërarchie, <library_name> is standaard work, en elke formele poort moet gebonden worden aan een lokaal signaal.
Praktisch voorbeeld: 4-naar-1 MUX
Hieronder staat een complete testbench- en DUT-paar die een 4-naar-1 multiplexer implementeert met unsigned 8-bits signalen.
Testbench-code
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 -- Instantieer de MUX met architectuur rtl i_Mux1 : entity work.T15_Mux(rtl) port map( Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output); -- Stimulus-proces 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;
Module-code
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T15_Mux is port( -- Inputs 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); -- Output 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;
Golfform-analyse
Het draaien van de testbench in ModelSim produceert een golfform die overeenkomt met het verwachte gedrag van de MUX. De onderstaande golfform-snapshot bevestigt dat de DUT correct schakelt tussen de vier invoersignalen naarmate het Sel-signaal verandert.
Belangrijkste opmerkingen
- Modules blootleggen in- en outputs via hun
entity-poorten. - Testbenches bevatten geen poorten en zijn puur voor simulatie.
- Expliciete port mapping is de meest transparante manier om een VHDL-module te instantieren.
- Consistente naamgeving (bijv.
rtlvoor DUT,simvoor testbench) verbetert leesbaarheid over projecten heen.
Ga door naar de volgende tutorial voor diepere inzichten in VHDL-ontwerppatronen.
VHDL
- Freesmes Slijper Technieken Beheersen: Een Praktische Gids
- Hoe molybdeen de moderne industrie vormt: toepassingen, voordelen en leveringsdynamiek
- Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
- Een Tcl-gedreven testbench maken voor een VHDL code-lock module
- Een VHDL-testbench netjes beëindigen: methoden en best practices
- Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
- Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
- In-process procedures benutten voor schonere VHDL FSM-ontwerpen
- Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
- VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp
- Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld