реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы с реализацией CIC фильтров
Art111
сообщение Aug 12 2010, 10:54
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Добрый день!
Проблема в следующем. Требуется реализовать 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;
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 12 2010, 11:12
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Art111 @ Aug 12 2010, 05:54) *
Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.

В симулинк его запихиваете, ставите рядом такой же симулинковский и отлаживаете. Там и посмотрите правильно вы сделали или нет %)


--------------------
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Aug 12 2010, 11:17
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(Art111 @ Aug 12 2010, 14:54) *
И последее. Фильтр надо как-то отлаживать. Проверить результат. Также буду очень признателен, если кто-нибудь скажет как лучше проверить, что он работает.

Я думаю с помощью Matlab. Ставите референсный CIC, рядом - свой HDL код, подаете некий паттерн и сравниваете выходы.
Go to the top of the page
 
+Quote Post
rloc
сообщение Aug 12 2010, 12:15
Сообщение #4


Узкополосный широкополосник
******

Группа: Свой
Сообщений: 2 316
Регистрация: 13-12-04
Из: Moscow
Пользователь №: 1 462



Для начала подайте на вход дельта-импульс (в данном случае импульс большой амплитуды и длительностью в один период поступления входных данных) и сравните на выходе с импульсной характеристикой фильтра.
Go to the top of the page
 
+Quote Post
Art111
сообщение Aug 13 2010, 05:29
Сообщение #5





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Цитата(rloc @ Aug 12 2010, 16:15) *
Для начала подайте на вход дельта-импульс (в данном случае импульс большой амплитуды и длительностью в один период поступления входных данных) и сравните на выходе с импульсной характеристикой фильтра.

А я не знаю импульсной характеристики фильтра. Количество каскадов мне выдал матлаб. И дельта-функция в этом случае мне никак не поможет, это же не КИХ - там, да - все коэффициенты высвечиваются сразу. Но не в нашем случае с CIC. Спасибо!
Go to the top of the page
 
+Quote Post
alex_os
сообщение Aug 13 2010, 06:41
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



Цитата(Art111 @ Aug 12 2010, 14:54) *
Проблема в следующем. Требуется реализовать CIC фильтр в 12 секций с децимацией, к примеру 10.

12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
Art111
сообщение Aug 13 2010, 07:11
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Цитата(alex_os @ Aug 13 2010, 10:41) *
12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.

А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Aug 13 2010, 07:17
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Цитата(alex_os @ Aug 13 2010, 10:41) *
12 секций это 12-го порядка чтоли !?? Если так, то это фантастика smile.gif.

12 секций - это 12 секций. Альтера умеет генерить такие, так что никакой фантастики тут нет. Просто у Xilinx корка почему-то ограничена шестью секциями.
Go to the top of the page
 
+Quote Post
Art111
сообщение Aug 13 2010, 07:27
Сообщение #9





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



А есть люди, на форуме, которые CIC писали руками?
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Aug 13 2010, 07:34
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Я FIR писал, это сложнее.
Go to the top of the page
 
+Quote Post
hobgoblin
сообщение Aug 13 2010, 07:36
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881



Цитата(Art111 @ Aug 13 2010, 11:11) *
А вы не могли бы пояснить, в чём конкретно фантастичность задачи?
У нас следующая задача. Нужно сделать слудующий филтр: децимация 3, полоса пропускания 8 МГц, частота сэмплирования 100 МГц, затухание 110 Дб. Матлаб при расчёте фильтра с данными параметрами выдал 12 каскадов..

Не то чтобы фантастично, но как то не очень оптимально. Неравномерность в полосе пропускания у Вас на выходе будет около 10 дБ и рост разрядности, если не использовать Hogenauer pruning, 20 бит.
Писать CIC фильтр с нуля, понимая как он работает, требуется ну полчаса максимум. Можно взять и сгенерировать код прямо в Matlab, но его придется немного ручками править.
Go to the top of the page
 
+Quote Post
Art111
сообщение Aug 13 2010, 07:47
Сообщение #12





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Цитата(hobgoblin @ Aug 13 2010, 11:36) *
Не то чтобы фантастично, но как то не очень оптимально. Неравномерность в полосе пропускания у Вас на выходе будет около 10 дБ и рост разрядности, если не использовать Hogenauer pruning, 20 бит.
Писать CIC фильтр с нуля, понимая как он работает, требуется ну полчаса максимум. Можно взять и сгенерировать код прямо в Matlab, но его придется немного ручками править.

Естественно, компенсационник на выходе CIC будет стоять..
Go to the top of the page
 
+Quote Post
hobgoblin
сообщение Aug 13 2010, 07:53
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881



Цитата
Естественно, компенсационник на выходе CIC будет стоять..

нужно ли городить огород, может просто одним децимирующим FIR фильтром можно обойтись.

Go to the top of the page
 
+Quote Post
Art111
сообщение Aug 13 2010, 07:53
Сообщение #14





Группа: Новичок
Сообщений: 9
Регистрация: 12-08-10
Пользователь №: 58 875



Цитата(DmitryR @ Aug 13 2010, 11:34) *
Я FIR писал, это сложнее.

я FIR тоже писал аж 2 способами и сравнивал их с IP-шными - резулттаты совпадали. А вот с CIC столкнулся впервые.
Вроде, всё как в описании делаю. Сначала смещаю на нужное количетсво каскадов, всё суммирую, потом провожу понижение частоты, смещаю, вычитаю, выдаю.
Разница с матлабовской моделью небольшая, у них в реакции на дельту нет отрицательных значений. У меня же есть. А ядро вообще выдаёт полную лажу во всём разрядном диапазонеsad.gif(
Go to the top of the page
 
+Quote Post
hobgoblin
сообщение Aug 13 2010, 08:05
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881



Почему бы просто не не сгенерировать код из матлаба и не посмотреть как он устроен. Можно еще автоматом модельку симулинковскую сгенерить, построенную из стандартных блоков. Если не знаете как это делается, то код генерится из объекта mfilt функцией generatehdl(), а модель - функцией realizemdl().
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016