Добрый день!
Проблема в следующем. Требуется реализовать CIC фильтр в 12 секций с децимацией, к примеру 10.
Решил сначала построить его на IP-ядре (CIC Compiler Core). Оказалось, что он может генерить фильтр с максимальным количеством секций 6.
А надо 12. Как быть?
Ладно, структура вроде бы не сложная, решил написать руками. Текст привожу далее. (К примеру, для 3х каскадов. ) Если кто сталкивался с написанием такого фильтра в коде, посмотрите, пожалуйста, нет ли ошибок.
И последее. Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.
Спасибо!
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_SIGNED.all;
use IEEE.STD_LOGIC_ARITH.all;
entity hcic is
port(
CLK : in STD_LOGIC;
CLK10 : in STD_LOGIC;
din : in STD_LOGIC_VECTOR(15 downto 0);
dout : out STD_LOGIC_VECTOR(15 downto 0) );
end hcic;
architecture BEH of hcic is
signal i0,i1,i2,i3,tempI0,tempI1,tempI2:STD_LOGIC_VECTOR(21 downto 0);
signal c0,c1,c2,c3,tempC0,tempC1,tempC2:STD_LOGIC_VECTOR(21 downto 0);
signal clk_dec :STD_LOGIC;
--signal clcc:STD_LOGIC_VECTOR(4 downto 0);
begin
process (clk)
begin
if(clk'event and clk='1')then
if din(15)='0' then i0<="0000000"&din(14 downto 0); else i0<="1111111"&din(14 downto 0);end if;
dout<=c3(15 downto 0);
end if;
end process;
--process (clk)
-- begin
-- if(clk'event and clk='1')then
-- clcc<=clcc+1;
-- if clcc="10011" then clk_dec<='1'; else clk_dec<='0'; clcc<="00000";end if;
-- end if;
--end process;
process (clk)--INTERGRATED
begin
if(clk'event and clk='1')then
tempI0<=i0;
tempI1<=i1;
tempI2<=i2;
i1<=signed(tempI0)+signed(i0);
i2<=signed(tempI1)+signed(i1);
i3<=signed(tempI2)+signed(i2);
end if;
end process;
process (CLK10)--COMB
begin
if(CLK10'event and CLK10='1')then
tempC0<=i3;
tempC1<=c1;
tempC2<=c2;
c1<=signed (tempC0)-signed (i3);
c2<=signed (tempC1)-signed (c1);
c3<=signed (tempC2)-signed (c2);
end if;
end process;
--
--
----
--
end BEH;