Этот пример показывает вам, как проверить цифровой проект повышающего преобразователя, сгенерированный с Filter Design HDL Coder™ с помощью FPGA в симуляции цикла.
Продукты потребовали для этого примера:
MATLAB
Simulink
HDL Verifier
Fixed-Point Designer
Signal Processing Toolbox
DSP System Toolbox
(Дополнительный) Filter Design HDL Coder
Программное обеспечение проекта FPGA
Одна из поддерживаемых макетных плат FPGA и аксессуаров (плата ML403 не поддержана для этого примера),
Для связи с помощью Ethernet: Гигабитный Адаптер Ethernet установил на хосте - компьютере, Гигабитный Ethernet перекрестно соединяют кабель
Для связи с помощью JTAG: кабель JTAG с Бластером USB I или II, драйвер Бластера USB
Для связи с помощью PCI Express®: плата FPGA установлена в слот PCI Express хоста - компьютера.
Цифровой повышающий преобразователь (DUC) является цифровой схемой, которая преобразовывает цифровой основополосный сигнал в сигнал полосы пропускания. DUC состоит из трех этапов фильтрации; каждый этап фильтрует входной сигнал с lowpass, интерполирующим фильтр, сопровождаемый изменением частоты дискретизации. В этом примере DUC является каскадом двух КИХ-фильтров интерполяции и фильтра интерполяции CIC, как описано в Цифровом повышающем преобразователе (DUC) HDL в качестве примера.
1. Создайте двух КИХ и CIC-фильтры.
pfir = [0.0007 0.0021 -0.0002 -0.0025 -0.0027 0.0013 0.0049 0.0032 ... -0.0034 -0.0074 -0.0031 0.0060 0.0099 0.0029 -0.0089 -0.0129 ... -0.0032 0.0124 0.0177 0.0040 -0.0182 -0.0255 -0.0047 0.0287 ... 0.0390 0.0049 -0.0509 -0.0699 -0.0046 0.1349 0.2776 0.3378 ... 0.2776 0.1349 -0.0046 -0.0699 -0.0509 0.0049 0.0390 0.0287 ... -0.0047 -0.0255 -0.0182 0.0040 0.0177 0.0124 -0.0032 -0.0129 ... -0.0089 0.0029 0.0099 0.0060 -0.0031 -0.0074 -0.0034 0.0032 ... 0.0049 0.0013 -0.0027 -0.0025 -0.0002 0.0021 0.0007 ]; hpfir = dsp.FIRInterpolator(2, pfir); hpfir.FullPrecisionOverride = false; hpfir.CoefficientsDataType = 'Custom'; hpfir.CustomCoefficientsDataType = numerictype([],16); hpfir.ProductDataType = 'Custom'; hpfir.CustomProductDataType = numerictype([],31,31); hpfir.AccumulatorDataType = 'Custom'; hpfir.CustomAccumulatorDataType = numerictype([],16,15); hpfir.OutputDataType = 'Custom'; hpfir.CustomOutputDataType = numerictype([],16,15); hpfir.RoundingMethod = 'Nearest'; cfir = [-0.0007 -0.0009 0.0039 0.0120 0.0063 -0.0267 -0.0592 -0.0237 ... 0.1147 0.2895 0.3701 0.2895 0.1147 -0.0237 -0.0592 -0.0267 ... 0.0063 0.0120 0.0039 -0.0009 -0.0007]; hcfir = dsp.FIRInterpolator(2, cfir); hcfir.FullPrecisionOverride = false; hcfir.CoefficientsDataType = 'Custom'; hcfir.CustomCoefficientsDataType = numerictype([],16); hcfir.ProductDataType = 'Custom'; hcfir.CustomProductDataType = numerictype([],31,31); hcfir.AccumulatorDataType = 'Custom'; hcfir.CustomAccumulatorDataType = numerictype([],16,15); hcfir.OutputDataType = 'Custom'; hcfir.CustomOutputDataType = numerictype([],16,15); hcfir.RoundingMethod = 'Nearest'; hcic = dsp.CICInterpolator(32, 1, 5); hcic.FixedPointDataType = 'Minimum section word lengths'; hcic.OutputWordLength = 20;
2. Создайте каскадный фильтр с помощью этих фильтров.
hduc = dsp.FilterCascade(hpfir, hcfir, hcic);
Частотную характеристику каскадного фильтра показывают в следующей фигуре.
fvtool(hduc,'Arithmetic','fixed');
Когда каскадный фильтр будет готов, сгенерируйте HDL-код для DUC с помощью функции Filter Design HDL Coder generatehdl
с набором свойства 'AddPipelineRegisters' к 'on'.
>> generatehdl(hduc, 'Name', 'hdlduc', 'AddPipelineRegisters', 'on', 'InputDataType', numerictype(1,16,15));
Эта опция вставляет конвейерные регистры между этапами фильтра и позволяет сгенерированному фильтру синтезироваться на более высокой частоте часов.
Если у вас нет Filter Design HDL Coder, можно скопировать предварительно сгенерированные файлы HDL в текущий каталог с помощью этой команды:
>> copyFILDemoFiles('duc');
Перед использованием FPGA в цикле убедитесь, что ваша системная среда настраивается правильно для доступа к программному обеспечению проекта FPGA. Можно использовать функцию hdlsetuptoolpath, чтобы добавить программное обеспечение проекта FPGA в системный путь для текущего сеанса работы с MATLAB.
Мастер FIL ведет вас в конфигурировании настроек, необходимых для создания FPGA в цикле. Запустите мастер со следующей командой:
>> filWizard
1. В Аппаратных Опциях выберите макетную плату FPGA, соединенную с вашим хостом - компьютером. При необходимости можно также настроить IP Совета и Мак адрес под Расширенными настройками. Щелкните *Затем", чтобы продолжиться.
2. В Исходных файлах добавьте следующие сгенерированные файлы HDL для DUC к таблице исходного файла с помощью Обзора.
hdlduc.vhd hdlduc_stage1.vhd hdlduc_stage2.vhd hdlduc_stage3.vhd
Установите флажок верхнего уровня рядом с hdlduc.vhd
. Щелкните *Затем", чтобы продолжиться.
3. В Портах ввода-вывода DUT информация порта ввода и вывода, таких как имя порта, направление, ширина и тип порта автоматически сгенерирована из файла HDL. Типы порта, такие как Часы и Данные, сгенерированы на основе имен порта; можно изменить выбор по мере необходимости. В данном примере сгенерированные типы порта правильны, и можно нажать Далее.
4. В Опциях Сборки задайте папку для выходных файлов FIL. Можно использовать значение по умолчанию для этого примера. Нажмите Build. Нажатие на Build заставляет Мастер FIL генерировать все необходимые файлы для FPGA в симуляции цикла и выполнять следующие действия:
Генерирует блок FIL в новой модели Simulink®
Открывает окно командной строки, чтобы скомпилировать проект FPGA и сгенерировать файл программирования FPGA
Процесс компиляции проекта FPGA занимает несколько минут. Когда процесс закончен, вам предлагают закрыть окно командной строки. Закройте это окно теперь.
Чтобы подготовиться к FPGA в симуляции цикла, выполните шаги ниже, чтобы сконфигурировать блок FIL.
1. Откройте тестовую модель fil_duc_model и скопируйте сгенерированный блок FIL в модель.
2. Дважды кликните блок FIL, чтобы открыть маску блока. Нажмите Load, чтобы программировать FPGA со сгенерированным файлом программирования.
3. В соответствии с Опциями Во время выполнения, фактором Разгона изменения к 128. Это указывает, что входное значение выбирается 128 раз часами FPGA перед входным значением изменений.
4. На маске блока FIL нажмите на вкладку Signal Attributes. Измените тип данных для filter_out к fixdt(1,20,-1)
, чтобы совпадать с типом данных поведенческого блока фильтра.
5. Нажмите ОК, чтобы закрыть маску блока.
В этом примере сгенерированный фильтр, работающий на FPGA, сравнивается с поведенческим блоком фильтра. Задержки добавляются к выводу поведенческого фильтра, чтобы совпадать с задержкой HDL сгенерированного фильтра.
Запустите симуляцию. Наблюдайте выходные формы волны от поведенческого блока фильтра, блока FIL и допуска на погрешность. Поскольку поведенческий блок фильтра не имеет конвейерных регистров, существуют небольшие различия между поведенческим блоком фильтра вывод и блоком FIL вывод. Эти ошибки в допуске на погрешность.
Это завершает пример.