##// END OF EJS Templates

File last commit:

r214:215
r221:222
Show More
Hr_block.vhd
67 lines | 2.2 KiB | text/x-vhdl | VhdlLexer
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
use work.cic_utils.all;
-- Este modulo implementa el bloque Gk del filtro Hr
entity hr_block is
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 hr_block;
architecture simple_block of Hr_block is
signal s1,s2,s3 : std_logic_vector(FIXWIDTH-1 downto 0);
signal Ca,Cb : std_logic_vector(FIXWIDTH-1 downto 0);
type ROM is array (0 to 19) of std_logic_vector(FIXWIDTH-1 downto 0);
constant coeffs : ROM:= ( to_fix(2**MANTISSA_BITS),
to_fix((196875 *(2**MANTISSA_BITS))/100000),
to_fix((284375 *(2**MANTISSA_BITS))/100000),
to_fix((362500 *(2**MANTISSA_BITS))/100000),
to_fix((425000 *(2**MANTISSA_BITS))/100000),
to_fix((475000 *(2**MANTISSA_BITS))/100000),
to_fix((503125 *(2**MANTISSA_BITS))/100000),
to_fix((512500 *(2**MANTISSA_BITS))/100000),
to_fix((503125 *(2**MANTISSA_BITS))/100000),
to_fix((475000 *(2**MANTISSA_BITS))/100000),
to_fix((425000 *(2**MANTISSA_BITS))/100000),
to_fix((362500 *(2**MANTISSA_BITS))/100000),
to_fix((284375 *(2**MANTISSA_BITS))/100000),
to_fix((196875 *(2**MANTISSA_BITS))/100000),
to_fix(2**MANTISSA_BITS),
to_fix(0),
to_fix((-100000 *(2**MANTISSA_BITS))/100000),
to_fix((-196875 *(2**MANTISSA_BITS))/100000),
to_fix((-284375 *(2**MANTISSA_BITS))/100000),
to_fix(0));-- el coeficieente 19 no existe, solo es para anular un tap
begin
Ca <= coeffs(to_integer(unsigned(ka)));
Cb <= coeffs(to_integer(unsigned(kb)));
process (clk,enb,reset)
begin
if (enb = '0') or (reset='1') then
s2 <= (others =>'0');
elsif clk'event and clk='1' then
s2 <= s1;
end if;
end process;
s1 <= input*Cb;
with enb select
s3 <= input*Ca when '1',
(others=>'0') when others;
output <= s2+s3;
end simple_block;