В этом примере показано, как сопоставить типы данных шины с подчиненным интерфейсом AXI4, создать ядро IP HDL с интерфейсом AXI4 Master, выполнить умножение матрицы в ядре IP HDL и записать результат вывода в память DDR.
В этом примере необходимо установить и настроить следующее программное и аппаратное обеспечение:
Xilinx Vivado Design Suite с поддерживаемой версией, указанной в документе Поддержка языка HDL и Поддерживаемые сторонние инструменты и оборудование
Оценочный комплект Xilinx Zynq Ultrascale + MPSoC ZCU102
Пакет поддержки кодера HDL для платформы 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. Большие матрицы могут неэффективно сопоставляться с блоками RAM на матрице FPGA. Вместо этого сохраните матрицы во внешней памяти DDR на плате FPGA. Ведущий интерфейс AXI4 может получать доступ к данным, связываясь с 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 в элемент типа данных шины. Дополнительные сведения о блоке создания шины см. в разделе Создание шины
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 и используем рабочий процесс поколения IP Core для развертывания DUT на оборудовании Zynq. Более подробное пошаговое руководство см. в примере Начало работы с платформой Targeting Xilinx Zynq.
1. Настройте траекторию инструмента синтеза Xilinx Vivado. При выполнении команды используйте собственный путь установки Vivado. В окне команды MATLAB введите: hdlsetuptoolpath («ToolName», «Xilinx Vivado», «ToolPath», «C :\Xilinx\Vivado\2020.1\bin\vivado.bat»)
2. Запуск помощника по рабочим процессам HDL из подсистемы 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 генерирует регистры, доступные для AXI4 интерфейса для этих портов. Позже можно использовать MATLAB для настройки этих параметров во время выполнения, когда конструкция выполняется на плате FPGA.
Можно указать начальные значения типа данных шины в таблице интерфейса целевой платформы, указав либо непосредственно начальные значения, либо создав переменную для хранения начальных значений в типе данных структуры, а затем используя имя переменной в окне Опции интерфейса. Чтобы задать начальное значение, щелкните Options в столбце Опции интерфейса (Interface Options) в таблице Интерфейс целевой платформы (Target platform interface).
Укажите начальные значения непосредственно в окне Опции интерфейса (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-ядру можно найти в созданном отчете по IP-ядру.
В отчете представлены отдельные элементы шины и их адресные сопоставления:

Если начальное значение для элемента шины задано с помощью businit переменная, сгенерированный отчет ядра IP показывает начальные значения элемента шины.

4. Щелкните правой кнопкой мыши на элементе Build FPGA Bitstream и выберите команду Run to Selected Task, чтобы создать проект Vivado. Создайте битовый поток FPGA.
Во время создания проекта сгенерированное ядро DUT IP интегрируется в Default System with External DDR4 Memory Access эталонный проект. Эта эталонная конструкция состоит из IP-генератора Xilinx Memory Interface Generator для связи с встроенной внешней DDR4 памятью на платформе ZCU102. MATLAB в качестве AXI Master IP также добавляется, чтобы позволить MATLAB управлять IP DUT и инициализировать и проверить содержимое памяти 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 прочитал и пишет, что базовые адреса канала тогда настроены. Эти адреса определяют базовый адрес, который DUT считывает из внешней памяти DDR и записывает во внешнюю память DDR. В этом сценарии DUT считывает с базового адреса '80000000' и записывает на базовый адрес '90000000'.
MATLAB в качестве AXI Master инициализирует внешнюю память DDR4 входными векторными и матричными данными и очищает выходную ячейку памяти DDR.
Вычисление DUT начинается с управления AXI4 доступными регистрами. Ядро IP DUT сначала считывает входные данные из памяти DDR, выполняет умножение вектора матрицы, а затем записывает результат обратно в память DDR.
Выходной результат считывается в MATLAB и сравнивается с ожидаемым значением. Результаты аппаратных средств проверяются в MATLAB.
