Этот пример демонстрирует, как сгенерировать HDL-код для программируемого КИХ-фильтра. Можно программировать фильтр к желаемому ответу путем загрузки коэффициентов во внутренние регистры с помощью интерфейса хоста.
В этом примере мы реализуем банк фильтров, каждый имеющий различные ответы, на чипе. Если все фильтры имеют КИХ-структуру прямой формы и ту же длину, то мы можем использовать интерфейс хоста, чтобы загрузить коэффициенты для каждого ответа на регистровый файл при необходимости.
Этот проект добавляет задержку нескольких циклов, прежде чем входные выборки смогут быть обработаны с загруженными коэффициентами. Однако это имеет преимущество, что то же оборудование фильтра может быть запрограммировано с новыми коэффициентами, чтобы получить различный ответ фильтра. Это сохраняет область чипа, когда в противном случае каждый фильтр был бы реализован отдельно на чипе.
У вас должна быть лицензия HDL Coder™, чтобы запустить этот пример.
Введите следующие команды, чтобы открыть модель в качестве примера:
modelname = 'dspprogfirhdl';
open_system(modelname);
Рассмотрите два КИХ-фильтра, один с lowpass ответом и другим с highpass ответом. Коэффициенты могут быть заданы с Функцией обратного вызова Model Properties InitFcn.
Программируемый КИХ через блок Registers загружает lowpass коэффициенты от Поведенческой модели Хоста и обрабатывает входные выборки щебета сначала. Затем блок загружает highpass коэффициенты и обрабатывает те же выборки щебета снова.
Введите следующие команды, чтобы открыть Программируемого КИХ через блок Registers:
systemname = [modelname '/Programmable FIR via Registers'];
open_system(systemname);
Блок coeffs_registers загружает коэффициенты во внутренние регистры, когда сигнал 'write_enable' высок. Следующие теневые регистры обновляются от содействующих регистров, когда сигнал 'write_done' высок. Это включает одновременную загрузку и обработку данных сущностью фильтра. В этом примере мы применяем полностью параллельную реализацию архитектуры к блоку Discrete FIR Filter. Можно также выбрать последовательную архитектуру из меню HDL Block Properties.
Заметьте, что блоки загружают второй набор коэффициентов и обрабатывают последние несколько входных выборок одновременно.
Введите следующую команду, чтобы запустить модель в качестве примера:
sim(modelname);
Введите следующую команду, чтобы открыть осциллограф:
open_system([modelname '/Scope']);
Сравните DUT (Проект под Тестом) вывод со ссылочным выводом.
Введите следующую команду, чтобы закрыть осциллограф:
close_system([modelname '/Scope']);
Можно также просмотреть сигналы в Logic Analyzer. Logic Analyzer позволяет вам просмотреть несколько сигналов в одном окне. Это также дает возможность определять переходы в сигналах.
Сигналы интереса - входные коэффициенты, запишите адрес, разрешение записи, запишите сделанный, просочитесь, отфильтруйте, ссылка и ошибка были переданы потоком для визуализации.
Запустите Logic Analyzer от панели инструментов модели.
Отображением Logic Analyzer можно также управлять на основе на делитель или на волну. Чтобы изменить отдельную волну или делитель, выберите волну или делитель и затем нажмите на вкладку "Wave". Полезный режим визуализации в Logic Analyzer является Аналоговым форматом.
Для получения дополнительной информации о Logic Analyzer обратитесь к документации Logic Analyzer.
Получите уникальное временное имя каталога для сгенерированных файлов
workingdir = tempname;
Чтобы проверять, существуют ли какие-либо проблемы с моделью для генерации HDL-кода, не генерируя HDL-код, можно запустить следующую команду:
checkhdl(systemname,'TargetDirectory',workingdir);
Введите следующую команду, чтобы сгенерировать HDL-код:
makehdl(systemname,'TargetDirectory',workingdir);
### Generating HDL for 'dspprogfirhdl/Programmable FIR via Registers'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('dspprogfirhdl', { 'HDL Code Generation' } )">dspprogfirhdl</a> for HDL code generation parameters. ### Starting HDL check. ### Begin VHDL Code Generation for 'dspprogfirhdl'. ### Working on dspprogfirhdl/Programmable FIR via Registers/coeffs_registers as /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/coeffs_registers.vhd. ### Working on dspprogfirhdl/Programmable FIR via Registers/Discrete FIR Filter as /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Discrete_FIR_Filter.vhd. ### Working on dspprogfirhdl/Programmable FIR via Registers as /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Programmable_FIR_via_Registers.vhd. ### Generating package file /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Programmable_FIR_via_Registers_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Programmable_FIR_via_Registers_report.html ### HDL check for 'dspprogfirhdl' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Введите следующую команду, чтобы сгенерировать испытательный стенд:
makehdltb(systemname,'TargetDirectory',workingdir);
### Begin TestBench generation. ### Generating HDL TestBench for 'dspprogfirhdl/Programmable FIR via Registers'. ### Begin simulation of the model 'gm_dspprogfirhdl'... ### Collecting data... ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/coeffs_in.dat. ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/write_address.dat. ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/write_enable.dat. ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/write_done.dat. ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/filter_in.dat. ### Generating test bench data file: /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/filter_out_expected.dat. ### Working on Programmable_FIR_via_Registers_tb as /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Programmable_FIR_via_Registers_tb.vhd. ### Generating package file /tmp/BR2019ad_1035872_198992/publish_examples6/tpfeb662a5_cb17_4c5e_a2fc_e94f96ab31bf/dspprogfirhdl/Programmable_FIR_via_Registers_tb_pkg.vhd. ### HDL TestBench generation complete.
Следующие данные показывают симулятор HDL ModelSim после выполнения сгенерированных .do скриптов файла для испытательного стенда. Сравните результат ModelSim с результатом Simulink, как построено прежде.
Это заканчивает Сгенерировать HDL-код для Программируемого КИХ-примера Фильтра.