В этом примере показано, как использовать MATLAB ® HDL Workflow Advisor для создания пользовательского IP-ядра HDL, которое мигает светодиодами на плате FPGA. Сгенерированное IP-ядро можно использовать на платформе Xilinx ® Zynq ® или на любом процессоре Xilinx FPGA с процессором MicroBlaze.
MATLAB можно использовать для проектирования, моделирования и проверки приложения, выполнения сценариев «что если» с помощью алгоритмов и оптимизации параметров. Затем вы можете подготовить проект для внедрения аппаратного и программного обеспечения на SoC Zynq-7000 AP, решив, какие системные элементы будут выполняться программируемой логикой и какие системные элементы будут выполняться на Cortex-A9 ARM ®.
Используя управляемый рабочий процесс, показанный в этом примере, можно автоматически генерировать код VHDL ® для программируемой логики с помощью HDL Coder™, экспортировать аппаратную информацию из автоматически генерируемого проекта EDK в проект SDK для интеграции рукописного кода C для процессора ARM и реализовать проект на платформе Xilinx Zynq.
Этот пример представляет собой пошаговое руководство, помогающее ознакомиться с потоком операций совместного проектирования аппаратных средств/ПО. В этом рабочем процессе выполняются следующие шаги.
Настройте оборудование и инструменты Zynq.
Разбейте дизайн на разделы для внедрения аппаратного и программного обеспечения.
Создайте ядро IP HDL с помощью MATLAB HDL Workflow Advisor.
Интеграция ядра IP в проект Xilinx EDK и программирование оборудования Zynq.
Для получения дополнительной информации см. другие дополнительные примеры и документацию по кодеру HDL.
Xilinx ISE 14.4
Оценочный комплект Xilinx Zynq-7000 SoC ZC702 под управлением образа Linux ® в базовом целевом эталонном проекте 14.4
Пакет поддержки кодера HDL для платформы Xilinx Zynq
1. Настройте оценочный комплект Xilinx Zynq ZC702. Выполните шаги по настройке оборудования в примере кодера HDL «Начало работы с рабочим процессом совместного проектирования аппаратных средств/ПО для платформы Xilinx Zynq».
2. Настройте траекторию инструмента синтеза Xilinx ISE с помощью следующей команды в окне команды MATLAB. При выполнении команды используйте собственный путь установки ISE.
hdlsetuptoolpath('ToolName', 'Xilinx ISE', 'ToolPath', 'C:\Xilinx\14.4\ISE_DS\ISE\bin\nt64\ise.exe');Первый шаг процесса совместного проектирования HW/SW Zynq состоит в том, чтобы определить, какие части проекта должны быть реализованы на программируемой логике, а какие - на процессоре ARM.
Сгруппируйте части алгоритма, которые требуется реализовать на программируемой логике, в функцию MATLAB. Эта функция является границей раздела оборудования/программного обеспечения. Весь код MATLAB в рамках этой функции будет реализован на программируемой логике. Для запуска на ARM-процессоре необходимо указать код C, реализующий код MATLAB вне этой функции.
В этом примере функция mlhdlc_ip_core_led_blinking реализована на аппаратных средствах. Он моделирует счетчик, мигающий светодиодными индикаторами на плате FPGA. Два входных порта, Blink_frequency и Blink_direction, являются управляющими портами, которые определяют частоту и направление мигания светодиода. Можно настроить входные значения аппаратной подсистемы с помощью опций запроса во встроенном программном обеспечении, «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.
Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с процессом MATLAB в HDL.
Использование рабочего процесса создания IP-ядра в помощнике по рабочим процессам HDL позволяет автоматически создавать совместно используемый и многократно используемый модуль IP-ядра из функции MATLAB. Сформированное ядро IP предназначено для подключения к встроенному процессору на устройстве FPGA. Кодер HDL генерирует код HDL из функции проектирования MATLAB, а также генерирует код HDL для логики интерфейса AXI, соединяющей ядро IP со встроенным процессором. Кодер HDL упаковывает все сгенерированные файлы в основную папку IP. Затем созданное ядро IP можно интегрировать с более масштабной встроенной конструкцией FPGA в среде Xilinx EDK.
Чтобы выбрать рабочий процесс генерации IP-ядра:
1. Откройте помощник по рабочим процессам HDL и щелкните правой кнопкой мыши Выбрать цель создания кода.
2. В поле Workflow выберите IP Core Generation.

При выборе платформы используется опция Generic Xilinx Platform. Эта опция не зависит от платы и генерирует универсальное ядро Xilinx IP, которое должно быть вручную интегрировано в среду EDK.
Остальные опции зависят от платы и обеспечивают дополнительную возможность интеграции сгенерированного IP-ядра в проект Xilinx PlanAhead, синтеза проекта и загрузки битового потока в FPGA в рамках HDL Workflow Advisor.
В поле «Платформа» выберите набор для оценки Xilinx Zynq ZC702. Если у вас нет этого параметра, выберите Получить дополнительные сведения, чтобы открыть программу установки пакета поддержки. В установщике пакета поддержки выберите платформу Xilinx Zynq и следуйте инструкциям установщика пакета поддержки для завершения установки.
1. Щелкните правой кнопкой мыши задачу Определение типов ввода и выберите Выполнить эту задачу.
2. В задаче Преобразование фиксированной точки (Fixed-Point Conversion) нажмите кнопку Дополнительно (Advanced) и установите для параметра Запас прочности для sim min/max (%) значение 0.
3. Задайте предлагаемый тип переменной freqCounter как беззнаковое 24-битовое целое число, введя числовой тип (0, 24, 0) в столбец «Предлагаемый тип».

4. Слева щелкните правой кнопкой мыши на задаче «Преобразование фиксированных точек» и выберите «Выполнить эту задачу».
Сопоставьте каждый порт в функции проектирования MATLAB с одним из основных IP-интерфейсов в подзадаче Set Target Interface.
В этом примере входные порты Blink_frequency и Blink_direction сопоставляются с интерфейсом AXI4-Lite, поэтому HDL Coder™ генерирует для них регистры, доступные интерфейсу AXI. Выходной порт светодиодного индикатора отображается на внешний интерфейс, светодиодные индикаторы общего назначения [0:7], который подключается к аппаратным средствам светодиодного индикатора на плате Zynq.

Щелкните правой кнопкой мыши шаг Создание кода HDL и выберите Выполнить эту задачу, чтобы создать ядро IP вместе с отчетом ядра IP.
В этой части рабочего процесса генерируемое ядро IP вставляется в эталонную конструкцию встраиваемой системы, генерируется битовый поток FPGA и загружается на оборудование Zynq.
Эталонная конструкция представляет собой предопределенный проект Xilinx EDK. Он содержит все элементы, необходимые программному обеспечению Xilinx для развертывания проекта на платформе Zynq, за исключением пользовательского IP-ядра и встроенного программного обеспечения.
1. Для интеграции с средой Xilinx EDK щелкните правой кнопкой мыши на шаге Create Project в разделе Embedded System Integration и выберите опцию Run This Task. Создается проект Xilinx PlanAhead со встроенным дизайном EDK, а в диалоговом окне предоставляется ссылка на проект. При необходимости можно открыть проект для просмотра.

2. Создайте битовый поток FPGA на шаге Сборка встроенной системы. Убедитесь, что установлен флажок «Run build process externally», поэтому средство синтеза Xilinx будет работать в отдельном процессе от MATLAB. Дождитесь завершения процесса средства синтеза во внешнем окне команд.

3. После создания битового потока щелкните правой кнопкой мыши на шаге «Program Target Device» и выберите опцию «Run This Task» для программирования оборудования Zynq.

После программирования аппаратных средств FPGA на плате Zynq начинает мигать светодиодный индикатор.
Далее будет интегрирован включенный рукописный код C для запуска на ARM-процессоре для управления частотой и направлением мигания светодиода.
Включенные файлы кода C, «mlhdlc _ ip _ core _ led _ blinking _ driver.c» и «mlhdlc _ ip _ core _ led _ blinking _ driver.h», реализуют простое меню, позволяющее задать частоту и направление мигания светодиодов. Их можно использовать для проекта SDK на базе Linux.

Инструкции по интеграции кода C в проект 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');