Jump to content

    

Реализация полосового фильтра на VHDL

День добрый!

 

Собственно начал изучать недавно Quartus II с VHDL.

Вопрос состоит в том, как лучше реализовать низко добротный полосовой фильтр с помощью VHDL?

Имеется его реализация на плате и рассчитанная для него передаточная функция в MatLab.

Где лучше почитать или посмотреть об этом?

В целом очень нужен совет с чего лучше начать)

 

В заранее спасибо!

Share this post


Link to post
Share on other sites

Сгенерите в матлабе исходник на VHDL,изучите его структуру и подумайте - можно ли сделать лучше. B)

Share this post


Link to post
Share on other sites

ИМХО исходник, который генерит Матлаб - абсолютное зло для человека, который только начал разбираться в VHDL :biggrin: . Не знаю, как для обычного FIR фильтра, но когда я увидел исходник для полифазного, то немного подофигел.

Может быть топикстартеру имеет смысл поискать в сети книгу Uwe Meyer-Baese "Digital Signal Processing with Field Programmable Gate Arrays". Не помню были там примеры на VHDL или Verilog, Но это не суть важно. Важнее определиться как будет ложиться структура фильтра на структуру FPGA. Здесь наверное пригодится часть из Stratix Device Hadbook, посвященная DSP: http://www.altera.com/literature/hb/stx/st...ion_4_vol_2.pdf.

Share this post


Link to post
Share on other sites

При реализации фильтров через fdatool Matlab'а не делаю экспорт в HDL, а тычу "реализовать модель" в графике, смотрю там все задержки, коэффициенты, сумматоры и уж потом это описываю так, как мне удобно.

Share this post


Link to post
Share on other sites

 

А я не зря сказал можно ли сделать лучше. :rolleyes:

 

Для простого КИХ там ничего страшного нет, только очень уж неоптимально.

Share this post


Link to post
Share on other sites
День добрый!

 

Собственно начал изучать недавно Quartus II с VHDL.

Вопрос состоит в том, как лучше реализовать низко добротный полосовой фильтр с помощью VHDL?

Имеется его реализация на плате и рассчитанная для него передаточная функция в MatLab.

Где лучше почитать или посмотреть об этом?

В целом очень нужен совет с чего лучше начать)

 

В заранее спасибо!

попробуйте вот это

 

там в общем про это рассказано... и кажется даже пример приведен

Share this post


Link to post
Share on other sites

За книгу отдельное спасибо, попробую изучить)

На счет генерирования в матлабе исходник на VHDL, вопрос наверно глупый но чем генерировать? Слышал про программу альтеры dsp builder, но работать она отказалась требуя лицензию, а собственно откуда у студента деньги на лицензию) Иль там каким другим способом можно код получить?

Share this post


Link to post
Share on other sites
За книгу отдельное спасибо, попробую изучить)

На счет генерирования в матлабе исходник на VHDL, вопрос наверно глупый но чем генерировать? Слышал про программу альтеры dsp builder, но работать она отказалась требуя лицензию, а собственно откуда у студента деньги на лицензию) Иль там каким другим способом можно код получить?

 

В FDA Tool матлаба есть меню Targets/Generate HDL,запускаете после реализации фильтра с нужными параметрами,предварительно проквантовав фильтр.

Share this post


Link to post
Share on other sites

Второй вариант: Для объектов dfilt или mfilt функция

GENERATEHDL Generate HDL.

GENERATEHDL(Hb) automatically generates VHDL or Verilog code for

the quantized filter, Hb. The default language is VHDL; to generate

Verilog, supply the property/value pair 'TargetLanguage','Verilog'.

The default file name is the name of the filter variable, e.g.

Hb.vhd for VHDL and Hb.v for Verilog. The file is written to

the HDL source directory which defaults to 'hdlsrc' under the

current directory. This directory will be created if necessary.

Share this post


Link to post
Share on other sites
ИМХО исходник, который генерит Матлаб - абсолютное зло для человека, который только начал разбираться в VHDL

Абсолютно с Вами согласен.

 

xponuk, Вы определитесь пожалуйста какой Вы фильтр хотите получить БИХ или КИХ.

Share this post


Link to post
Share on other sites

Короче, прилагаю свои реализации БИХ и КИХ фильтров. Там два файла Matlab/ В каждом из них сначала задаются параметры фильтра, потом вычисляются коэффициенты, далее генерируется VHDL-код. Выходной файл имеет название Filter.vhdl Откроете его и посмотрите как все реализовано.

Замечание: БИХ-фильтр реализован в виде секций 2-ого порядка. Еще одно важное замечание, фильтры не полосовые, а ФНЧ! Чтобы получить полосовой фильтр, нужно изменить Matlab'овский файл, а именно его начало на:

clear all
clc

Fs = 500*1000;  % Частота дискретизации

data_size = 16; % Разрядность данных
coef_size = 16; % Разрядность коэффициентов

Fstop1 = 5*10;      % Начало полосы задерживания
Fpass1 = 1*1000;     % Начало полосы пропускания
Fpass2 = 50*1000;     % Конец полосы пропускания
Fstop2 = 51*1000;     % Конец полосы задерживания
Astop1 = 60;      % Ослабление в полосе задерживания (дБ)
Apass  = 1;       % Уровень пульсаций в полосе пропускания (дБ)
Astop2 = 60;      % Ослабление в полосе задерживания (дБ)
match  = 'both';  % Оптимизация по уровню пульсаций (Оптимизировать в полосе пропускания и в полосе задерживания)

% Синтез Фильтра:
h  = fdesign.bandpass(Fstop1, Fpass1, Fpass2, Fstop2, Astop1, Apass, Astop2, Fs);
Hd = design(h, 'ellip', 'MatchExactly', match);

% Преобразование в секции второго порядка:
Hd = convert(Hd, 'df1sos');

% Установка свойств арифметики с фиксированной запятой

set(Hd, 'Arithmetic', 'fixed', ...
    'CoeffWordLength', coef_size, ...
    'CoeffAutoScale', true, ...
    'ProductMode', 'Fullprecision', ...
    'AccumMode', 'KeepMSB', ...
    'AccumWordLength', 40, ...
    'NumStateWordLength', data_size, ...
    'DenStateWordLength', data_size, ...
    'NumStateFracLength', data_size - 1, ...
    'DenStateFracLength', data_size - 1, ...
    'InputWordLength', data_size, ...
    'inputFracLength', data_size - 1, ...
    'OutputWordLength', data_size, ...
    'OutputMode', 'AvoidOverflow', ...
    'signed',        true, ...
    'RoundMode',     'convergent', ...
    'OverflowMode',  'Saturate', ...
    'CastBeforeSum', false);
denormalize(Hd);

%% АЧХ фильтра
[b_sos, a_sos] = sos2tf(Hd.sosMatrix, Hd.ScaleValues); % Преобразование секций второго порядка в коэффициенты числителя и знаменателя
[h_sos, f_sos] = freqz(b_sos, a_sos, 2048); % Построение АЧХ фильтра по коффициентам числителя и знаменателя

 

Важно! Мои примеры не претендуют на роль единственно верных. Просто мне особо никто не бодсказывал и до всего этого я дошел сам, ковыряясь с примерами от Simulink'a. В итоге получилось это. Надо сказать, что моя реализация работает быстрее, чем реализация от Simulink. Если кто-то сделал лучше, пусть не только заявит об этом, но и приведет пример своей реализации. Надеюсь Вам будет полезна моя работа, успехов!

Altera_Filter.rar

Share this post


Link to post
Share on other sites

Собственно говоря хочу получить код Vhdl для БИХ фильтра ( фильтр полосовой ), низко добротного (добротность где то 2), с резонансной частотой 10 000 Гц в принципе больше требований нет принципиальных.

 

Уважаемый Zed, можно попросить Вас немного пояснить как собственно программы данные запускаются, честно не понял, попробовал через симулинк не вышло, какой блок ее вызывает?. И собственно vhdl код насколько я понимаю Вы получаете с помощью встроенного в матлаб кодера?

Share this post


Link to post
Share on other sites
Собственно говоря хочу получить код Vhdl для БИХ фильтра ( фильтр полосовой ), низко добротного (добротность где то 2), с резонансной частотой 10 000 Гц в принципе больше требований нет принципиальных.

Для Ваших требований - открывайте хелп и смотрите, какие полосовые фильтры есть и какие у них есть параметры.

Все вот это

clear all
clc
Fs = 500*1000;  % Частота дискретизации
data_size = 16; % Разрядность данных
coef_size = 16; % Разрядность коэффициентов

вводится прямо в окне матлаб (как Вам уже сказали все эти параметры для конкретного случая). В нем же можно ввести для данной реализации функцию generatehdl (все параметры, так же как и язык реализации подробно описаны в хелпе) созданного объекта Hd. В результате получите созданный объект на требуемом языке.

Share this post


Link to post
Share on other sites
Уважаемый Zed, можно попросить Вас немного пояснить как собственно программы данные запускаются, честно не понял, попробовал через симулинк не вышло, какой блок ее вызывает?

Ну во-первых это файлы с расширением *.m, значит они Matlab'овские. Т.е. открываеть его нужно в Matlab, а не Simulink. Далее нажимаете запуск (Run) и на диске C у вас появится файл с названием filter.vhd.

И собственно vhdl код насколько я понимаю Вы получаете с помощью встроенного в матлаб кодера?

Нет с помощью Matlab'а я получаю коэффициенты фильтра с заданными характеристиками и перевожу их в дополнительный код. Также мой Matlab'овский файл содержит "скелет" VHDL-кода, написанного мной, куда просто подставляются коэффициенты. Далее этот код записывается в файл C:\filter.vhd. Когда откроете файл Вы все поймете, там достаточно комментариев. Если что-то не понятно, спрашивайте. Успехов!

 

P.S. Также вы можете менять параметры фильтра: полосу пропускания, частоту дискретизации, неравномеерность в полосе пропускания и т.д. Затем Вы снова нажимаете Run и получаете новый файл filter.vhd уже с новыми параметрами (коэффициентами).

Share this post


Link to post
Share on other sites

Возникла проблема с программой. Собственно поменял код, для полосового фильтра, получил его АЧХ в матлабе, но vhdl код не создается. Собственно с чем это может быть связано? Или я не так понял и корректировка параметров фильтра происходит в vhdl коде?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this