T
Tobias Baumann
Guest
Hi
I try to implement a synthesizable delay chain. Here a working example:
library ieee;
use ieee.std_logic_1164.all;
entity delay_gate is
generic (
ACTIVE_EDGE : std_logic := '1';
MAX_DELAY_GATE_CYCLES : integer := 7
);
port (
clk_in : in std_logic;
data_in : in std_logic_vector(9 downto 0);
num_delays_in : in integer range 0 to MAX_DELAY_GATE_CYCLES;
data_q : out std_logic_vector(9 downto 0)
);
end entity delay_gate;
architecture RTL of delay_gate is
type delay_gate_data_type is array (0 to MAX_DELAY_GATE_CYCLES) of
std_logic_vector(9 downto 0);
signal delay_data : delay_gate_data_type := (others => (others =>
'0'));
begin
-- first element has no delay
delay_data(0) <= data_in;
delay_proc: process(clk_in)
begin
if (clk_in'event and clk_in = ACTIVE_EDGE) then
delay_data(1) <= delay_data(0);
delay_data(2) <= delay_data(1);
delay_data(3) <= delay_data(2);
delay_data(4) <= delay_data(3);
delay_data(5) <= delay_data(4);
delay_data(6) <= delay_data(5);
delay_data(7) <= delay_data(6);
end if;
end process;
with num_delays_in select
data_q <= delay_data(0) when 0,
delay_data(1) when 1,
delay_data(2) when 2,
delay_data(3) when 3,
delay_data(4) when 4,
delay_data(5) when 5,
delay_data(6) when 6,
delay_data(7) when 7,
delay_data(0) when others;
end architecture RTL;
The problem is that I want to have a real generic entity so that I
haven't to change delay_proc and the with...select statement by hand.
Can someone help me finding the correct VHDL syntax? I tried using a
for...loop, but the simulation results aren't good (data_q is undefined).
Thanks a lot for any help.
Tobias
I try to implement a synthesizable delay chain. Here a working example:
library ieee;
use ieee.std_logic_1164.all;
entity delay_gate is
generic (
ACTIVE_EDGE : std_logic := '1';
MAX_DELAY_GATE_CYCLES : integer := 7
);
port (
clk_in : in std_logic;
data_in : in std_logic_vector(9 downto 0);
num_delays_in : in integer range 0 to MAX_DELAY_GATE_CYCLES;
data_q : out std_logic_vector(9 downto 0)
);
end entity delay_gate;
architecture RTL of delay_gate is
type delay_gate_data_type is array (0 to MAX_DELAY_GATE_CYCLES) of
std_logic_vector(9 downto 0);
signal delay_data : delay_gate_data_type := (others => (others =>
'0'));
begin
-- first element has no delay
delay_data(0) <= data_in;
delay_proc: process(clk_in)
begin
if (clk_in'event and clk_in = ACTIVE_EDGE) then
delay_data(1) <= delay_data(0);
delay_data(2) <= delay_data(1);
delay_data(3) <= delay_data(2);
delay_data(4) <= delay_data(3);
delay_data(5) <= delay_data(4);
delay_data(6) <= delay_data(5);
delay_data(7) <= delay_data(6);
end if;
end process;
with num_delays_in select
data_q <= delay_data(0) when 0,
delay_data(1) when 1,
delay_data(2) when 2,
delay_data(3) when 3,
delay_data(4) when 4,
delay_data(5) when 5,
delay_data(6) when 6,
delay_data(7) when 7,
delay_data(0) when others;
end architecture RTL;
The problem is that I want to have a real generic entity so that I
haven't to change delay_proc and the with...select statement by hand.
Can someone help me finding the correct VHDL syntax? I tried using a
for...loop, but the simulation results aren't good (data_q is undefined).
Thanks a lot for any help.
Tobias