В этом примере показано, как сопоставить типы данных шины с ведомым интерфейсом AXI4, сгенерируйте ядро IP HDL с интерфейсом AXI4 Master, выполните умножение матриц в ядре IP HDL и запишите выходной результат в память DDR.
В данном примере необходимо было установить следующее программное и аппаратное обеспечение и настроить:
Набор Проекта Xilinx Vivado, с поддерживаемой версией, перечисленной в Поддержке Языка HDL и Поддерживаемых Сторонних программах и Оборудовании
Ультрашкала Xilinx Zynq + оценочный комплект MPSoC ZCU102
Пакет поддержки HDL Coder для платформы Xilinx Zynq
Пакет поддержки HDL Verifier для Советов FPGA Xilinx
В этом примере, вас:
Создайте элемент шины при помощи блоков создателя шины и сопоставьте элемент шины с ведомым интерфейсом AXI4.
Сгенерируйте ядро IP HDL с интерфейсом AXI4 Master.
Доступ к большим матрицам из внешней памяти DDR4 по Ультрашкале Xilinx Zynq + плата Оценочного комплекта MPSoC ZCU102 с помощью интерфейса AXI4 Master.
Выполните матричное векторное умножение в ядре IP HDL и запишите выходной результат обратно к памяти DDR с помощью интерфейса AXI4 Master.
Этот пример демонстрирует матричный алгоритм векторного умножения и реализует алгоритм на плате FPGA Xilinx Zynq. Большие матрицы не могут сопоставить эффективно, чтобы Блокировать RAM на матрице FPGA. Вместо этого сохраните матрицы во внешней памяти DDR на плате FPGA. Интерфейс AXI4 Master может получить доступ к данным путем передачи с обеспеченными поставщиками ядрами интерфейса памяти IP, которые взаимодействуют через интерфейс с памятью DDR. Эта возможность позволяет вам моделировать алгоритмы, которые включают большую обработку данных, и требует высокопроизводительного доступа DDR, такого как операции над матрицей, алгоритмы компьютерного зрения, и так далее.
Матричный модуль векторного умножения поддерживает матричное векторное умножение фиксированной точки с конфигурируемым матричным размером 2 - 4 000. Размер матрицы является временем выполнения, конфигурируемым через доступный регистр AXI4.
modelname = 'hdlcoder_axi_slave_bus_data_type'; open_system(modelname); % % Use HDL Coder to generate a custom IP core that performs large matrix % operations on FPGAs by using external memory. In MATLAB, type: % hdladvisor('hdlcoder_axi_slave_bus_data_type/DUT')
Используйте блок создателя шины, чтобы объединить Matrix_Multiplication_On
MatrixSize
, и Burst_Length
в элемент типа данных шины. Для получения дополнительной информации о блоке создателя шины смотрите Создателя Шины
open_system('hdlcoder_axi_slave_bus_data_type/InputSubsystem') %
Можно симулировать эту модель в качестве примера и проверить результат симуляции путем выполнения этого скрипта в MATLAB:
hdlcoder_axi_slave_bus_data_type_simulation;
Этот скрипт сначала инициализирует параметры как Matrix_Size
. По умолчанию, Matrix_Size
64, что означает 64 64 матрица. Matrix_Size
по умолчанию сохранен маленьким для более быстрой симуляции. После того, как DUT реализован на плату FPGA, больший
Matrix_Size
используется, когда вычисление FPGA намного быстрее. Можно также настроить эти параметры в скрипте.
Скрипт затем симулирует модель и проверяет результат путем сравнения регистрируемого результата симуляции с ожидаемым значением.
По умолчанию Matrix_Multiplication_On верен. Скрипт проверяет матричный результат векторного умножения.
Когда Matrix_Multiplication_On является ложным, скрипт проверяет цикл назад режим, что означает, что DUT читают Burst_Length
объем данных от DDR, и затем записал данные обратно к DDR.
Затем мы запускаем HDL Workflow Advisor и используем рабочий процесс Генерации Ядра IP, чтобы развернуть DUT на оборудовании Zynq. Для более подробного пошагового руководства обратитесь к Началу работы с Предназначением для примера Платформы Xilinx Zynq.
1. Настройте инструмент path синтеза Xilinx Vivado. Используйте свой собственный путь к установке Vivado, когда вы запустите команду. В Командном Окне MATLAB введите: hdlsetuptoolpath ('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.1\bin\vivado.bat')
2. Запустите HDL Workflow Advisor с подсистемы DUT hdlcoder_axi_slave_bus_data_type/DUT
. Целевые интерфейсные настройки сохранены на модели. Целевым рабочим процессом является IP Core Generation
, и Целевой платформой является Xilinx Zynq Ultrascale+ MPSoC ZCU102 Evaluation Kit
. Исходным проектом является Default System with External DDR4 memory access
и табличные настройки интерфейса Целевой платформы как показано
В этом примере, портах типа данных шины как matrix_info
и входные порты параметра как burst_from_ddr
и burst start
сопоставлены с AXI4
интерфейс. HDL Coder генерирует интерфейс AXI4 доступные регистры для этих портов. Позже, можно использовать MATLAB, чтобы настроить эти параметры во время выполнения, когда проект работает на плате FPGA.
Можно задать начальные значения типа данных шины в таблице интерфейса Целевой платформы путем определения или начальных значений непосредственно или путем создания переменной, чтобы сохранить начальные значения в типе данных struct и затем использования имени переменной в Интерфейсном Окне настроек. Чтобы задать начальное значение, нажмите Options
в соответствии с Интерфейсным столбцом Опций в Целевой платформе соединяют интерфейсом с таблицей.
Задайте начальные значения непосредственно в Интерфейсном Окне настроек.
Сохранить начальные значения типа данных шины в переменной под названием businit
, запустите этот код:
businit = struct('matrix_mul_on',Matrix_Multiplication_On,'matrix_size',Matrix_Size,'burst_len',Burst_Length)
Задавать businit
переменная в Интерфейсном Окне настроек.
Интерфейс AXI4 Master имеет отдельное чтение и каналы записи. Порты канала чтения как axim_rd_data
, axim_rd_s2m
, axim_rd_m2s
сопоставлены с AXI4 Master Read
интерфейс. Порты канала записи как axim_wr_data
, axim_wr_s2m
, axim_wr_m2s
сопоставлены с AXI4 Master Write
интерфейс.
3. Щелкните правой кнопкой по Generate RTL Code и IP Core, и затем выберите Run to Selected Task, чтобы сгенерировать ядро IP. Можно найти отображение адресов регистра и другую документацию для ядра IP в сгенерированном Отчете Ядра IP.
Отчет показывает отдельные элементы шины и их отображения адресов:
Если вы задали начальное значение для элемента шины с помощью businit
переменная, сгенерированный отчет ядра IP показывает начальные значения элемента шины.
4. Щелкните правой кнопкой по Build FPGA Bitstream, и затем выберите Run to Selected Task, чтобы сгенерировать Vivado project.Build поток битов FPGA.
Во время создания проекта сгенерированное ядро IP DUT интегрировано в Default System with External DDR4 Memory Access
исходный проект. Этот исходный проект состоит из IP Генератора Интерфейса памяти Xilinx, чтобы связаться со встроенной внешней памятью DDR4 на платформе ZCU102. MATLAB как Ведущий IP AXI также добавляется, чтобы позволить MATLAB управлять IP DUT и инициализировать и проверить содержимое памяти DDR.
После того, как поток битов FPGA сгенерирован, Целевое устройство Программы запуска, чтобы программировать плату FPGA через кабель JTAG.
Можно затем запустить реализацию FPGA и проверить аппаратный результат путем выполнения этого скрипта в MATLAB:
hdlcoder_axi_slave_bus_data_type_hw_run_ZCU102.m
Этот скрипт сначала инициализирует Matrix_Size
к 2 000, что означает 2000 2000 матрица. Можно настроить Matrix_Size
до 4 000.
Основное чтение AXI4 и базовые адреса канала записи затем сконфигурированы. Эти адреса задают базовый адрес, который DUT читает из внешней памяти DDR и пишет во внешнюю память DDR. В этом скрипте DUT читает из базового адреса '80000000', и запись к базовому адресу '90000000'.
MATLAB как Ведущее устройство AXI инициализирует внешнюю память DDR4 входным вектором и матричными данными и очищает выходное местоположение памяти DDR.
Вычисление DUT запускается путем управления доступными регистрами AXI4. Ядро IP DUT сначала читает входные данные из памяти DDR, выполняет матричное векторное умножение, и затем записывает результат обратно к памяти DDR.
Выходной результат читается назад в MATLAB и по сравнению с ожидаемым значением. Аппаратные результаты проверяются в MATLAB.