library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; package filter_pkg is constant MAX_RANGE : integer := 511; type array_of_integers is array(integer range <>) of integer range -MAX_RANGE to MAX_RANGE; function array_sum ( K : in array_of_integers ) return integer; function reorder_array ( K : in array_of_integers ; simetric : in boolean ) return array_of_integers; component Filter is generic ( CLK_FREQ : integer := 200e6; DATA_RATE: integer := 250e3; SIMETRIC : boolean := TRUE; CONSTANTS : array_of_integers := (-4,-3,-2,-1,0,1,2,3,4,5) ); port ( clk_i : in std_logic; enable: in std_logic; reset: in std_logic; d_i : in std_logic; d_o : out std_logic; p_o : out std_logic_vector(9 downto 0) ); end component; end package; package body filter_pkg is function array_sum ( K : in array_of_integers ) return integer is variable sum : integer := 0; begin for i in 0 to K'length-1 loop sum := sum + K(K'left + i); end loop; return sum; end array_sum; function reorder_array ( K : in array_of_integers ; simetric : in boolean ) return array_of_integers is constant M : integer := 1 + 2*((K'length)-1); constant N : integer := K'length; variable arr_s : array_of_integers( 0 to M-1 ); variable arr_a : array_of_integers( 0 to N-1 ); begin if ( simetric ) then for i in 0 to N-1 loop arr_s( i ) := K( K'left + i ); end loop; for i in 1 to N-1 loop arr_s( n + i - 1 ) := K( K'right - i ); end loop; return arr_s; else for i in 0 to N-1 loop arr_a( i ) := K( K'left + i ); end loop; return arr_a; end if; end reorder_array; end filter_pkg;