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

Помогите со схемой

Здравствуйте. Я в Матлабе в 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 разрядного АЦП и ЦАП:

 

post-62975-1304100872_thumb.jpg

 

Так вот,сгенерировал проект без проблем,но в железе фильтр неработает. Подскажите,пожалуйста,что я делаю неправильно.

 

Поделиться сообщением


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

помнится мне,что в каких-то версиях матлаба была проблема с квантованиями в fdatool, с тех пор им и не пользуюсь. Я бы на вашем месте попробовал:

a ) отписать коэффициенты фильтра в массив, ручками округлить, привести к нужной разрядности и т.п.

b ) проверить работу фильтра с полученными(вашим вариантом) коэффициентами в матлабе.

c ) в конце-концов, фильтр четвертого порядка, напишите вы его руками!=))

Изменено пользователем Иван Панченко

Поделиться сообщением


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

Так в том-то и дело,что я использовал разные варианты: экспортировал коэффициенты в сое файл и работал с IP ядром FIR Compiller ;писал фильтр сам на VHDL разными способами,но он все равно не работает.

Изменено пользователем Skryppy

Поделиться сообщением


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

Так в том-то и дело,что я использовал разные варианты: экспортировал коэффициенты в сое файл и работал с IP ядром FIR Compiller ;писал фильтр сам на VHDL разными способами,но он все равно не работает.

 

В чём проявляется это "не работает"?

Может вообще у вас DCM не запускается из-за того что дженерики в схематике не задали - помниться там с этим гемморой был.

Мой вам совет пишите сразу на HDL.

 

А ещё типовой трабл - это использование разных кодов АЦП, ЦАП и фильтра.

Типа, например, АЦП в прямом со смещением, ЦАП в прямом со смещением, а фильтр в дополнительном.

 

Поделиться сообщением


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

да, и правда, все больше сомнений:"а фильтр ли не работает?" вы на 100% уверены, что не работает именно фильтр?

Поделиться сообщением


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

Я как раз и считаю,что схему как-то неправильно собрал,поэтому так и назвал тему.Можете уточнить,что такое "дженирик" ?

 

DCM вроде как работает-я подавал выходной сигнал с DCM сразу на ЦАП-на выходе была синусоида с частотой уменьшенной вдвое.

Поделиться сообщением


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

"дженирик" это "generic". Не знаю насчет строгой литературной точности - параметры, которые можно задавать различными для одного и того же блочка(entity) при различных его использованиях. по поводу сигнала с АЦП: какой бит старший, какой младший - точно верно? попробуйте без фильтра поподавать константы на связку ацп-цап и посмотреть, насколько адекватно работает...

Поделиться сообщением


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

На связку АЦП-ЦАП я подавал синусоиду-на выходе получал сдвинутую,немного зашумленную синусоиду,результат ,я думаю,вполне удовлетворительный,также испытавал схему,подачей с АЦП на счетчик сигнала,а затем передавал его на ЦАП -на выходе получил пилу, правда не с прямолинейным,а слегка выпуклым фронтом.

 

Поделиться сообщением


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

а ресет у вас в верном положении?=) подтяните на пробу на "gnd/Vcc" . да и в чем тогда заключается "неработоспособность фильтра?" вообще не работает или "не фильтрует?"

Поделиться сообщением


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

С фильтра на выход ничего не приходит,причем всегда :-( .

 

"подтяните на пробу на "gnd/Vcc""-я так понимаю вы предлагаете на reset подать vcc,но ведь тогда будет происходить постоянный сброс? к reset я также подкдючал gnd,но результат тот же-с выхода фильтра ничего не приходит

на осциллограф :-(.

Изменено пользователем Skryppy

Поделиться сообщением


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

gnd/Vcc имелось ввиду нужный, в зависимости от используемой полярности импульса сброса...

пора,видимо, уже VHDL код в студию=) без него вряд ли разберемся... а вы точно копируете из матлаба все необходимые файлики? или там только кусок vhdl кода?

Поделиться сообщением


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

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,но разобраться немогу :-(

Изменено пользователем Skryppy

Поделиться сообщением


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

По поводу того, как сделано суммирование можно тихо поплакать в сторонке,ну да ладно, работать из-за этого не должно перестать... а вот то, что вы там умножаете на нереально большие коэффициенты все, а в итоге берете младшие биты - это и правда проблема.

(output_typeconvert <= sum4(7 DOWNTO 0);) минимальный коэффициент,на который вы умножаете равен 4933. положим вы умножаете на это число единицу - в ответе будет 69(mod(4933,256)) - это и правда то,что вы хотите получить? видимо, все же нужно брать старшие биты,нет?

(output_typeconvert <= sum4(31 downto 24) )

Поделиться сообщением


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

Спасибо за совет.Во вторник проверю на железе

Изменено пользователем Skryppy

Поделиться сообщением


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

Сегодня,последовав совету Иван Панченко - взял старшие биты ,фильтр подал признаки жизни :-) : на выходе вместо синусоиды появились прямоугольные импульсы,правда,амплитуда которых не изменялась с изменением частоты,но все равно хоть какой-то результат.Буду переписывать код фильтра,может что-нить и заработает(хоть предыдущие мои попытки и не принесли результатов).

Поделиться сообщением


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

×
×
  • Создать...