Hr.vhd
145 lines
| 4.1 KiB
| text/x-vhdl
|
VhdlLexer
|
r214 | --------------------------------------------------------------------- | |
library IEEE; | |||
use IEEE.STD_LOGIC_1164.ALL; | |||
use IEEE.numeric_std.all; | |||
use work.cic_utils.all; | |||
--********************************************************************************** | |||
entity Hr is | |||
Port ( clk : in std_logic; | |||
reset: in std_logic; | |||
N : in integer range 1 to MAX_M2_DEC; | |||
input : in std_logic_vector(FIXWIDTH-1 downto 0); | |||
output : out std_logic_vector(FIXWIDTH-1 downto 0) | |||
); | |||
end Hr; | |||
--********************************************************************************** | |||
architecture filter of Hr is | |||
------------------------------------------------------------- | |||
component hr_block | |||
Port ( clk : in std_logic; | |||
reset : in std_logic; | |||
input : in std_logic_vector(FIXWIDTH-1 downto 0); | |||
output : out std_logic_vector(FIXWIDTH-1 downto 0); | |||
ka : in std_logic_vector(4 downto 0); | |||
kb : in std_logic_vector(4 downto 0); | |||
enb : in std_logic); | |||
end component hr_block; | |||
------------------------------------------------------------- | |||
component clk_div | |||
Port ( clkin : in STD_LOGIC; | |||
clkout: out STD_LOGIC; | |||
reset : in std_logic; | |||
N : in integer range 1 to 19); | |||
end component clk_div; | |||
------------------------------------------------------------- | |||
type conn is array (0 to MAX_M2_DEC-1) of std_logic_vector(FIXWIDTH-1 downto 0); | |||
signal s1,s2,s3: conn; | |||
signal s4:std_logic_vector(FIXWIDTH-1 downto 0); | |||
signal clkd: std_logic; | |||
type enab is array (0 to MAX_M2_DEC-1) of std_logic; | |||
signal enb: enab; | |||
type k is array (0 to MAX_M2_DEC-1) of std_logic_vector(4 downto 0); | |||
constant ka:k := ("00000","00001","00010","00011", | |||
"00100","00101","00110","00111", | |||
"01000","01001","01010","01011", | |||
"01100","01101","01110","01111", | |||
"10000","10001","10010"); | |||
signal kb:k; | |||
begin | |||
s1(0) <= input; | |||
output <= s4; | |||
clkdiv: clk_div port map( | |||
clkin => clk, | |||
clkout => clkd, | |||
reset => reset, | |||
N => N | |||
); | |||
--///////////////////////////////////////////////////////////////////////////////// | |||
hr_filter: for i in 0 to MAX_M2_DEC-1 generate | |||
begin | |||
------------------------------------------------------------- | |||
Gk: component hr_block | |||
-- (clk,reset,input,output,ka,kb,encb) | |||
port map (clkd,reset,s2(i),s3(i),ka(i),kb(i),enb(i)); | |||
------------------------------------------------------------- | |||
end generate hr_filter; | |||
--///////////////////////////////////////////////////////////////////////////////// | |||
-- shift registers -- | |||
process(clk,reset) | |||
begin | |||
if reset='1' then | |||
for i in 1 to MAX_M2_DEC-1 loop | |||
s1(i) <= (others=>'0'); | |||
end loop; | |||
elsif clk'event and clk='1' then | |||
for i in MAX_M2_DEC-1 downto 1 loop | |||
s1(i) <= s1(i-1); | |||
end loop; | |||
end if; | |||
end process; | |||
-- implementa a los decimadores, cada vez que haya un flanco de subida | |||
-- en el clock clkd (clkd = clk / N), pasa una muestra al lado de baja | |||
-- frecuencia del filtro. | |||
-- la salida final del filtro es la suma de las salidas de los bloques. | |||
process(clkd,reset) | |||
begin | |||
if reset='1' then | |||
for i in 0 to MAX_M2_DEC-1 loop | |||
s2(i) <= (others=>'0'); | |||
end loop; | |||
elsif clkd'event and clkd='1' then | |||
for i in 0 to MAX_M2_DEC-1 loop | |||
s2(i) <= s1(i); | |||
end loop; | |||
end if; | |||
end process; | |||
-- process(s3) | |||
-- variable acum : std_logic_vector(FIXWIDTH-1 downto 0); | |||
-- begin | |||
-- acum := s3(0); | |||
-- for i in 1 to MAX_M2_DEC-1 loop | |||
-- acum := acum+s3(i); | |||
-- end loop; | |||
-- s4 <= acum; | |||
-- end process; | |||
s4 <= s3(0)+s3(1)+s3(2)+s3(3)+s3(4)+s3(5)+ | |||
s3(6)+s3(7)+s3(8)+s3(9)+s3(10)+s3(11)+ | |||
s3(12)+s3(13)+s3(14)+s3(15)+s3(16)+s3(17)+s3(18); | |||
process(N) | |||
begin | |||
for i in 0 to MAX_M2_DEC-1 loop | |||
if N-1 > i then | |||
kb(i) <= std_logic_vector(to_unsigned(N-i-2,kb(i)'length)); | |||
else | |||
kb(i) <= std_logic_vector(to_unsigned(19,kb(i)'length)); | |||
end if; | |||
if N-1 >= i then | |||
enb(i) <= '1'; | |||
else | |||
enb(i) <= '0'; | |||
end if; | |||
end loop; | |||
end process; | |||
end filter; | |||
--********************************************************************************** |