Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

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):

Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen

Analyse

DataWidth einmal in Testbench definiert → gleicher MUX für jede Busbreite anpassbar ohne Modulcode-Änderung. Wellenform bestätigt identische Funktion zur Hardcoded-Version.

Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen

Merksätze

Nächstes Tutorial »

VHDL

  1. In-Prozess-Prozeduren für saubere VHDL-FSM-Entwürfe nutzen
  2. Impure Functions in VHDL nutzen: FSM-Lesbarkeit und Wartbarkeit steigern
  3. VHDL-Funktionen meistern: Praktischer Leitfaden für effizientes Design
  4. Prozeduren in VHDL: Wiederverwendbaren Code für einfachere Designs
  5. Konstanten und Generic Maps in VHDL für flexible Moduldesigns nutzen
  6. VHDL Port Map Instanziierung meistern: Praktischer Leitfaden
  7. Case-When Statement in VHDL meistern: Effizientes Multiplexer-Design
  8. Signed und Unsigned Typen in VHDL meistern: Praktischer Leitfaden
  9. Kostenloser VHDL-Simulator & Editor: Ein Leitfaden für Studierende
  10. PIC18 Mikrocontroller: Eigenschaften, Performance & Programmierung