vLx0F 0 3 декабря, 2007 Опубликовано 3 декабря, 2007 (изменено) · Жалоба Для простоты 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; Изменено 3 декабря, 2007 пользователем vLx0F Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 5 декабря, 2007 Опубликовано 5 декабря, 2007 · Жалоба Для простоты 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; Народ, неужели всё так плохо, что слов нет т? :) ^) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rloc 57 5 декабря, 2007 Опубликовано 5 декабря, 2007 · Жалоба cic_fir Хорошее название :( Не знаю, на каком кристалле Вы будете делать, у Xilinx в последнем апдейте IP2 для ISE v9.2i есть готовый cic_compiler_v1_0. Можно воспользоваться им или просто посмотреть, как он сделан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 6 декабря, 2007 Опубликовано 6 декабря, 2007 · Жалоба Народ, неужели всё так плохо, что слов нет т? :) ^) 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 0 6 декабря, 2007 Опубликовано 6 декабря, 2007 (изменено) · Жалоба 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: По крайней мере с теми ацп с которыми мы работаем без проблем снимается сигнал со знаком в _дополнительном_ коде. Сигнал подается на плисовские фильтры "как есть", и операции используются знаковые. Не предполагал, что АЦП могут по другому работать...Или я не врубаюсь в проблему ? Изменено 6 декабря, 2007 пользователем Singer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 6 декабря, 2007 Опубликовано 6 декабря, 2007 · Жалоба По крайней мере с теми ацп с которыми мы работаем без проблем снимается сигнал со знаком в _дополнительном_ коде. Удивительно, если было бы по другому...Или я не врубаюсь в проблему ? Если у АЦП есть признак преобразования прямого, дополнительного. В общем случае как я понимаю -1В должен соответствовать числу -128 на выходе АЦП. Вот и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 9 декабря, 2007 Опубликовано 9 декабря, 2007 · Жалоба 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; Ну и т.д ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 10 декабря, 2007 Опубликовано 10 декабря, 2007 · Жалоба Для простоты 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)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ps1979 0 10 декабря, 2007 Опубликовано 10 декабря, 2007 · Жалоба Немного абстрактный совет: Посмотрите книжку Uwe Meyer-Baese "Digital Signal processing with Field Programmable Gate arrays" (она ходит по сети в сканированном виде вместе с примерами). Я в свое время по ней делал программируемый COMB фильтр 5-го порядка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 13 декабря, 2007 Опубликовано 13 декабря, 2007 · Жалоба 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) ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vLx0F 0 17 декабря, 2007 Опубликовано 17 декабря, 2007 · Жалоба Вот двух секционный интегратор. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться