Сам CIC я вроде как написал опираясь на книги по ЦОС. Но это CIC без дециматора. То есть интегратор и гребенка
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CIC is
port
(clk : in std_logic;
data_in : in std_logic_vector (15 downto 0);
data_out : out std_logic_vector (15 downto 0);
clk_p : out std_logic
);
end CIC;
architecture Behavioral of CIC is
signal shift1, shift2, shift3, shift4, shift5, shift6, shift7, shift8: std_logic_vector (15 downto 0);
signal summ: std_logic_vector (20 downto 0); -- сигнал на выходе фильтра
begin
process (clk)
begin
if (CLK'event and CLK='1') then
shift1 <= data_in;
shift2 <= shift1;
shift3 <= shift2;
shift4 <= shift3;
shift5 <= shift4;
shift6 <= shift5;
shift7 <= shift6;
shift8 <= shift7;
end if;
end process;
process (clk)
begin
if (CLK'event and CLK='1') then
summ <= signed(shift8)-signed(shift1)+signed(summ);
end if;
end process;
data_out <= summ(20 downto 5); -- уменьшаем разрядность для того чтобы выходной сигнал был 16ти разрядным(мне необходим выход 16 разрядов
clk_p <= clk;
end Behavioral;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CIC is
port
(clk : in std_logic;
data_in : in std_logic_vector (15 downto 0);
data_out : out std_logic_vector (15 downto 0);
clk_p : out std_logic
);
end CIC;
architecture Behavioral of CIC is
signal shift1, shift2, shift3, shift4, shift5, shift6, shift7, shift8: std_logic_vector (15 downto 0);
signal summ: std_logic_vector (20 downto 0); -- сигнал на выходе фильтра
begin
process (clk)
begin
if (CLK'event and CLK='1') then
shift1 <= data_in;
shift2 <= shift1;
shift3 <= shift2;
shift4 <= shift3;
shift5 <= shift4;
shift6 <= shift5;
shift7 <= shift6;
shift8 <= shift7;
end if;
end process;
process (clk)
begin
if (CLK'event and CLK='1') then
summ <= signed(shift8)-signed(shift1)+signed(summ);
end if;
end process;
data_out <= summ(20 downto 5); -- уменьшаем разрядность для того чтобы выходной сигнал был 16ти разрядным(мне необходим выход 16 разрядов
clk_p <= clk;
end Behavioral;
Я понимаю что есть оптимальный способ, поставить дециматор до гребенки, но для начала нало попробовать этот способ и поставить дециматор после того как сигнал пройдет через фильтр. Прочитал кучу статей про CIC, вроде понятно про сам CIC.
Не ясно одно: а именно как реализовать дециматор программно на VHDL.
Может вопрос глупый слишком, по идее ответ должен быть очень простой, но мне не ясно. Поиск по форуму и google особенно ничем не помог. Может я плохо искал.
ЗЫ надеюсь что все же лыжи не едут...