Skryppy 1 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Здравствуйте. Я в Матлабе в fdatools сгенерировал vhdl код КИХ-фильтра с параметрами : Lowpass,FIR,Minimum order,Fs=62.5 MHz,Fpass=0,Fstop=20,Apass=1,Astop=80. Во вкладке квантования выставил параметры :Numerator w. length=16,Input w. length=8,Output w. length=8. Получил фильтр 4 порядка. Собрал схему в Xilinx Ise 12.2 для Spartan 3A-DSP FG676,с подключением 8 разрядного АЦП и ЦАП: Так вот,сгенерировал проект без проблем,но в железе фильтр неработает. Подскажите,пожалуйста,что я делаю неправильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 (изменено) · Жалоба помнится мне,что в каких-то версиях матлаба была проблема с квантованиями в fdatool, с тех пор им и не пользуюсь. Я бы на вашем месте попробовал: a ) отписать коэффициенты фильтра в массив, ручками округлить, привести к нужной разрядности и т.п. b ) проверить работу фильтра с полученными(вашим вариантом) коэффициентами в матлабе. c ) в конце-концов, фильтр четвертого порядка, напишите вы его руками!=)) Изменено 29 апреля, 2011 пользователем Иван Панченко Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 29 апреля, 2011 Опубликовано 29 апреля, 2011 (изменено) · Жалоба Так в том-то и дело,что я использовал разные варианты: экспортировал коэффициенты в сое файл и работал с IP ядром FIR Compiller ;писал фильтр сам на VHDL разными способами,но он все равно не работает. Изменено 29 апреля, 2011 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirB 1 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Так в том-то и дело,что я использовал разные варианты: экспортировал коэффициенты в сое файл и работал с IP ядром FIR Compiller ;писал фильтр сам на VHDL разными способами,но он все равно не работает. В чём проявляется это "не работает"? Может вообще у вас DCM не запускается из-за того что дженерики в схематике не задали - помниться там с этим гемморой был. Мой вам совет пишите сразу на HDL. А ещё типовой трабл - это использование разных кодов АЦП, ЦАП и фильтра. Типа, например, АЦП в прямом со смещением, ЦАП в прямом со смещением, а фильтр в дополнительном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба да, и правда, все больше сомнений:"а фильтр ли не работает?" вы на 100% уверены, что не работает именно фильтр? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Я как раз и считаю,что схему как-то неправильно собрал,поэтому так и назвал тему.Можете уточнить,что такое "дженирик" ? DCM вроде как работает-я подавал выходной сигнал с DCM сразу на ЦАП-на выходе была синусоида с частотой уменьшенной вдвое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба "дженирик" это "generic". Не знаю насчет строгой литературной точности - параметры, которые можно задавать различными для одного и того же блочка(entity) при различных его использованиях. по поводу сигнала с АЦП: какой бит старший, какой младший - точно верно? попробуйте без фильтра поподавать константы на связку ацп-цап и посмотреть, насколько адекватно работает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба На связку АЦП-ЦАП я подавал синусоиду-на выходе получал сдвинутую,немного зашумленную синусоиду,результат ,я думаю,вполне удовлетворительный,также испытавал схему,подачей с АЦП на счетчик сигнала,а затем передавал его на ЦАП -на выходе получил пилу, правда не с прямолинейным,а слегка выпуклым фронтом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба а ресет у вас в верном положении?=) подтяните на пробу на "gnd/Vcc" . да и в чем тогда заключается "неработоспособность фильтра?" вообще не работает или "не фильтрует?" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 1 мая, 2011 Опубликовано 1 мая, 2011 (изменено) · Жалоба С фильтра на выход ничего не приходит,причем всегда :-( . "подтяните на пробу на "gnd/Vcc""-я так понимаю вы предлагаете на reset подать vcc,но ведь тогда будет происходить постоянный сброс? к reset я также подкдючал gnd,но результат тот же-с выхода фильтра ничего не приходит на осциллограф :-(. Изменено 1 мая, 2011 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба gnd/Vcc имелось ввиду нужный, в зависимости от используемой полярности импульса сброса... пора,видимо, уже VHDL код в студию=) без него вряд ли разберемся... а вы точно копируете из матлаба все необходимые файлики? или там только кусок vhdl кода? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 2 мая, 2011 Опубликовано 2 мая, 2011 (изменено) · Жалоба Vhdl файл делает Matlab,вот что в нем написано : -- HDL Code Generation Options: -- -- TargetLanguage: VHDL -- TargetDirectory: C:\Users\Skryp\Desktop\MatVHDL -- TestBenchStimulus: impulse step ramp chirp noise -- -- Filter Settings: -- -- Discrete-Time FIR Filter (real) -- ------------------------------- -- Filter Structure : Direct-Form FIR -- Filter Length : 5 -- Stable : Yes -- Linear Phase : Yes (Type 1) -- Arithmetic : fixed -- Numerator : s16,19 -> [-6.250000e-002 6.250000e-002) -- Input : s8,15 -> [-3.906250e-003 3.906250e-003) -- Filter Internals : Specify Precision -- Output : s8,34 -> [-7.450581e-009 7.450581e-009) -- Product : s31,34 -> [-6.250000e-002 6.250000e-002) -- Accumulator : s32,34 -> [-1.250000e-001 1.250000e-001) -- Round Mode : convergent -- Overflow Mode : wrap -- ------------------------------------------------------------- LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.numeric_std.ALL; ENTITY filter IS PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; filter_in : IN std_logic_vector(7 DOWNTO 0); -- sfix8_En15 filter_out : OUT std_logic_vector(7 DOWNTO 0) -- sfix8_En34 ); END filter; ---------------------------------------------------------------- --Module Architecture: filter ---------------------------------------------------------------- ARCHITECTURE rtl OF filter IS -- Local Functions -- Type Definitions TYPE delay_pipeline_type IS ARRAY (NATURAL range <>) OF signed(7 DOWNTO 0); -- sfix8_En15 -- Constants CONSTANT coeff1 : signed(15 DOWNTO 0) := to_signed(4933, 16); -- sfix16_En19 CONSTANT coeff2 : signed(15 DOWNTO 0) := to_signed(14067, 16); -- sfix16_En19 CONSTANT coeff3 : signed(15 DOWNTO 0) := to_signed(19080, 16); -- sfix16_En19 CONSTANT coeff4 : signed(15 DOWNTO 0) := to_signed(14067, 16); -- sfix16_En19 CONSTANT coeff5 : signed(15 DOWNTO 0) := to_signed(4933, 16); -- sfix16_En19 -- Signals SIGNAL delay_pipeline : delay_pipeline_type(0 TO 4); -- sfix8_En15 SIGNAL product5 : signed(30 DOWNTO 0); -- sfix31_En34 SIGNAL mul_temp : signed(23 DOWNTO 0); -- sfix24_En34 SIGNAL product4 : signed(30 DOWNTO 0); -- sfix31_En34 SIGNAL mul_temp_1 : signed(23 DOWNTO 0); -- sfix24_En34 SIGNAL product3 : signed(30 DOWNTO 0); -- sfix31_En34 SIGNAL mul_temp_2 : signed(23 DOWNTO 0); -- sfix24_En34 SIGNAL product2 : signed(30 DOWNTO 0); -- sfix31_En34 SIGNAL mul_temp_3 : signed(23 DOWNTO 0); -- sfix24_En34 SIGNAL product1_cast : signed(31 DOWNTO 0); -- sfix32_En34 SIGNAL product1 : signed(30 DOWNTO 0); -- sfix31_En34 SIGNAL mul_temp_4 : signed(23 DOWNTO 0); -- sfix24_En34 SIGNAL sum1 : signed(31 DOWNTO 0); -- sfix32_En34 SIGNAL add_temp : signed(32 DOWNTO 0); -- sfix33_En34 SIGNAL sum2 : signed(31 DOWNTO 0); -- sfix32_En34 SIGNAL add_temp_1 : signed(32 DOWNTO 0); -- sfix33_En34 SIGNAL sum3 : signed(31 DOWNTO 0); -- sfix32_En34 SIGNAL add_temp_2 : signed(32 DOWNTO 0); -- sfix33_En34 SIGNAL sum4 : signed(31 DOWNTO 0); -- sfix32_En34 SIGNAL add_temp_3 : signed(32 DOWNTO 0); -- sfix33_En34 SIGNAL output_typeconvert : signed(7 DOWNTO 0); -- sfix8_En34 SIGNAL output_register : signed(7 DOWNTO 0); -- sfix8_En34 BEGIN -- Block Statements Delay_Pipeline_process : PROCESS (clk, reset) BEGIN IF reset = '1' THEN delay_pipeline(0 TO 4) <= (OTHERS => (OTHERS => '0')); ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN delay_pipeline(0) <= signed(filter_in); delay_pipeline(1 TO 4) <= delay_pipeline(0 TO 3); END IF; END IF; END PROCESS Delay_Pipeline_process; mul_temp <= delay_pipeline(4) * coeff5; product5 <= resize(mul_temp, 31); mul_temp_1 <= delay_pipeline(3) * coeff4; product4 <= resize(mul_temp_1, 31); mul_temp_2 <= delay_pipeline(2) * coeff3; product3 <= resize(mul_temp_2, 31); mul_temp_3 <= delay_pipeline(1) * coeff2; product2 <= resize(mul_temp_3, 31); product1_cast <= resize(product1, 32); mul_temp_4 <= delay_pipeline(0) * coeff1; product1 <= resize(mul_temp_4, 31); add_temp <= resize(product1_cast, 33) + resize(product2, 33); sum1 <= add_temp(31 DOWNTO 0); add_temp_1 <= resize(sum1, 33) + resize(product3, 33); sum2 <= add_temp_1(31 DOWNTO 0); add_temp_2 <= resize(sum2, 33) + resize(product4, 33); sum3 <= add_temp_2(31 DOWNTO 0); add_temp_3 <= resize(sum3, 33) + resize(product5, 33); sum4 <= add_temp_3(31 DOWNTO 0); output_typeconvert <= sum4(7 DOWNTO 0); Output_Register_process : PROCESS (clk, reset) BEGIN IF reset = '1' THEN output_register <= (OTHERS => '0'); ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN output_register <= output_typeconvert; END IF; END IF; END PROCESS Output_Register_process; -- Assignment Statements filter_out <= std_logic_vector(output_register); END rtl; Я также находил на этом форуме пример VHDL кода фильтра (от пользователя Михаил_К);генерировал VHDL с помощью программы с Opencores , но в железе не заработал фильтр.Я думаю,что все-таки неправильно собираю схему в Shematic,но разобраться немогу :-( Изменено 2 мая, 2011 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivanpa 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба По поводу того, как сделано суммирование можно тихо поплакать в сторонке,ну да ладно, работать из-за этого не должно перестать... а вот то, что вы там умножаете на нереально большие коэффициенты все, а в итоге берете младшие биты - это и правда проблема. (output_typeconvert <= sum4(7 DOWNTO 0);) минимальный коэффициент,на который вы умножаете равен 4933. положим вы умножаете на это число единицу - в ответе будет 69(mod(4933,256)) - это и правда то,что вы хотите получить? видимо, все же нужно брать старшие биты,нет? (output_typeconvert <= sum4(31 downto 24) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 2 мая, 2011 Опубликовано 2 мая, 2011 (изменено) · Жалоба Спасибо за совет.Во вторник проверю на железе Изменено 2 мая, 2011 пользователем Skryppy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба Сегодня,последовав совету Иван Панченко - взял старшие биты ,фильтр подал признаки жизни :-) : на выходе вместо синусоиды появились прямоугольные импульсы,правда,амплитуда которых не изменялась с изменением частоты,но все равно хоть какой-то результат.Буду переписывать код фильтра,может что-нить и заработает(хоть предыдущие мои попытки и не принесли результатов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться