В этом примере показано, как использовать MATLAB® HDL Workflow Advisor, чтобы сгенерировать пользовательское ядро IP HDL, которое мигает светодиодами на плате FPGA. Можно использовать сгенерированный IP на платформе Xilinx® Zynq® или на любом FPGA Xilinx с процессором MicroBlaze.
Можно использовать MATLAB, чтобы спроектировать, симулировать, и проверить приложение, выполнить то, что - если сценарии с алгоритмами, и оптимизируют параметры. Можно затем подготовить проектирование приложений к аппаратной и программной реализации на Zynq-7000 AP SoC путем решения, какие системные элементы выполняются программируемой логикой и какие системные элементы работают на Cortex-A9 ARM®.
Используя ведомый рабочий процесс, показанный в этом примере, вы можете: * Автоматически сгенерируйте код VHDL® для программируемой логики с помощью HDL Coder™. * Экспортируйте информацию об оборудовании от автоматически сгенерированного проекта EDK до проекта SDK для интегрирования рукописного кода С для процессора ARM. Я * Реализация проект на Платформе Xilinx Zynq.
Этим примером является пошаговое руководство, которое вводит вас аппаратному и программному рабочему процессу элемента кода. В этом рабочем процессе вы выполняете эти задачи:
Настройте свое оборудование Zynq и инструменты.
Разделите свой проект для аппаратной и программной реализации.
Сгенерируйте ядро IP HDL при помощи HDL Workflow Advisor MATLAB.
Интегрируйте ядро IP в проект EDK Xilinx и программируйте оборудование Zynq.
Xilinx ISE 14.4
Оценочный комплект Xilinx Zynq-7000 SoC ZC702, запускающий Linux®, отображает в Основном Целенаправленном Исходном проекте 14.4
Пакет поддержки HDL Coder для платформы Xilinx Zynq
1. Настройте оценочный комплект Xilinx Zynq ZC702. Выполните шаги настройки оборудования в примере HDL Coder, "Начинающем с Рабочим процессом Элемента кода HW/SW для Платформы Xilinx Zynq".
2. Настройте инструмент path синтеза ISE Xilinx. В командном окне MATLAB используют эту команду. Используйте свой собственный путь к установке ISE, когда вы запустите команду.
hdlsetuptoolpath('ToolName', 'Xilinx ISE', 'ToolPath', 'C:\Xilinx\14.4\ISE_DS\ISE\bin\nt64\ise.exe');
Необходимо решить который части проекта реализовать на программируемой логике и который части работать на процессоре ARM.
Сгруппируйте части своего алгоритма, который вы хотите реализовать на программируемой логике в функцию MATLAB. Эта функция является контуром вашего раздела оборудования/программного обеспечения. Весь код MATLAB в этой функции реализован на программируемой логике. Необходимо обеспечить код С, который реализует код MATLAB вне этой функции, чтобы работать на процессоре ARM.
В этом примере функция mlhdlc_ip_core_led_blinking реализована на оборудовании. Это моделирует счетчик, который мигает светодиодами на плате FPGA. Два входных порта, Blink_frequency и Blink_direction, являются портами управления, которые определяют частоту мигания LED и направление. Можно настроить входные значения аппаратной подсистемы через быстрые опции во включенном встроенном программном обеспечении, mlhdlc_ip_core_led_blinking_driver.c и mlhdlc_ip_core_led_blinking_driver.h. Встроенное программное обеспечение, которое работает на процессоре ARM, управляет сгенерированным ядром IP путем записи в интерфейс AXI доступных регистров. Выходной порт аппаратной подсистемы, LED, связывает с оборудованием LED. Можно использовать выходной порт, Read_Back, чтобы считать данные назад в процессор.
design_name = 'mlhdlc_ip_core_led_blinking'; testbench_name = 'mlhdlc_ip_core_led_blinking_tb'; sw_driver_name = 'mlhdlc_ip_core_led_blinking_driver.c'; sw_driver_header_name = 'mlhdlc_ip_core_led_blinking_driver.h';
Рассмотрите проект MATLAB.
type(design_name);
function [LED, Read_back] = mlhdlc_ip_core_led_blinking(Blink_frequency, Blink_direction) % % Copyright 2013-2015 The MathWorks, Inc. persistent freqCounter LEDCounter if isempty(freqCounter) freqCounter = 0; LEDCounter = 255; end if Blink_frequency <= 0 Blink_frequency = 0; elseif Blink_frequency >= 15 Blink_frequency = 15; end blinkFrequencyOut = LookupTable(Blink_frequency); if blinkFrequencyOut == freqCounter freqMatch = 1; else freqMatch = 0; end freqCounter = freqCounter + 1; if freqMatch freqCounter = 0; end if Blink_direction LED = 255 - LEDCounter; else LED = LEDCounter; end if LEDCounter == 255 LEDCounter = 0; elseif freqMatch LEDCounter = LEDCounter + 1; end Read_back = LED; end function y = LookupTable(idx) s = 2.^(23:-1:8)'; y = s(idx+1); end
type(testbench_name);
% % Copyright 2013-2015 The MathWorks, Inc. for i=1:16 [yout, ~] = mlhdlc_ip_core_led_blinking(i-1, 0); [yout2, ~] = mlhdlc_ip_core_led_blinking(i-1, 1); end
Скопируйте файлы в качестве примера во временную папку.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_ip_core_led_blinking']; % Create a temporary folder and copy the MATLAB files. cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); % Copy the design files to the temporary directory copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, sw_driver_name), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, sw_driver_header_name), mlhdlc_temp_dir);
coder -hdlcoder -new mlhdlc_ip_core_led_blinking_prj
Добавьте файл mlhdlc_ip_core_led_blinking.m в проект как функция MATLAB и mlhdlc_ip_core_led_blinking_tb.m как Испытательный стенд MATLAB.
Для более полного примера при создании и заполнении проектов HDL Coder MATLAB, смотрите Начало работы с MATLAB к Рабочему процессу HDL.
Используя рабочий процесс Генерации Ядра IP в HDL Workflow Advisor позволяет вам автоматически сгенерировать и допускающий повторное использование модуль ядра IP с обеспечением совместного доступа от функции MATLAB. Сгенерированное ядро IP спроектировано, чтобы быть соединенным со встраиваемым процессором на устройстве FPGA. HDL Coder генерирует HDL-код от функции проекта MATLAB и генерирует HDL-код для логики интерфейса AXI соединение ядра IP к встраиваемому процессору. Пакеты HDL Coder вызывают сгенерированные файлы в папку ядра IP. Можно затем интегрировать сгенерированное ядро IP с большим FPGA встроенный проект в среде EDK Xilinx.
Выбрать рабочий процесс Генерации Ядра IP:
1. Откройте HDL Workflow Advisor и щелкните правой кнопкой по Select Code Generation Target.
2. Для Рабочего процесса выберите IP Core Generation.
Существует типовая опция под названием Типовая Платформа Xilinx в выборе платформы. Эта опция независима от платы и генерирует типовое ядро IP Xilinx, которое должно быть вручную интегрировано в вашу среду EDK.
Остающиеся опции специфичны для платы и предусматривают дополнительную возможность интеграции сгенерированного ядра IP в проект Xilinx PlanAhead, синтезируют проект и загружают поток битов на FPGA в HDL Workflow Advisor.
Для Платформы выберите оценочный комплект Xilinx Zynq ZC702. Если у вас нет этой опции, выберите Get больше, чтобы открыть Инсталлятор Пакета поддержки. В Инсталляторе Пакета поддержки выберите Xilinx Zynq Platform и следуйте инструкциям, чтобы завершить установку.
1. Щелкните правой кнопкой по Входной Define задаче Типов и выберите Run This Task.
2. В задаче Преобразования Фиксированной точки нажмите Advanced и установите Запас прочности в течение sim min (%) / макс. (%) к 0.
3. В Предложенном столбце Типа во вкладке Variables, набор предложенный тип freqCounter переменной до 24-битного целого числа без знака путем ввода numerictype (0, 24, 0).
4. Щелкните правой кнопкой по задаче Преобразования Фиксированной точки и выберите Run This Task.
Сопоставьте каждый порт в своей функции проекта MATLAB к одному из целевых интерфейсов ядра IP в Цели Набора Интерфейсная подзадача.
В этом примере входные порты Blink_frequency и Blink_direction сопоставлены с интерфейсом AXI4-Lite, и HDL Coder™ генерирует интерфейс AXI доступные регистры для них. Выходной порт LED сопоставлен с внешним интерфейсом, светодиодная Общая цель [0:7], который связывает с оборудованием LED на плате Zynq.
Чтобы сгенерировать Ядро IP и отчет Ядра IP, щелкните правой кнопкой по генерации HDL-кода, продвигаются и выбирают Run эта задача.
Вставьте свое сгенерированное ядро IP в исходный проект встраиваемой системы, сгенерируйте поток битов FPGA и загрузите поток битов на оборудование Zynq.
Исходным проектом является предопределенный Xilinx проект EDK. Это содержит элементы, программное обеспечение Xilinx должно развернуть ваш проект в платформу Zynq, за исключением пользовательского IP базовое и встроенное программное обеспечение.
1. При Интегрировании Встраиваемой системы щелкните правой кнопкой по Создать шагу Проекта и выберите Run This Task. Проект Xilinx PlanAhead с EDK встроенный проект сгенерирован. Ссылка на проект находится в диалоговом окне.
2. Создайте поток битов FPGA на шаге Встраиваемой системы Сборки. Убедитесь процесс сборки Запуска внешне, опция выбрана. Инструмент синтеза Xilinx запускается в отдельном процессе из MATLAB. Ожидайте процесса инструмента синтеза, чтобы закончить запускаться во внешнем командном окне.
3. После того, как поток битов сгенерирован, щелкните правой кнопкой по Целевому устройству Программы, продвигаются и выбирают Запуск опции Эта Задача программировать оборудование Zynq.
После того, как вы будете программировать оборудование FPGA, LED начинает мигать на вашей плате Zynq.
Затем вы интегрируете включенный рукописный код С, чтобы работать на процессоре ARM, чтобы управлять частотой мигания LED и направлением.
Включенные файлы кода С, mlhdlc_ip_core_led_blinking_driver.c и mlhdlc_ip_core_led_blinking_driver.h, реализуют простое меню, которое позволяет вам установить частоту мигания LED и направление. Можно использовать их для основанного на Linux проекта SDK.
Для получения инструкций по тому, как интегрировать включенный код С в проект SDK и запустить его на оборудовании Zynq ZC702, обращается к документации Xilinx.
Чтобы очистить временную папку проекта, запустите эти команды:
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_ip_core_led_blinking']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');