====== Konstanten ======
Im VHDL Code können Konstanten definiert werden, die zur Synthesezeit bekannt sind.
Mit diesen Konstanten können deshalb Schaltungen parametrisiert werden.
architecture struct of top is
constant adderinputwidth_c : integer := 8;
signal op1, op2, res: unsigned(adderinputwidth_c-1 downto 0);
begin
res <= op1 + op2;
-- und anderer Code...
end architecture;
====== Generics ======
Um auch Schaltungsteile parametriesierbar zu halten gibt es "Generics". Im Beispiel unten
ist ein Schieberegister, dessen Länge via generic "n" einstellbar ist.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity shiftreg is
generic(
n : integer);
port (
clk_i: in std_ulogic;
par_i: in std_ulogic_vector(n-1 downto 0);
par_o: out std_ulogic_vector(n-1 downto 0);
ser_i: in std_ulogic;
ser_o: out std_ulogic;
sh_i: in std_ulogic
);
end;
architecture rtl of shiftreg is
signal sr : std_ulogic_vector(n-1 downto 0);
begin
sr_p : process(clk_i)
begin
if rising_edge(clk_i) then
if (sh_i = '1') then
sr(n-2 downto 0) <= sr(n-1 downto 1);
sr(n-1) <= ser_i;
else
sr <= par_i;
end if;
end if;
end process sr_p;
par_o <= sr;
ser_o <= sr(0);
end architecture rtl;
Bei der Instantiierung wird dann der Genericwert bei der Synthesezeit festgelegt.
architecture struct of top is
component shiftreg is
generic(
n : integer);
port (
clk_i: in std_ulogic;
par_i: in std_ulogic_vector(n-1 downto 0);
par_o: out std_ulogic_vector(n-1 downto 0);
ser_i: in std_ulogic;
ser_o: out std_ulogic;
sh_i: in std_ulogic
);
end component;
begin
sr_i0 : shiftreg
generic map (
n => 10)
port map (
clk_i => clk,
par_i => parallel_input,
par_o => parallel_output,
ser_i => serial_input,
ser_o => serial_output,
sh_i => shift_control_signal);
end architecture;