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

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

День добрый!

 

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

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

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

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

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

 

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

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


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

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

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


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

ИМХО исходник, который генерит Матлаб - абсолютное зло для человека, который только начал разбираться в 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.

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


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

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

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


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

 

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

 

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

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


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

День добрый!

 

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

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

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

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

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

 

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

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

 

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

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


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

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

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

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


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

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

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

 

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

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


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

Второй вариант: Для объектов 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.

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


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

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

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

 

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

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


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

Короче, прилагаю свои реализации БИХ и КИХ фильтров. Там два файла 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

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


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

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

 

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

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


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

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

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

Все вот это

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

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

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


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

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

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

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

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

 

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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