Перейти к содержанию
    

CIC- фильтер VHDL

Для простоты N=1, R=2, M=1.

a0d - сигнал с АЦП

 

integ: process(clk) --- реальная частота

begin

if(reset = '0') then

cic_fir(0) <= (others => '0');

elsif(rising_edge(clk)) then

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

end if;

end process;

----COMB

comb: process(clk)

begin

if(reset = '0') then

cic_fir(1) <= (others => '0');

cic_fir(2) <= (others => '0');

elsif(rising_edge(clk)) then

if(wr_en = '0') then --- пониженная частотиа F/R

cic_fir(1) <= cic_fir(0);

cic_fir(2) <= cic_fir(1);

cic_fir(3) <= std_logic_vector(signed(cic_fir(0))-cic_fir(2));

end if;

end if;

end process;

Изменено пользователем vLx0F

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для простоты N=1, R=2, M=1.

a0d - сигнал с АЦП

 

integ: process(clk) --- реальная частота

begin

if(reset = '0') then

cic_fir(0) <= (others => '0');

elsif(rising_edge(clk)) then

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

end if;

end process;

----COMB

comb: process(clk)

begin

if(reset = '0') then

cic_fir(1) <= (others => '0');

cic_fir(2) <= (others => '0');

elsif(rising_edge(clk)) then

if(wr_en = '0') then --- пониженная частотиа F/R

cic_fir(1) <= cic_fir(0);

cic_fir(2) <= cic_fir(1);

cic_fir(3) <= std_logic_vector(signed(cic_fir(0))-cic_fir(2));

end if;

end if;

end process;

 

 

Народ, неужели всё так плохо, что слов нет т? :) ^)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cic_fir

Хорошее название :(

 

Не знаю, на каком кристалле Вы будете делать, у Xilinx в последнем апдейте IP2 для ISE v9.2i есть готовый cic_compiler_v1_0. Можно воспользоваться им или просто посмотреть, как он сделан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ, неужели всё так плохо, что слов нет т? :) ^)

 

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

Судя по этой строчке, Вы предлагаете синтезатору код с выхода АЦП обрабатывать как число со знаком.

Мне кажется до этого надо сделать преобразование. Обычная система операционник _ АЦП на примере -1В +1В:

-1В -> 1111_1111: +1В -> 0000_0000;

чтобы уровни -1В+1В представить как число со знаком, надо проинвертировать все разряды кроме старшего

1000_0000, 0111_1111:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

Судя по этой строчке, Вы предлагаете синтезатору код с выхода АЦП обрабатывать как число со знаком.

Мне кажется до этого надо сделать преобразование. Обычная система операционник _ АЦП на примере -1В +1В:

-1В -> 1111_1111: +1В -> 0000_0000;

чтобы уровни -1В+1В представить как число со знаком, надо проинвертировать все разряды кроме старшего

1000_0000, 0111_1111:

 

По крайней мере с теми ацп с которыми мы работаем без проблем снимается сигнал со знаком в _дополнительном_ коде. Сигнал подается на плисовские фильтры "как есть", и операции используются знаковые. Не предполагал, что АЦП могут по другому работать...Или я не врубаюсь в проблему ?

Изменено пользователем Singer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По крайней мере с теми ацп с которыми мы работаем без проблем снимается сигнал со знаком в _дополнительном_ коде. Удивительно, если было бы по другому...Или я не врубаюсь в проблему ?

 

Если у АЦП есть признак преобразования прямого, дополнительного.

В общем случае как я понимаю -1В должен соответствовать числу -128 на выходе АЦП.

Вот и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

Судя по этой строчке, Вы предлагаете синтезатору код с выхода АЦП обрабатывать как число со знаком.

Мне кажется до этого надо сделать преобразование. Обычная система операционник _ АЦП на примере -1В +1В:

-1В -> 1111_1111: +1В -> 0000_0000;

чтобы уровни -1В+1В представить как число со знаком, надо проинвертировать все разряды кроме старшего

1000_0000, 0111_1111:

 

Из АЦП данные идут в доп. коде .

 

По крайней мере с теми ацп с которыми мы работаем без проблем снимается сигнал со знаком в _дополнительном_ коде. Сигнал подается на плисовские фильтры "как есть", и операции используются знаковые. Не предполагал, что АЦП могут по другому работать...Или я не врубаюсь в проблему ?

 

Ещё вопрос: Если я хоччу N увеличить(каскадов), то надо на точно такие Int и COMB подавать значения с других каскадов. Например, для моего случая:

integ: process(clk) --- реальная частота

begin

if(reset = '0') then

cic_fir(0) <= (others => '0');

elsif(rising_edge(clk)) then

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

cic_fir(1) <= std_logic_vector(signed(cic_fir(0)(0))+cic_fir(1));

end if;

end process;

 

Ну и т.д ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для простоты N=1, R=2, M=1.

a0d - сигнал с АЦП

 

integ: process(clk) --- реальная частота

begin

if(reset = '0') then

cic_fir(0) <= (others => '0');

elsif(rising_edge(clk)) then

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

end if;

end process;

----COMB

comb: process(clk)

begin

if(reset = '0') then

cic_fir(1) <= (others => '0');

cic_fir(2) <= (others => '0');

elsif(rising_edge(clk)) then

if(wr_en = '0') then --- пониженная частотиа F/R

cic_fir(1) <= cic_fir(0);

cic_fir(2) <= cic_fir(1);

cic_fir(3) <= std_logic_vector(signed(cic_fir(0))-cic_fir(2));

end if;

end if;

end process;

 

Вот только не совсем понятно: Для COMB секции x[n] является выход предедущей integr секции, т.е. cic_fir(0) или вход всего фильтра в моем случае a0d ?

Тогда COMB последнюю строку переписываю:

 

cic_fir(3) <= std_logic_vector(signed(a0d)-cic_fir(2));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного абстрактный совет:

 

Посмотрите книжку Uwe Meyer-Baese "Digital Signal processing with

Field Programmable Gate arrays" (она ходит по сети в сканированном виде

вместе с примерами). Я в свое время по ней делал программируемый COMB

фильтр 5-го порядка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

a0d - сигнал с АЦП

integ: process(clk) --- реальная частота

begin

if(reset = '0') then

cic_fir(0) <= (others => '0');

elsif(rising_edge(clk)) then

cic_fir(0) <= std_logic_vector(signed(a0d)+cic_fir(0));

cic_fir(1) <= std_logic_vector(signed(cic_fir1)+cic_fir(0));

end if;

end process;

 

Вот двух секционный интегратор. cic_fir(1) просто (для проверки) выдаю на ЦАП. XST нифига не генерит, т.е. сигналы cic_fir(0-1) ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот двух секционный интегратор. cic_fir(1) просто (для проверки) выдаю на ЦАП. XST нифига не генерит, т.е. сигналы cic_fir(0-1) ???

Эта проблема решена. (Дело в схеме была).

 

Но возникла новая неприятность.

При увеличении порядка фильтра (N>=2), возникают флюктуирующие палки, причём в одних и тех же местах. Например, при N=2 расстояния между ними 2.5мкс 5мкс 2.5мкс и т.д. Причём при отрублениии сигнала от входа, палки остаются, так же и при врубании системы без вх. сигнала - палки на местах.

Привожу пример кода clk = 60MHz, N=2, R=6, M=1. Разрядность всех шин Bout = Nlog2(RM)+Bin-1 = 2*2.5+14-1=18.

---------Integrator

ingr1: process(clk_gx)

begin

if(rst2 = '0' or end_smpl = '1') then

for i in 0 to 12 loop

cic_flrI(i) <= (others => '0');

end loop; -- i

elsif(rising_edge(clk_gx)) then

cic_intg(0) <= std_logic_vector(signed(cic_intg(0))+RESIZE(signed(adc,cic_intg(0)'length));

cic_intg(1) <= std_logic_vector(signed(cic_intg(1))+signed(cic_intg(0)));

end if;

end process;

--------------------- COMB

diff1: process(clk_gx)

begin

if(rst2 = '0' or end_smpl = '1') then

for i in 0 to 12 loop

cic_flr(i) <= (others => '0');

end loop; -- i

elsif(rising_edge(clk_gx)) then

if(wr_en = '0') then ------ Здесь новая ч-та

cic_comb(1) <= std_logic_vector(signed(cic_intg(1))-signed(cic_comb(0)));

cic_comb(0) <= cic_intg(1);

cic_comb(3) <= std_logic_vector(signed(cic_comb(1))-signed(cic_comb(2)));

cic_comb(2) <= cic_comb(1);

end if;

end if;

 

Посмотрите плз, может у меня глаз уже замылился и не вижу ошибку в коде. Ну и может кто знает от чего эти палки появляются ???

end process;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...