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

Artunique

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Artunique

  • Звание
    Участник
    Участник

Контакты

  • ICQ
    Array

Информация

  • Город
    Array
  1. Всем привет. Решил добиться полного понимания Fixed Point арифметики. Для меня, да и для многих это очень актуально, я уверен. Больше всего, с этой арифметикой намудрено в матлабе. Например отрицательное значение fractional bitwidth и тп. И все говорят, что значение fractional очень важно указать верным, но никто не говорит как. Для конкретики и понимания возьмем обычный fir фильтр в матлабе. В его параметрах можно указать разрядность на входе + fractional часть и разрядность на выходе + fractional часть. То же самое можно указать для коэффициентов фильтра. Я точно знаю, сколько бит у меня на входе, знаю разрядность коэффициентов, знаю разрядность на выходе. Но ОТКУДА брать значение этой fractional части? И почему на выходе CIC фильтра матлаб мне выдает отрицательное значение этой fractional части?
  2. Почти. GFSK. Да, кстати в симулинк еще не запихивал. А созвездие там каким блочком смотреть, не подскажите?
  3. Всем привет. Вопрос следующий: имеется сигнал с полосой 25 кГц. Необходимо обеспечить максимально возможное подавление соседнего канала. Ниже приведен схематичный рисунок. Сигнал синего цвета, помеха (соседний канал) желтого цвета. Фиолетовый и красный - предполагаемый фильтр. Какой же фильтр лучше ослабит помеху?
  4. С моим опытом в программировании, написание займет куда больше времени. При том, когда пишешь ручками, не факт, что он получится какой надо в плане оптимизации) может есть готовые реализации FIR decimatora? чтобы свои коэфф-ты втащить и все)
  5. вот. 7000 LC занимает один фильтр в составе проекта Сейчас в проекте одного этого фильтра вместо константы на вход повесил просто пин, тоже плохо ему стало. Значит дело в фильтре
  6. Что именно по проекту? Проект DDC. состоит из NCO, CIC, FIR компенсатора. Корка FIR работала, но не устраивала. Меняю ее на FIR из матлаба, хрень получается. по ресурсам, как раз этот матлабовский фильтр и есть 7000 LC. Не понимаю, при чем тут пины. Ну так повесил я их. Как это поможет понять проблему? Синтезатор при компиляции одного этого фильтра и так ничего не выкидывает. Кусок привел, там еще 2 куска, но на них тем более ничего не видно. Там как раз умножители и сумматоры.
  7. Нет, константами прописаны. Вот код, может если будет возможность, кто-нибудь скомпилирует. -- ------------------------------------------------------------- -- -- Module: filter -- Generated by MATLAB® 8.5 and the Filter Design HDL Coder 2.9.7. -- Generated on: 2015-07-15 14:15:51 -- ------------------------------------------------------------- -- ------------------------------------------------------------- -- HDL Code Generation Options: -- -- TargetLanguage: VHDL -- InputType: signed/unsigned -- OutputType: signed/unsigned -- ResetAssertedLevel: Active-low -- TestBenchStimulus: step ramp chirp noise -- Filter Specifications: -- -- Sample Rate : 307.2 kHz -- Response : CIC Compensator -- Specification : Fp,Fst,Ap,Ast -- Multirate Type : Decimator -- Decimation Factor : 2 -- Number of Sections : 8 -- Differential Delay : 2 -- Passband Edge : 25 kHz -- Stopband Edge : 50 kHz -- Passband Ripple : 0.05 dB -- Stopband Atten. : 60 dB -- ------------------------------------------------------------- -- ------------------------------------------------------------- -- HDL Implementation : Fully parallel -- Multipliers : 48 -- Folding Factor : 1 -- ------------------------------------------------------------- -- Filter Settings: -- -- Discrete-Time FIR Multirate Filter (real) -- ----------------------------------------- -- Filter Structure : Direct-Form FIR Polyphase Decimator -- Decimation Factor : 2 -- Polyphase Length : 24 -- Filter Length : 48 -- Stable : Yes -- Linear Phase : Yes (Type 2) -- -- Arithmetic : fixed -- Numerator : s16,16 -> [-5.000000e-01 5.000000e-01) -- Input : s20,-33 -> [-4503599627370496 4503599627370496) -- Filter Internals : Full Precision -- Output : s38,-17 -> [-18014398509481984 18014398509481984) (auto determined) -- Product : s35,-17 -> [-2251799813685248 2251799813685248) (auto determined) -- Accumulator : s38,-17 -> [-18014398509481984 18014398509481984) (auto determined) -- Round Mode : No rounding -- Overflow Mode : No overflow -- ------------------------------------------------------------- LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.numeric_std.ALL; ENTITY ciccomp IS PORT( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; filter_in : IN signed(19 DOWNTO 0); -- sfix20_E33 filter_out : OUT signed(37 DOWNTO 0); -- sfix38_E17 ce_out : OUT std_logic ); END ciccomp; ---------------------------------------------------------------- --Module Architecture: filter ---------------------------------------------------------------- ARCHITECTURE rtl OF ciccomp IS -- Local Functions -- Type Definitions TYPE input_pipeline_type IS ARRAY (NATURAL range <>) OF signed(19 DOWNTO 0); -- sfix20_E33 -- Constants CONSTANT coeffphase1_1 : signed(15 DOWNTO 0) := to_signed(-10, 16); -- sfix16_En16 CONSTANT coeffphase1_2 : signed(15 DOWNTO 0) := to_signed(-11, 16); -- sfix16_En16 CONSTANT coeffphase1_3 : signed(15 DOWNTO 0) := to_signed(189, 16); -- sfix16_En16 CONSTANT coeffphase1_4 : signed(15 DOWNTO 0) := to_signed(224, 16); -- sfix16_En16 CONSTANT coeffphase1_5 : signed(15 DOWNTO 0) := to_signed(-534, 16); -- sfix16_En16 CONSTANT coeffphase1_6 : signed(15 DOWNTO 0) := to_signed(-845, 16); -- sfix16_En16 CONSTANT coeffphase1_7 : signed(15 DOWNTO 0) := to_signed(1081, 16); -- sfix16_En16 CONSTANT coeffphase1_8 : signed(15 DOWNTO 0) := to_signed(2337, 16); -- sfix16_En16 CONSTANT coeffphase1_9 : signed(15 DOWNTO 0) := to_signed(-1624, 16); -- sfix16_En16 CONSTANT coeffphase1_10 : signed(15 DOWNTO 0) := to_signed(-5761, 16); -- sfix16_En16 CONSTANT coeffphase1_11 : signed(15 DOWNTO 0) := to_signed(888, 16); -- sfix16_En16 CONSTANT coeffphase1_12 : signed(15 DOWNTO 0) := to_signed(15268, 16); -- sfix16_En16 CONSTANT coeffphase1_13 : signed(15 DOWNTO 0) := to_signed(19690, 16); -- sfix16_En16 CONSTANT coeffphase1_14 : signed(15 DOWNTO 0) := to_signed(8130, 16); -- sfix16_En16 CONSTANT coeffphase1_15 : signed(15 DOWNTO 0) := to_signed(-4116, 16); -- sfix16_En16 CONSTANT coeffphase1_16 : signed(15 DOWNTO 0) := to_signed(-4441, 16); -- sfix16_En16 CONSTANT coeffphase1_17 : signed(15 DOWNTO 0) := to_signed(1006, 16); -- sfix16_En16 CONSTANT coeffphase1_18 : signed(15 DOWNTO 0) := to_signed(2176, 16); -- sfix16_En16 CONSTANT coeffphase1_19 : signed(15 DOWNTO 0) := to_signed(-128, 16); -- sfix16_En16 CONSTANT coeffphase1_20 : signed(15 DOWNTO 0) := to_signed(-909, 16); -- sfix16_En16 CONSTANT coeffphase1_21 : signed(15 DOWNTO 0) := to_signed(-71, 16); -- sfix16_En16 CONSTANT coeffphase1_22 : signed(15 DOWNTO 0) := to_signed(284, 16); -- sfix16_En16 CONSTANT coeffphase1_23 : signed(15 DOWNTO 0) := to_signed(65, 16); -- sfix16_En16 CONSTANT coeffphase1_24 : signed(15 DOWNTO 0) := to_signed(-25, 16); -- sfix16_En16 CONSTANT coeffphase2_1 : signed(15 DOWNTO 0) := to_signed(-25, 16); -- sfix16_En16 CONSTANT coeffphase2_2 : signed(15 DOWNTO 0) := to_signed(65, 16); -- sfix16_En16 CONSTANT coeffphase2_3 : signed(15 DOWNTO 0) := to_signed(284, 16); -- sfix16_En16 CONSTANT coeffphase2_4 : signed(15 DOWNTO 0) := to_signed(-71, 16); -- sfix16_En16 CONSTANT coeffphase2_5 : signed(15 DOWNTO 0) := to_signed(-909, 16); -- sfix16_En16 CONSTANT coeffphase2_6 : signed(15 DOWNTO 0) := to_signed(-128, 16); -- sfix16_En16 CONSTANT coeffphase2_7 : signed(15 DOWNTO 0) := to_signed(2176, 16); -- sfix16_En16 CONSTANT coeffphase2_8 : signed(15 DOWNTO 0) := to_signed(1006, 16); -- sfix16_En16 CONSTANT coeffphase2_9 : signed(15 DOWNTO 0) := to_signed(-4441, 16); -- sfix16_En16 CONSTANT coeffphase2_10 : signed(15 DOWNTO 0) := to_signed(-4116, 16); -- sfix16_En16 CONSTANT coeffphase2_11 : signed(15 DOWNTO 0) := to_signed(8130, 16); -- sfix16_En16 CONSTANT coeffphase2_12 : signed(15 DOWNTO 0) := to_signed(19690, 16); -- sfix16_En16 CONSTANT coeffphase2_13 : signed(15 DOWNTO 0) := to_signed(15268, 16); -- sfix16_En16 CONSTANT coeffphase2_14 : signed(15 DOWNTO 0) := to_signed(888, 16); -- sfix16_En16 CONSTANT coeffphase2_15 : signed(15 DOWNTO 0) := to_signed(-5761, 16); -- sfix16_En16 CONSTANT coeffphase2_16 : signed(15 DOWNTO 0) := to_signed(-1624, 16); -- sfix16_En16 CONSTANT coeffphase2_17 : signed(15 DOWNTO 0) := to_signed(2337, 16); -- sfix16_En16 CONSTANT coeffphase2_18 : signed(15 DOWNTO 0) := to_signed(1081, 16); -- sfix16_En16 CONSTANT coeffphase2_19 : signed(15 DOWNTO 0) := to_signed(-845, 16); -- sfix16_En16 CONSTANT coeffphase2_20 : signed(15 DOWNTO 0) := to_signed(-534, 16); -- sfix16_En16 CONSTANT coeffphase2_21 : signed(15 DOWNTO 0) := to_signed(224, 16); -- sfix16_En16 CONSTANT coeffphase2_22 : signed(15 DOWNTO 0) := to_signed(189, 16); -- sfix16_En16 CONSTANT coeffphase2_23 : signed(15 DOWNTO 0) := to_signed(-11, 16); -- sfix16_En16 CONSTANT coeffphase2_24 : signed(15 DOWNTO 0) := to_signed(-10, 16); -- sfix16_En16 -- Signals SIGNAL ring_count : unsigned(1 DOWNTO 0); -- ufix2 SIGNAL phase_0 : std_logic; -- boolean SIGNAL phase_1 : std_logic; -- boolean SIGNAL ce_out_reg : std_logic; -- boolean SIGNAL input_register : signed(19 DOWNTO 0); -- sfix20_E33 SIGNAL input_pipeline_phase0 : input_pipeline_type(0 TO 22); -- sfix20_E33 SIGNAL input_pipeline_phase1 : input_pipeline_type(0 TO 23); -- sfix20_E33 SIGNAL product_phase0_1 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_2 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_1 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_3 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_2 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_4 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_3 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_5 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_4 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_6 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_5 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_7 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_6 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_8 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_7 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_9 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_8 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_10 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_9 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_11 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_10 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_12 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_11 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_13 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_12 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_14 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_13 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_15 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_14 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_16 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_15 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_17 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_16 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_18 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_17 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_19 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mulpwr2_temp : signed(20 DOWNTO 0); -- sfix21_E33 SIGNAL product_phase0_20 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_18 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_21 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_19 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_22 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_20 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_23 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_21 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase0_24 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_22 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_1 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_23 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_2 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_24 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_3 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_25 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_4 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_26 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_5 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_27 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_6 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mulpwr2_temp_1 : signed(20 DOWNTO 0); -- sfix21_E33 SIGNAL product_phase1_7 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_28 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_8 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_29 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_9 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_30 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_10 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_31 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_11 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_32 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_12 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_33 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_13 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_34 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_14 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_35 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_15 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_36 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_16 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_37 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_17 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_38 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_18 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_39 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_19 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_40 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_20 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_41 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_21 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_42 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_22 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_43 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_23 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_44 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL product_phase1_24 : signed(34 DOWNTO 0); -- sfix35_E17 SIGNAL mul_temp_45 : signed(35 DOWNTO 0); -- sfix36_E17 SIGNAL quantized_sum : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL sum1 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum2 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_1 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum3 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_2 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum4 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_3 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum5 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_4 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum6 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_5 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum7 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_6 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum8 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_7 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum9 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_8 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum10 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_9 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum11 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_10 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum12 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_11 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum13 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_12 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum14 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_13 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum15 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_14 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum16 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_15 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum17 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_16 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum18 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_17 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum19 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_18 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum20 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_19 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum21 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_20 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum22 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_21 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum23 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_22 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum24 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_23 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum25 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_24 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum26 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_25 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum27 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_26 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum28 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_27 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum29 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_28 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum30 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_29 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum31 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_30 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum32 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_31 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum33 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_32 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum34 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_33 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum35 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_34 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum36 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_35 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum37 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_36 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum38 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_37 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum39 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_38 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum40 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_39 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum41 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_40 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum42 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_41 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum43 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_42 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum44 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_43 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum45 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_44 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum46 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_45 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL sum47 : signed(37 DOWNTO 0); -- sfix38_E17 SIGNAL add_temp_46 : signed(38 DOWNTO 0); -- sfix39_E17 SIGNAL output_register : signed(37 DOWNTO 0); -- sfix38_E17 BEGIN -- Block Statements ce_output : PROCESS (clk, reset) BEGIN IF reset = '0' THEN ring_count <= to_unsigned(1, 2); ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN ring_count <= ring_count(0) & ring_count(1); END IF; END IF; END PROCESS ce_output; phase_0 <= ring_count(0) AND clk_enable; phase_1 <= ring_count(1) AND clk_enable; -- ------------------ CE Output Register ------------------ ce_output_register : PROCESS (clk, reset) BEGIN IF reset = '0' THEN ce_out_reg <= '0'; ELSIF clk'event AND clk = '1' THEN ce_out_reg <= phase_1; END IF; END PROCESS ce_output_register; input_reg_process : PROCESS (clk, reset) BEGIN IF reset = '0' THEN input_register <= (OTHERS => '0'); ELSIF clk'event AND clk = '1' THEN IF clk_enable = '1' THEN input_register <= filter_in; END IF; END IF; END PROCESS input_reg_process; Delay_Pipeline_Phase0_process : PROCESS (clk, reset) BEGIN IF reset = '0' THEN input_pipeline_phase0(0 TO 22) <= (OTHERS => (OTHERS => '0')); ELSIF clk'event AND clk = '1' THEN IF phase_1 = '1' THEN input_pipeline_phase0(0) <= input_register; input_pipeline_phase0(1 TO 22) <= input_pipeline_phase0(0 TO 21); END IF; END IF; END PROCESS Delay_Pipeline_Phase0_process; Delay_Pipeline_Phase1_process : PROCESS (clk, reset) BEGIN IF reset = '0' THEN input_pipeline_phase1(0 TO 23) <= (OTHERS => (OTHERS => '0')); ELSIF clk'event AND clk = '1' THEN IF phase_0 = '1' THEN input_pipeline_phase1(0) <= input_register; input_pipeline_phase1(1 TO 23) <= input_pipeline_phase1(0 TO 22); END IF; END IF; END PROCESS Delay_Pipeline_Phase1_process; mul_temp <= input_register * coeffphase1_1; product_phase0_1 <= mul_temp(34 DOWNTO 0); mul_temp_1 <= input_pipeline_phase0(0) * coeffphase1_2; product_phase0_2 <= mul_temp_1(34 DOWNTO 0); mul_temp_2 <= input_pipeline_phase0(1) * coeffphase1_3; product_phase0_3 <= mul_temp_2(34 DOWNTO 0); mul_temp_3 <= input_pipeline_phase0(2) * coeffphase1_4; product_phase0_4 <= mul_temp_3(34 DOWNTO 0); mul_temp_4 <= input_pipeline_phase0(3) * coeffphase1_5; product_phase0_5 <= mul_temp_4(34 DOWNTO 0); mul_temp_5 <= input_pipeline_phase0(4) * coeffphase1_6; product_phase0_6 <= mul_temp_5(34 DOWNTO 0); mul_temp_6 <= input_pipeline_phase0(5) * coeffphase1_7; product_phase0_7 <= mul_temp_6(34 DOWNTO 0); mul_temp_7 <= input_pipeline_phase0(6) * coeffphase1_8; product_phase0_8 <= mul_temp_7(34 DOWNTO 0); mul_temp_8 <= input_pipeline_phase0(7) * coeffphase1_9; product_phase0_9 <= mul_temp_8(34 DOWNTO 0); mul_temp_9 <= input_pipeline_phase0(8) * coeffphase1_10; product_phase0_10 <= mul_temp_9(34 DOWNTO 0); mul_temp_10 <= input_pipeline_phase0(9) * coeffphase1_11; product_phase0_11 <= mul_temp_10(34 DOWNTO 0); mul_temp_11 <= input_pipeline_phase0(10) * coeffphase1_12; product_phase0_12 <= mul_temp_11(34 DOWNTO 0); mul_temp_12 <= input_pipeline_phase0(11) * coeffphase1_13; product_phase0_13 <= mul_temp_12(34 DOWNTO 0); mul_temp_13 <= input_pipeline_phase0(12) * coeffphase1_14; product_phase0_14 <= mul_temp_13(34 DOWNTO 0); mul_temp_14 <= input_pipeline_phase0(13) * coeffphase1_15; product_phase0_15 <= mul_temp_14(34 DOWNTO 0); mul_temp_15 <= input_pipeline_phase0(14) * coeffphase1_16; product_phase0_16 <= mul_temp_15(34 DOWNTO 0); mul_temp_16 <= input_pipeline_phase0(15) * coeffphase1_17; product_phase0_17 <= mul_temp_16(34 DOWNTO 0); mul_temp_17 <= input_pipeline_phase0(16) * coeffphase1_18; product_phase0_18 <= mul_temp_17(34 DOWNTO 0); mulpwr2_temp <= ('0' & input_pipeline_phase0(17)) WHEN input_pipeline_phase0(17) = "10000000000000000000" ELSE -resize(input_pipeline_phase0(17),21); product_phase0_19 <= resize(mulpwr2_temp(20 DOWNTO 0) & '0' & '0' & '0' & '0' & '0' & '0' & '0', 35); mul_temp_18 <= input_pipeline_phase0(18) * coeffphase1_20; product_phase0_20 <= mul_temp_18(34 DOWNTO 0); mul_temp_19 <= input_pipeline_phase0(19) * coeffphase1_21; product_phase0_21 <= mul_temp_19(34 DOWNTO 0); mul_temp_20 <= input_pipeline_phase0(20) * coeffphase1_22; product_phase0_22 <= mul_temp_20(34 DOWNTO 0); mul_temp_21 <= input_pipeline_phase0(21) * coeffphase1_23; product_phase0_23 <= mul_temp_21(34 DOWNTO 0); mul_temp_22 <= input_pipeline_phase0(22) * coeffphase1_24; product_phase0_24 <= mul_temp_22(34 DOWNTO 0); mul_temp_23 <= input_pipeline_phase1(0) * coeffphase2_1; product_phase1_1 <= mul_temp_23(34 DOWNTO 0); mul_temp_24 <= input_pipeline_phase1(1) * coeffphase2_2; product_phase1_2 <= mul_temp_24(34 DOWNTO 0); mul_temp_25 <= input_pipeline_phase1(2) * coeffphase2_3; product_phase1_3 <= mul_temp_25(34 DOWNTO 0); mul_temp_26 <= input_pipeline_phase1(3) * coeffphase2_4; product_phase1_4 <= mul_temp_26(34 DOWNTO 0); mul_temp_27 <= input_pipeline_phase1(4) * coeffphase2_5; product_phase1_5 <= mul_temp_27(34 DOWNTO 0); mulpwr2_temp_1 <= ('0' & input_pipeline_phase1(5)) WHEN input_pipeline_phase1(5) = "10000000000000000000" ELSE -resize(input_pipeline_phase1(5),21); product_phase1_6 <= resize(mulpwr2_temp_1(20 DOWNTO 0) & '0' & '0' & '0' & '0' & '0' & '0' & '0', 35); mul_temp_28 <= input_pipeline_phase1(6) * coeffphase2_7; product_phase1_7 <= mul_temp_28(34 DOWNTO 0); mul_temp_29 <= input_pipeline_phase1(7) * coeffphase2_8; product_phase1_8 <= mul_temp_29(34 DOWNTO 0); mul_temp_30 <= input_pipeline_phase1(8) * coeffphase2_9; product_phase1_9 <= mul_temp_30(34 DOWNTO 0); mul_temp_31 <= input_pipeline_phase1(9) * coeffphase2_10; product_phase1_10 <= mul_temp_31(34 DOWNTO 0); mul_temp_32 <= input_pipeline_phase1(10) * coeffphase2_11; product_phase1_11 <= mul_temp_32(34 DOWNTO 0); mul_temp_33 <= input_pipeline_phase1(11) * coeffphase2_12; product_phase1_12 <= mul_temp_33(34 DOWNTO 0); mul_temp_34 <= input_pipeline_phase1(12) * coeffphase2_13; product_phase1_13 <= mul_temp_34(34 DOWNTO 0); mul_temp_35 <= input_pipeline_phase1(13) * coeffphase2_14; product_phase1_14 <= mul_temp_35(34 DOWNTO 0); mul_temp_36 <= input_pipeline_phase1(14) * coeffphase2_15; product_phase1_15 <= mul_temp_36(34 DOWNTO 0); mul_temp_37 <= input_pipeline_phase1(15) * coeffphase2_16; product_phase1_16 <= mul_temp_37(34 DOWNTO 0); mul_temp_38 <= input_pipeline_phase1(16) * coeffphase2_17; product_phase1_17 <= mul_temp_38(34 DOWNTO 0); mul_temp_39 <= input_pipeline_phase1(17) * coeffphase2_18; product_phase1_18 <= mul_temp_39(34 DOWNTO 0); mul_temp_40 <= input_pipeline_phase1(18) * coeffphase2_19; product_phase1_19 <= mul_temp_40(34 DOWNTO 0); mul_temp_41 <= input_pipeline_phase1(19) * coeffphase2_20; product_phase1_20 <= mul_temp_41(34 DOWNTO 0); mul_temp_42 <= input_pipeline_phase1(20) * coeffphase2_21; product_phase1_21 <= mul_temp_42(34 DOWNTO 0); mul_temp_43 <= input_pipeline_phase1(21) * coeffphase2_22; product_phase1_22 <= mul_temp_43(34 DOWNTO 0); mul_temp_44 <= input_pipeline_phase1(22) * coeffphase2_23; product_phase1_23 <= mul_temp_44(34 DOWNTO 0); mul_temp_45 <= input_pipeline_phase1(23) * coeffphase2_24; product_phase1_24 <= mul_temp_45(34 DOWNTO 0); quantized_sum <= resize(product_phase1_1, 38); add_temp <= resize(quantized_sum, 39) + resize(product_phase1_2, 39); sum1 <= add_temp(37 DOWNTO 0); add_temp_1 <= resize(sum1, 39) + resize(product_phase1_3, 39); sum2 <= add_temp_1(37 DOWNTO 0); add_temp_2 <= resize(sum2, 39) + resize(product_phase1_4, 39); sum3 <= add_temp_2(37 DOWNTO 0); add_temp_3 <= resize(sum3, 39) + resize(product_phase1_5, 39); sum4 <= add_temp_3(37 DOWNTO 0); add_temp_4 <= resize(sum4, 39) + resize(product_phase1_6, 39); sum5 <= add_temp_4(37 DOWNTO 0); add_temp_5 <= resize(sum5, 39) + resize(product_phase1_7, 39); sum6 <= add_temp_5(37 DOWNTO 0); add_temp_6 <= resize(sum6, 39) + resize(product_phase1_8, 39); sum7 <= add_temp_6(37 DOWNTO 0); add_temp_7 <= resize(sum7, 39) + resize(product_phase1_9, 39); sum8 <= add_temp_7(37 DOWNTO 0); add_temp_8 <= resize(sum8, 39) + resize(product_phase1_10, 39); sum9 <= add_temp_8(37 DOWNTO 0); add_temp_9 <= resize(sum9, 39) + resize(product_phase1_11, 39); sum10 <= add_temp_9(37 DOWNTO 0); add_temp_10 <= resize(sum10, 39) + resize(product_phase1_12, 39); sum11 <= add_temp_10(37 DOWNTO 0); add_temp_11 <= resize(sum11, 39) + resize(product_phase1_13, 39); sum12 <= add_temp_11(37 DOWNTO 0); add_temp_12 <= resize(sum12, 39) + resize(product_phase1_14, 39); sum13 <= add_temp_12(37 DOWNTO 0); add_temp_13 <= resize(sum13, 39) + resize(product_phase1_15, 39); sum14 <= add_temp_13(37 DOWNTO 0); add_temp_14 <= resize(sum14, 39) + resize(product_phase1_16, 39); sum15 <= add_temp_14(37 DOWNTO 0); add_temp_15 <= resize(sum15, 39) + resize(product_phase1_17, 39); sum16 <= add_temp_15(37 DOWNTO 0); add_temp_16 <= resize(sum16, 39) + resize(product_phase1_18, 39); sum17 <= add_temp_16(37 DOWNTO 0); add_temp_17 <= resize(sum17, 39) + resize(product_phase1_19, 39); sum18 <= add_temp_17(37 DOWNTO 0); add_temp_18 <= resize(sum18, 39) + resize(product_phase1_20, 39); sum19 <= add_temp_18(37 DOWNTO 0); add_temp_19 <= resize(sum19, 39) + resize(product_phase1_21, 39); sum20 <= add_temp_19(37 DOWNTO 0); add_temp_20 <= resize(sum20, 39) + resize(product_phase1_22, 39); sum21 <= add_temp_20(37 DOWNTO 0); add_temp_21 <= resize(sum21, 39) + resize(product_phase1_23, 39); sum22 <= add_temp_21(37 DOWNTO 0); add_temp_22 <= resize(sum22, 39) + resize(product_phase1_24, 39); sum23 <= add_temp_22(37 DOWNTO 0); add_temp_23 <= resize(sum23, 39) + resize(product_phase0_1, 39); sum24 <= add_temp_23(37 DOWNTO 0); add_temp_24 <= resize(sum24, 39) + resize(product_phase0_2, 39); sum25 <= add_temp_24(37 DOWNTO 0); add_temp_25 <= resize(sum25, 39) + resize(product_phase0_3, 39); sum26 <= add_temp_25(37 DOWNTO 0); add_temp_26 <= resize(sum26, 39) + resize(product_phase0_4, 39); sum27 <= add_temp_26(37 DOWNTO 0); add_temp_27 <= resize(sum27, 39) + resize(product_phase0_5, 39); sum28 <= add_temp_27(37 DOWNTO 0); add_temp_28 <= resize(sum28, 39) + resize(product_phase0_6, 39); sum29 <= add_temp_28(37 DOWNTO 0); add_temp_29 <= resize(sum29, 39) + resize(product_phase0_7, 39); sum30 <= add_temp_29(37 DOWNTO 0); add_temp_30 <= resize(sum30, 39) + resize(product_phase0_8, 39); sum31 <= add_temp_30(37 DOWNTO 0); add_temp_31 <= resize(sum31, 39) + resize(product_phase0_9, 39); sum32 <= add_temp_31(37 DOWNTO 0); add_temp_32 <= resize(sum32, 39) + resize(product_phase0_10, 39); sum33 <= add_temp_32(37 DOWNTO 0); add_temp_33 <= resize(sum33, 39) + resize(product_phase0_11, 39); sum34 <= add_temp_33(37 DOWNTO 0); add_temp_34 <= resize(sum34, 39) + resize(product_phase0_12, 39); sum35 <= add_temp_34(37 DOWNTO 0); add_temp_35 <= resize(sum35, 39) + resize(product_phase0_13, 39); sum36 <= add_temp_35(37 DOWNTO 0); add_temp_36 <= resize(sum36, 39) + resize(product_phase0_14, 39); sum37 <= add_temp_36(37 DOWNTO 0); add_temp_37 <= resize(sum37, 39) + resize(product_phase0_15, 39); sum38 <= add_temp_37(37 DOWNTO 0); add_temp_38 <= resize(sum38, 39) + resize(product_phase0_16, 39); sum39 <= add_temp_38(37 DOWNTO 0); add_temp_39 <= resize(sum39, 39) + resize(product_phase0_17, 39); sum40 <= add_temp_39(37 DOWNTO 0); add_temp_40 <= resize(sum40, 39) + resize(product_phase0_18, 39); sum41 <= add_temp_40(37 DOWNTO 0); add_temp_41 <= resize(sum41, 39) + resize(product_phase0_19, 39); sum42 <= add_temp_41(37 DOWNTO 0); add_temp_42 <= resize(sum42, 39) + resize(product_phase0_20, 39); sum43 <= add_temp_42(37 DOWNTO 0); add_temp_43 <= resize(sum43, 39) + resize(product_phase0_21, 39); sum44 <= add_temp_43(37 DOWNTO 0); add_temp_44 <= resize(sum44, 39) + resize(product_phase0_22, 39); sum45 <= add_temp_44(37 DOWNTO 0); add_temp_45 <= resize(sum45, 39) + resize(product_phase0_23, 39); sum46 <= add_temp_45(37 DOWNTO 0); add_temp_46 <= resize(sum46, 39) + resize(product_phase0_24, 39); sum47 <= add_temp_46(37 DOWNTO 0); output_register_process : PROCESS (clk, reset) BEGIN IF reset = '0' THEN output_register <= (OTHERS => '0'); ELSIF clk'event AND clk = '1' THEN IF phase_1 = '1' THEN output_register <= sum47; END IF; END IF; END PROCESS output_register_process; -- Assignment Statements ce_out <= ce_out_reg; filter_out <= output_register; END rtl;
  8. FIR из FDATool матлаба. Умножения и суммы в самом коде есть, но вот что показал RTL. На входе 20 бит, коэфф-ты 16 бит
  9. У меня классический FIR компенсатор. На пины не обращайте внимания, первая картинка - это весь мой проект.
  10. порядок 80. работает на fs = 307200Hz, полоса около 50000 Hz, с эти все в порядке. отчет отдельного фильтра вот, все нормально
  11. в том и дело, что отдельный фильтр занимает мало логики. так плохо он начинает себя вести в составе проекта всего, когда цепляешь к нему reset. в то же время ip корка FIR фильтра в составе проекта работает нормально
  12. Добрый день, уважаемые форумчане. Осваиваю инструмент матлаба для генерирование HDL кода. Конкретнее, реализую FIR фильтр. Для наглядности прикреплю bsf картинку полученного фильтра Если на reset подать постоянный уровень, фильтр выдает на выходе нули и при компиляции, в отчете получается мизерное количество ресурсов задействовано. Соответственно, принято решение сформировать reset. Это было успешно сделано и данный фильтр (отдельно) был промоделирован во встроенном симуляторе quartus 9.1. Все работало. Если же собирать весь проект, в который входит данный фильтр, то квартус ругается сначала и выдает такие ворнинги: а затем логика разрастается до 19 с лишним тыс. элементов, что неприемлемо для моего 3го циклона. кто-нибудь сталкивался с подобной проблемой? а еще лучше, если кто-то синтезировал код для FIR из матлаба и подскажет что не так.
  13. Создал проект с фильтром в 9 квартусе и промоделировал во встроенном симуляторе. Действительно фильтр требует сброса обязательно.
  14. Есть у кого мысли по поводу того, почему не работает фильтр? Что скажите про reset? нужен ли он для данного кода или нет?
  15. Спасибо. А если децимацию я делаю в 2 этапа, в 16 и 20 раз, то компенсировать я должен только второй фильтр?
×
×
  • Создать...