В этом примере показано, как сопоставить типы данных шины с AXI4 подчиненным интерфейсом, сгенерировать HDL-ядро IP с интерфейсом AXI4 Master, выполнить матричное умножение в HDL IP-ядре и записать выход в память DDR.
В данном примере необходимо установить и настроить следующее программное и оборудование:
Xilinx Vivado Проекта Набора с поддерживаемой версией, перечисленной в HDL Language Поддержки и поддерживаемой Сторонними программами и оборудованием
Набор для оценки ZCU102 Xilinx Zynq Ultrascale + MPSoC
HDL Coder поддержки платформы Xilinx Zynq
HDL Verifier поддержки плат Xilinx FPGA
В этом примере вы:
Создайте элемент шины с помощью блоков создателя шины и сопоставьте элемент шины с AXI4 подчиненным интерфейсом.
Сгенерируйте ядро IP HDL с AXI4 Master.
Доступ к большим матрицам из внешней памяти DDR4 на плате Xilinx Zynq Ultrascale + MPSoC ZCU102 Evaluation Kit с помощью интерфейса AXI4 Master.
Выполните умножение матричных векторов в IP-ядре HDL и запишите выход обратно в память DDR с помощью интерфейса AXI4 Master.
Этот пример моделирует алгоритм умножения матричных векторов и реализует алгоритм на плате Xilinx Zynq FPGA. Большие матрицы могут не соответствовать эффективно блокировке ОЗУ на фабрике FPGA. Вместо этого сохраните матрицы во внешней памяти DDR на плате FPGA. Интерфейс AXI4 Master может получить доступ к данным путем связи с IP-ядрами интерфейса памяти, предоставляемого производителем, которые взаимодействуют с памятью DDR. Эта возможность позволяет вам смоделировать алгоритмы, которые включают большую обработку данных и требуют высокопроизводительного доступа к DDR, такие как матричные операции, алгоритмы компьютерного зрения и так далее.
Модуль умножения матричных векторов поддерживает умножение матричных векторов с фиксированной точкой с конфигурируемым размером матрицы от 2 до 4000. Размер матрицы настраивается во время выполнения через 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
, Matrix_Size
, и Burst_Length
в элемент типа данных шины. Для получения дополнительной информации о блоке создателя шины смотрите Bus Creator
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 имеет значение true. Скрипт проверяет результат умножения вектора матрицы.
Когда Matrix_Multiplication_On имеет значение false, скрипт проверяет режим обратного цикла, что означает, что DUT считывает Burst_Length
объем данных из DDR, а затем записал данные обратно в DDR.
Затем запускаем HDL Workflow Advisor и используем рабочий процесс генерации IP Core для развертывания DUT на оборудовании Zynq. Более подробное пошаговое руководство приведено в примере «Начало работы с таргетингом Xilinx Zynq Platform».
1. Настройте путь инструмента синтеза 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
в столбце Опции интерфейса (Interface Options) таблицы Интерфейс целевой платформы (Target platform interface table).
Задайте начальные значения непосредственно в окне Опции интерфейса (Interface Options).
Хранение начальных значений типа данных шины в переменной с именем businit
, запустите этот код:
businit = struct('matrix_mul_on',Matrix_Multiplication_On,'matrix_size',Matrix_Size,'burst_len',Burst_Length)
Чтобы задать businit
переменная в окне Опции интерфейса (Interface Options).
Интерфейс 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. Щелкните правой кнопкой мыши Сгенерировать код RTL и IP-ядро, а затем выберите Выполнить до выбранной задачи, чтобы сгенерировать ядро IP. В сгенерированном отчете IP Core Report можно найти отображение адресов регистров и другую документацию для ядра IP.
Отчет показывает отдельные элементы шины и их адресные отображения:
Если вы задали начальное значение для элемента шины, используя businit
Переменная, сгенерированный отчет ядра IP показывает начальные значения элемента шины.
4. Щелкните правой кнопкой мыши Build FPGA Bitstream, а затем выберите Run to Selected Task, чтобы сгенерировать проект Vivado. Создайте битовый поток FPGA.
Во время создания проекта сгенерированное ядро IP DUT интегрируется в Default System with External DDR4 Memory Access
исходный проект. Этот исходный проект состоит из генератора IP интерфейса памяти Xilinx для связи с встроенной внешней памятью DDR4 на ZCU102 платформе. MATLAB в качестве AXI Master IP также добавляется, чтобы MATLAB мог управлять DUT IP, а также инициализировать и проверить содержимое памяти DDR.
После генерации потока битов FPGA запустите Program Target Device, чтобы запрограммировать плату FPGA через кабель JTAG.
Затем можно запустить реализацию FPGA и проверить аппаратный результат, запустив этот скрипт в MATLAB:
hdlcoder_axi_slave_bus_data_type_hw_run_ZCU102.m
Этот скрипт сначала инициализирует Matrix_Size
по 2000 год, что означает матрицу 2000 на 2000 год. Можно настроить Matrix_Size
до 4000.
Затем конфигурируются базовые адреса канала чтения и записи AXI4 Master. Эти адреса определяют базовый адрес, который DUT считывает из внешней памяти DDR и записывает во внешнюю память DDR. В этом скрипте DUT считывается с базового адреса '80000000' и записывается на базовый адрес '90000000'.
MATLAB в качестве AXI Master инициализирует внешнюю память DDR4 с помощью входных векторов и матричных данных и очищает выход памяти DDR.
Расчет DUT запускается путем управления AXI4 доступными регистрами. Ядро DUT IP сначала считывает входные данные из памяти DDR, выполняет умножение матричного вектора, а затем записывает результат обратно в память DDR.
Выход считывается обратно в MATLAB и сравнивается с ожидаемым значением. Результаты оборудования проверяются в MATLAB.