NewSistems Опубликовано 4 ноября, 2018 Жалоба Поделиться Опубликовано 4 ноября, 2018 Здравствуйте, У меня есть плата HELPER LMD-System c АЦП, ЦАП(в виде шим фильтра), cyclon 3. Я новичок в этом деле делаю первый серьезный проект. Цель проекта научиться рассчитывать и создавать цифровые фильтры, а так же работать с ними. Мой проект состоит из: Генератора синусоиды, с регулятором частоты(от 200Гц до 5кГц), состоит из счетчиков, которые подают меняющийся по кругу двоичный код на ШИМ, а он создает аналоговый сигнал - синусоиду в положительной области. Далее Аналоговый сигнал поступает на вход АЦП-12 бит, снова преобразуется в двоичный код, затем поступает на ЦАП (2й канал ШИМ фильтра). Моя задача поставить фильтр между АЦП и ЦАП, который будет, например пропускать частоты ниже 1кГц, а все что выше задавливать. Суть проблемы: когда я рассчитываю ких фильтр, в матлабе, фиркомпиллере, либо на сайтах онлайн, мне выдают коэффициенты типа: -41 -120 -125 -22 105 68 -116 -175 130 637 890 637 130 -175 -116 68 105 -22 -125 -120 -41 Они отрицательные! У меня АЦП выдает только прямой код, ЦАП, так же понимает только положительный код! У меня одна идея в голове прибавить к этой последовательности цифр 175, чтобы самое маленькое отрицательное превратить в 0! Когда я это сделал мой фильтр начал задавливать в 0 вообще все частоты, почему? может мой подход не верный? если у кого-нибудь есть готовый, рабочий фильтр 12 бит на VHDL, поделитесь, для изучения. Вот код моего фильтра, c другими коэффицентами на них ненужно смотреть: library Ieee; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_Arith.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Mfil is Port ( clk: in std_logic; adc: in std_logic_vector(11 downto 0); f_out: out std_logic_vector(11 downto 0)); end Mfil; architecture Behavioral of Mfil is signal r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31, r32, r33: std_logic_vector(11 downto 0); signal k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34: std_logic_vector(11 downto 0); signal p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34: std_logic_vector(26 downto 0); signal pl0, pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8, pl9, pl10, pl11, pl12, pl13, pl14, pl15, pl16, pl17, pl18, pl19, pl20, pl21, pl22, pl23, pl24, pl25, pl26, pl27, pl28, pl29, pl30, pl31, pl32, pl33, pl34: std_logic_vector(23 downto 0); signal sum: std_logic_vector(26 downto 0); begin k0 <= conv_std_logic_vector(45,12); k1 <= conv_std_logic_vector(29,12); k2 <= conv_std_logic_vector(0,12); k3 <= conv_std_logic_vector(-34,12); k4 <= conv_std_logic_vector(-59,12); k5 <= conv_std_logic_vector(-64,12); k6 <= conv_std_logic_vector(-43,12); k7 <= conv_std_logic_vector(0,12); k8 <= conv_std_logic_vector(53,12); k9 <= conv_std_logic_vector(96,12); k10 <= conv_std_logic_vector(110,12); k11 <= conv_std_logic_vector(79,12); k12 <= conv_std_logic_vector(0,12); k13 <= conv_std_logic_vector(-119,12); k14 <= conv_std_logic_vector(-258,12); k15 <= conv_std_logic_vector(-387,12); k16 <= conv_std_logic_vector(-478,12); k17 <= conv_std_logic_vector(2047,12); k18 <= conv_std_logic_vector(-478,12); k19 <= conv_std_logic_vector(-387,12); k20 <= conv_std_logic_vector(-258,12); k21 <= conv_std_logic_vector(-119,12); k22 <= conv_std_logic_vector(0,12); k23 <= conv_std_logic_vector(79,12); k24 <= conv_std_logic_vector(110,12); k25 <= conv_std_logic_vector(96,12); k26 <= conv_std_logic_vector(53,12); k27 <= conv_std_logic_vector(0,12); k28 <= conv_std_logic_vector(-43,12); k29 <= conv_std_logic_vector(-64,12); k30 <= conv_std_logic_vector(-59,12); k31 <= conv_std_logic_vector(-34,12); k32 <= conv_std_logic_vector(0,12); k33 <= conv_std_logic_vector(29,12); k34 <= conv_std_logic_vector(45,12); process (clk) begin if clk'event and clk = '1' then r0 <= adc; r1 <= r0 ; r2 <= r1 ; r3 <= r2 ; r4 <= r3 ; r5 <= r4 ; r6 <= r5 ; r7 <= r6 ; r8 <= r7 ; r9 <= r8 ; r10 <= r9 ; r11 <= r10 ; r12 <= r11 ; r13 <= r12 ; r14 <= r13 ; r15 <= r14 ; r16 <= r15 ; r17 <= r16 ; r18 <= r17 ; r19 <= r18 ; r20 <= r19 ; r21 <= r20 ; r22 <= r21 ; r23 <= r22 ; r24 <= r23 ; r25 <= r24 ; r26 <= r25 ; r27 <= r26 ; r28 <= r27 ; r29 <= r28 ; r30 <= r29 ; r31 <= r30 ; r32 <= r31 ; r33 <= r32 ; sum(26 downto 0) <= p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + p11 + p12 + p13 + p14 + p15 + p16 + p17 + p18 + p19 + p20 + p21 + p22 + p23 + p24 + p25 + p26 + p27 + p28 + p29 + p30 + p31 + p32 + p33 + p34 ; end if; end process; p0 <= "000" & pl0 ; p1 <= "000" & pl1 ; p2 <= "000" & pl2 ; p3 <= "000" & pl3 ; p4 <= "000" & pl4 ; p5 <= "000" & pl5 ; p6 <= "000" & pl6 ; p7 <= "000" & pl7 ; p8 <= "000" & pl8 ; p9 <= "000" & pl9 ; p10 <= "000" & pl10 ; p11 <= "000" & pl11 ; p12 <= "000" & pl12 ; p13 <= "000" & pl13 ; p14 <= "000" & pl14 ; p15 <= "000" & pl15 ; p16 <= "000" & pl16 ; p17 <= "000" & pl17 ; p18 <= "000" & pl18 ; p19 <= "000" & pl19 ; p20 <= "000" & pl20 ; p21 <= "000" & pl21 ; p22 <= "000" & pl22 ; p23 <= "000" & pl23 ; p24 <= "000" & pl24 ; p25 <= "000" & pl25 ; p26 <= "000" & pl26 ; p27 <= "000" & pl27 ; p28 <= "000" & pl28 ; p29 <= "000" & pl29 ; p30 <= "000" & pl30 ; p31 <= "000" & pl31 ; p32 <= "000" & pl32 ; p33 <= "000" & pl33 ; p34 <= "000" & pl34 ; pl1 <= r0 * k1 ; pl2 <= r1 * k2 ; pl3 <= r2 * k3 ; pl4 <= r3 * k4 ; pl5 <= r4 * k5 ; pl6 <= r5 * k6 ; pl7 <= r6 * k7 ; pl8 <= r7 * k8 ; pl9 <= r8 * k9 ; pl10 <= r9 * k10 ; pl11 <= r10 * k11 ; pl12 <= r11 * k12 ; pl13 <= r12 * k13 ; pl14 <= r13 * k14 ; pl15 <= r14 * k15 ; pl16 <= r15 * k16 ; pl17 <= r16 * k17 ; pl18 <= r17 * k18 ; pl19 <= r18 * k19 ; pl20 <= r19 * k20 ; pl21 <= r20 * k21 ; pl22 <= r21 * k22 ; pl23 <= r22 * k23 ; pl24 <= r23 * k24 ; pl25 <= r24 * k25 ; pl26 <= r25 * k26 ; pl27 <= r26 * k27 ; pl28 <= r27 * k28 ; pl29 <= r28 * k29 ; pl30 <= r29 * k30 ; pl31 <= r30 * k31 ; pl32 <= r31 * k32 ; pl33 <= r32 * k33 ; pl34 <= r33 * k34 ; f_out(11 downto 0) <= sum (26 downto 15) + "000111011110" ; end architecture; [/html] Может у меня сам фильтр не правильно сделан? или разрядность sum после сложения нужно увеличить? Читать дальше Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.