Сопоставьте типы данных шины с AXI4 подчиненными интерфейсами

В этом примере показано, как сопоставить типы данных шины с AXI4 подчиненным интерфейсом, сгенерировать HDL-ядро IP с интерфейсом AXI4 Master, выполнить матричное умножение в HDL IP-ядре и записать выход в память DDR.

Прежде чем вы начнете

В данном примере необходимо установить и настроить следующее программное и оборудование:

Введение

В этом примере вы:

  1. Создайте элемент шины с помощью блоков создателя шины и сопоставьте элемент шины с AXI4 подчиненным интерфейсом.

  2. Сгенерируйте ядро IP HDL с AXI4 Master.

  3. Доступ к большим матрицам из внешней памяти DDR4 на плате Xilinx Zynq Ultrascale + MPSoC ZCU102 Evaluation Kit с помощью интерфейса AXI4 Master.

  4. Выполните умножение матричных векторов в 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')
%

Функциональная симуляция в Simulink

Можно симулировать эту модель примера и проверить результат симуляции, запустив этот скрипт в 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.

Сгенерируйте IP-ядро HDL с AXI4 интерфейсом Master

Затем запускаем 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 на наборе для оценки ZCU102 Xilinx Zynq Ultrascale + MPSoC

После генерации потока битов 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.

Похожие темы