Использование рабочего процесса генерации IP-ядра от MATLAB: LED Blinking

В этом примере показано, как использовать MATLAB ® HDL Workflow Advisor для генерации пользовательского IP-ядра HDL, которое мигает светодиодами на плате FPGA. Сгенерированное IP-ядро может использоваться на платформе Xilinx ® Zynq ® или на любом процессоре Xilinx FPGA с процессором MicroBlaze.

Введение

Можно использовать MATLAB, чтобы проектировать, моделировать и проверять свое приложение, выполнять сценарии what-if с алгоритмами и оптимизировать параметры. Затем можно подготовить проект для аппаратной и программной реализации на Zynq-7000 AP SoC, определив, какие системные элементы будут выполняться программируемой логикой и какие системные элементы будут работать на Cortex-A9 ARM ®.

Используя управляемый рабочий процесс, показанный в этом примере, можно автоматически сгенерировать код VHDL ® для программируемой логики с помощью HDL- Coder™, экспортировать аппаратную информацию из автоматически сгенерированного проекта EDK в проект SDK для интегрирования рукописного кода С для процессора ARM и реализовать дизайн на платформе Xilinx Zynq.

Этот пример является пошаговым руководством, которое помогает познакомить вас с рабочим процессом совместного проектирования HW/SW. В этом рабочем процессе вы выполняете следующие шаги:

  1. Настройте оборудование и инструменты Zynq.

  2. Разделите ваш проект на аппаратные и программные реализации.

  3. Сгенерируйте ядро IP HDL с помощью MATLAB HDL Workflow Advisor.

  4. Интеграция IP-ядра с проектом Xilinx EDK и программирование оборудования Zynq.

Для получения дополнительной информации см. другие более расширенные примеры и документацию HDL Coder.

Требования

  1. Xilinx ISE 14.4

  2. Набор оценки Zynq-7000 Xilinx SoC ZC702 под управлением изображения Linux ® в Base Targeted Reference Design 14.4

  3. HDL Coder поддержки платформы Xilinx Zynq

Настройка оборудования и инструментов Zynq

1. Настройте комплект для оценки ZC702 Xilinx Zynq. Следуйте шагам настройки оборудования в примере HDL Coder «Начало работы с совместным проектированием HW/SW для платформы Xilinx Zynq».

2. Настройте путь инструмента синтеза Xilinx ISE с помощью следующей команды в командном окне MATLAB. Используйте свой собственный путь установки ISE при запуске команды.

hdlsetuptoolpath('ToolName', 'Xilinx ISE', 'ToolPath', 'C:\Xilinx\14.4\ISE_DS\ISE\bin\nt64\ise.exe');

Разделите ваш проект на оборудование и программную реализацию

Первый шаг рабочего процесса совместного проектирования Zynq HW/SW - решить, какие части вашего проекта реализовать на программируемой логике, а какие - на процессоре ARM.

Сгруппируйте части своего алгоритма, которые вы хотите реализовать по программируемой логике, в функцию MATLAB. Эта функция является контуром вашего аппаратного/программного раздела. Весь код MATLAB в рамках этой функции будет реализован на программируемой логике. Вы должны предоставить код С, который реализует код MATLAB вне этой функции, чтобы работать на процессоре ARM.

В этом примере функциональная 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. Выходной порт аппаратной подсистемы, светодиодный, соединяется с оборудованием светодиодного индикатора. Порт выхода, 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

Setup для примера

Следующие команды копируют необходимые файлы примера во временную папку.

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);

Создайте новый HDL Coder проект

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 Coder см. в разделе «Начало работы с MATLAB в HDL».

Выберите цель генерации кода

Использование рабочего процесса генерации ядра IP в HDL Workflow Advisor позволяет автоматически сгенерировать резкий и переиспользуемый модуль ядра IP из функции MATLAB. Сгенерированное IP-ядро предназначено для подключения к встраиваемому процессору на устройстве FPGA. HDL Coder генерирует HDL-код из функции проекта MATLAB, а также генерирует HDL-код для логики AXI-интерфейса, соединяющего IP-ядро со встраиваемым процессором. HDL Coder упаковывает все сгенерированные файлы в IP-папку ядра. Затем можно интегрировать сгенерированное IP-ядро с большим встроенным проектом FPGA в окружение Xilinx EDK.

Чтобы выбрать рабочий процесс генерации ядра IP, выполните следующие действия.

1. Откройте HDL Workflow Advisor и щелкните правой кнопкой мыши Select Code Generation Target.

2. Для рабочего процесса выберите IP Core Generation.

Выбор платформы

В выборе платформы имеется типовая опция Generic Xilinx Platform. Эта опция не зависит от платы и генерирует типовое IP-ядро Xilinx, которое должно быть вручную интегрировано в окружение EDK.

Остальные опции зависят от платы и обеспечивают дополнительные возможности интеграции сгенерированного IP-ядра в проект Xilinx PlanAhead, синтезируют проект и загружают битовый поток в FPGA в HDL Workflow Advisor.

Для параметра Platform выберите Xilinx Zynq ZC702 комплект для оценки. Если у вас нет этой опции, выберите Получить больше, чтобы открыть программу установки пакета поддержки. Для завершения установки выберите Xilinx Zynq Platform и следуйте инструкциям установщика пакета поддержки.

Преобразуйте проект в фиксированную точку

1. Щелкните правой кнопкой мыши задачу Задать входные типы и выберите Запустить эту задачу.

2. В задаче преобразования фиксированных точек нажмите 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.

Сгенерируйте ядро IP

Щелкните правой кнопкой мыши шаг генерации HDL-кода и выберите Запустить эту задачу, чтобы сгенерировать ядро IP вместе с отчетом о ядре IP.

Интеграция IP-ядра со окружением Xilinx EDK

В этой части рабочего процесса вы вставляете сгенерированное IP-ядро в встраиваемую систему исходного проекта, генерируете битовый поток FPGA и загружаете битовый поток на оборудование Zynq.

Этот исходный проект является предопределенным проектом Xilinx EDK. Он содержит все элементы, необходимые программному обеспечению Xilinx для развертывания вашего проекта на платформе Zynq, за исключением пользовательского IP-ядра и встроенного ПО.

1. Для интеграции со окружением Xilinx EDK щелкните правой кнопкой мыши шаг Create Project в разделе 'Встраиваемая Система Integration' и выберите опцию 'Run This Task'. Создается проект Xilinx PlanAhead со встроенным дизайном EDK, и в диалоговом окне предоставляется ссылка на проект. Вы можете опционально открыть проект, чтобы взглянуть.

2. Создайте битовый поток FPGA на шаге Build Embedded System. Убедитесь, что опция 'Запуска build process external' проверена, поэтому инструмент синтеза Xilinx будет запускаться в отдельном процессе от MATLAB. Дождитесь завершения выполнения процесса инструмента синтеза во внешнем командном окне.

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

После того, как вы программируете оборудование FPGA, светодиод начинает мигать на вашей плате Zynq.

Далее вы интегрируете включенный рукописный код С для запуска на процессоре ARM, чтобы контролировать частоту и направление мигания светодиода.

Запуск программного обеспечения на оборудовании Zynq ZC702

Включенные файлы кода С, 'mlhdlc _ ip _ core _ led _ blinking _ driver.c' и 'mlhdlc _ ip _ core _ led _ blinking _ driver.h, реализуют простое меню, которое позволяет вам задать частоту и направление мигания светодиода. Вы можете использовать их для своего проекта SDK на базе Linux.

Инструкции по интеграции включенных Кодов С в проект 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');