Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen
Wiederverwendbare Module sind Eckpfeiler effizienter VHDL-Entwicklung, doch kleine Variationen erzwingen oft Code-Duplikation. Generics und Generic Maps lösen dies, indem sie Modulparameter zur Compile-Zeit konfigurierbar machen – Code bleibt DRY und wartbar.
Konstanten vermeiden wiederholtes Hardcoding. Ideal für Signalbus-Breiten oder andere Compile-Time-Parameter. Sie können sogar auf Generic-Konstanten gemappt werden. Im Gegensatz zu Signalen/Variablen ist ein Konstantenwert nach Elaboration unveränderlich – Konsistenz im Design garantiert.
Teil der Basic VHDL Tutorials Serie.
Vorheriges Tutorial: 4-Eingang-Multiplexer mit 8-Bit-Busbreite. Benötigt man andere Breite, muss nicht das ganze Modul kopiert werden.
Stattdessen Konstante für Busbreite deklarieren, per Generic an Modul übergeben. Einzige Änderungsstelle: Konstantendeklaration in Testbench.
Syntax
Konstante deklarieren:
constant <name> : <type> := <value>;
Konstanten können neben Signalen im deklarativen Teil einer Datei oder mit Variablen inside Prozess stehen.
Generic im Entity exponieren:
entity <name> is
generic(
<generic_name> : <type> [:= default];
...
);
port(
<signal_name> : in|out|inout <type>;
...
);
end entity;
Instanziierung mit Generic Map und Port Map:
<label> : entity <lib>.<entity>(<arch>)
generic map(
<generic_name> => <value_or_const>,
...
)
port map(
<signal_name> => <local_signal>,
...
);
Übung
Video-Tutorial: Generischen 4-Eingang-MUX in VHDL erstellen und instanziieren.
Testbench – Generischer MUX
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T16_GenericMapTb is
end entity;
architecture sim of T16_GenericMapTb is
constant DataWidth : integer := 8;
signal Sig1 : signed(DataWidth-1 downto 0) := x"AA";
signal Sig2 : signed(DataWidth-1 downto 0) := x"BB";
signal Sig3 : signed(DataWidth-1 downto 0) := x"CC";
signal Sig4 : signed(DataWidth-1 downto 0) := x"DD";
signal Sel : signed(1 downto 0) := (others => '0');
signal Output : signed(DataWidth-1 downto 0);
begin
i_Mux1 : entity work.T16_GenericMux(rtl)
generic map(DataWidth => DataWidth)
port map(
Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output
);
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;
Generischer MUX Modul
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T16_GenericMux is
generic(DataWidth : integer);
port(
Sig1 : in signed(DataWidth-1 downto 0);
Sig2 : in signed(DataWidth-1 downto 0);
Sig3 : in signed(DataWidth-1 downto 0);
Sig4 : in signed(DataWidth-1 downto 0);
Sel : in signed(1 downto 0);
Output : out signed(DataWidth-1 downto 0)
);
end entity;
architecture rtl of T16_GenericMux 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;
ModelSim Wellenform nach Simulation (Zoom auf Timeline):
Analyse
DataWidth einmal in Testbench definiert → gleicher MUX für jede Busbreite anpassbar ohne Modulcode-Änderung. Wellenform bestätigt identische Funktion zur Hardcoded-Version.
Merksätze
- Konstanten eliminieren wiederholtes Hardcoding – Lesbarkeit ↑, Fehler ↓.
- Generics machen Module hochkonfigurierbar – Wiederverwendung im Design ↑.
Nächstes Tutorial »
VHDL
- In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
- Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
- VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
- Prozeduren in VHDL: Wiederverwendbaren Code für einfachere Designs
- Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen
- VHDL Port Map Instanziierung meistern: Praktischer Leitfaden
- Case-When Statement in VHDL meistern: Effizientes Multiplexer-Design
- Signed und Unsigned Typen in VHDL meistern: Praktischer Leitfaden
- Kostenloser VHDL-Simulator & Editor: Ein Leitfaden für Studierende
- PIC18 Mikrocontroller: Eigenschaften, Performance & Programmierung