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

Skryppy

Свой
  • Постов

    210
  • Зарегистрирован

  • Посещение

Весь контент Skryppy


  1. Здравствуйте. Решил освоить IP ядро Xilinx FIR Compiler v6.3 . Различные виды фильтров прекрасно синтезируются, но вот с фильтром с перегружаемыми коэффициентами я не смог разобраться. Почитал даташит к нему, потестил в ISimе. Помогите разобраться в поведении сигнала reload_tready –почему его период всегда 18 тактов, а не такой как на временных диаграммах даташита (стр 26). Подскажите что делать с сигналом config_tdata, в даташите на стр 23 дается описание структуры этого сигнала, я не понял что за тип фильтра писать в поле А(младших битах) и какой канал писать в поле В(старшие биты). Поискал на форумах и на официальном сайте-ничего вразумительного найти не смог :-( . Опишу порядок моих действий: 1) сигнал reload_tvalid выставляю в ‘1’; 2) подаю коэффициенты (сигнал reload_tdata); 3) когда приходит последний коэффициент выставляю сигнал reload_tlast в ‘1’; 4) сигнал reload_tvalid выставляю в ‘0’;(если он меньше 18 тактов-перезагрузки коэфтов не происходит :-( ); 5) сигнал config_tvalid выставляю в ‘1’ (длительность 1 такт). Фильтр перестраивается, но я не разобрался, как записать 20 и более коэффициентов. Буду рад любой информации. Заранее спасибо.  
  2. Сегодня,последовав совету Иван Панченко - взял старшие биты ,фильтр подал признаки жизни :-) : на выходе вместо синусоиды появились прямоугольные импульсы,правда,амплитуда которых не изменялась с изменением частоты,но все равно хоть какой-то результат.Буду переписывать код фильтра,может что-нить и заработает(хоть предыдущие мои попытки и не принесли результатов).
  3. Спасибо за совет.Во вторник проверю на железе
  4. 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,но разобраться немогу :-(
  5. С фильтра на выход ничего не приходит,причем всегда :-( . "подтяните на пробу на "gnd/Vcc""-я так понимаю вы предлагаете на reset подать vcc,но ведь тогда будет происходить постоянный сброс? к reset я также подкдючал gnd,но результат тот же-с выхода фильтра ничего не приходит на осциллограф :-(.
  6. На связку АЦП-ЦАП я подавал синусоиду-на выходе получал сдвинутую,немного зашумленную синусоиду,результат ,я думаю,вполне удовлетворительный,также испытавал схему,подачей с АЦП на счетчик сигнала,а затем передавал его на ЦАП -на выходе получил пилу, правда не с прямолинейным,а слегка выпуклым фронтом.
  7. Я как раз и считаю,что схему как-то неправильно собрал,поэтому так и назвал тему.Можете уточнить,что такое "дженирик" ? DCM вроде как работает-я подавал выходной сигнал с DCM сразу на ЦАП-на выходе была синусоида с частотой уменьшенной вдвое.
  8. Так в том-то и дело,что я использовал разные варианты: экспортировал коэффициенты в сое файл и работал с IP ядром FIR Compiller ;писал фильтр сам на VHDL разными способами,но он все равно не работает.
  9. Здравствуйте. Я в Матлабе в 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 разрядного АЦП и ЦАП: Так вот,сгенерировал проект без проблем,но в железе фильтр неработает. Подскажите,пожалуйста,что я делаю неправильно.
×
×
  • Создать...