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

Dx Portal КИХ Фильтр на ПЛИС


Рекомендуемые сообщения

Здравствуйте, У меня есть плата 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 после сложения нужно увеличить?

 

Читать дальше

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...