Выполнение операции с большой матрицей на FPGA с использованием внешней памяти

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

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

Чтобы запустить этот пример, вы должны установить и настроить следующее программное и оборудование:

Введение

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

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

  2. Доступ к большим матрицам из внешней памяти DDR3 на ZC706 плате Xilinx Zynq с помощью интерфейса AXI4 Master.

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

Этот пример также можно запустить на наборе для оценки ZCU102 Xilinx Zynq Ultrascale + MPSoC для доступа к внешней DDR4 памяти.

Этот пример моделирует алгоритм умножения матричных векторов и реализует алгоритм на плате Xilinx Zynq FPGA. Большие матрицы могут не быть эффективно сопоставлены с блоками ОЗУ на ткани FPGA. Вместо этого мы можем хранить матрицы во внешней памяти DDR на плате FPGA. Интерфейс AXI4 Master может получить доступ к данным путем связи с IP-ядрами интерфейса памяти, предоставляемого производителем, которые взаимодействуют с памятью DDR. Эта возможность позволяет вам смоделировать алгоритмы, которые включают большую обработку данных и требуют высокопроизводительного доступа к DDR, такие как матричные операции, алгоритмы компьютерного зрения и так далее.

Модуль умножения матричных векторов поддерживает умножение матричных векторов с фиксированной точкой с конфигурируемым размером матрицы в диапазоне от 2 до 4000. Размер матрицы настраивается во время выполнения AXI4 помощью доступного регистра.

modelname = 'hdlcoder_external_memory';
open_system(modelname);

Моделируйте алгоритм, используя AXI4 Master Protocol

Эта модель примера включает реализуемую FPGA DUT (Проект тестируется) блок, DDR блок функционального поведения и тестовое окружение для управления входами и проверки ожидаемых выходов.

The DUT Подсистема содержит главный контроллер AXI4 чтения/записи наряду с модулем умножения матричных векторов. Используя интерфейс AXI4 Master, DUT подсистема считывает данные из внешней памяти DDR, подает данные в Matrix_Vector_Multiplication модуль, а затем запись выходных данных во внешнюю память DDR с помощью AXI4 Master. The DUT модуль также имеет несколько портов параметров. Эти порты будут сопоставлены с AXI4-Lite доступными регистрами, поэтому можно настроить эти параметры из MATLAB, даже после реализации проекта на FPGA.

The DDR модуль представляет внешнюю память DDR в среде симуляции. Интерфейс между DUT и DDR модули являются упрощенным протоколом AXI4 Master.

Один из портов параметров matrix_mul_on управляет, запускать ли Matrix_Vector_Multiplication модуль. Когда вход в matrix_mul_on верно, DUT Подсистема выполняет умножение матричного вектора, как описано выше. Когда вход в matrix_mul_on является ложным, DUT подсистема выполняет обратный цикл данных. В этом режиме система DUT подсистема считывает данные из внешней памяти DDR, записывает их в Internal_Memory модуль, а затем запишите те же данные обратно во внешнюю память DDR. Режим цикла данных является простым способом проверки функциональности внешнего доступа к памяти DDR AXI4 Master.

open_system('hdlcoder_external_memory/DUT');

Внутри DUT подсистема, DDR_Access модуль моделирует упрощенный протокол AXI4 Master и использует его для чтения и записи данных о DDR. В течение рабочего процесса генерации ядра IP HDL Coder генерирует транслятор между упрощенным протоколом AXI4 Master и фактическим протоколом AXI4 Master в сгенерированном ядре HDL IP. Для получения дополнительной информации об упрощенном протоколе AXI4 Master см. документацию Model Design for AXI4 Master Interface Generation.

Также внутри DUT подсистема, Matrix_Vector_Multiplication модуль использует блок multiply-add, чтобы реализовать расчет потокового точечного произведения для внутреннего произведения умножения матричного вектора.

Допустим, A быть матрицей размера NxN и B является вектором размера Nx1

Затем выход умножения матричного вектора будет: Z = A * B, размера Nx1

Первые N значений из DDR обрабатываются как вектор размера Nx1, за которым следуют данные матрицы размера NxN. Первые N значений (векторные данные) сохраняются в ОЗУ. Начиная с N + 1 значений, данные непосредственно потокуются как матричные данные. Векторные данные будут считываться из Vector_RAM параллельно. И матрица, и векторные входы подаются в Matrix_mul_top подсистема. Первый матричный выход доступен после N тактов и будет сохранен в выход ОЗУ. Снова адрес чтения векторной ОЗУ повторно инициализируется равным 0 и начинает считывать те же векторные данные, соответствующие новому матричному потоку. Эта операция повторяется для всех строк матрицы.

Следующая схема показывает архитектуру Matrix_Vector_Multiplication модуль.

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

Можно симулировать эту модель примера и проверить результат симуляции, запустив следующий скрипт в MATLAB:

hdlcoder_external_memory_simulation;
PASSED: DDR initialization data matches.
PASSED: Matrix vector multiplication output matches with the expected data

Этот скрипт сначала инициализирует такие параметры, как Matrix_Size. По умолчанию Matrix_Size равен 64, что означает матрицу 64x64. Значение по умолчанию Matrix_Size поддерживается маленьким, поэтому симуляция происходит быстрее. После внедрения DUT на плату FPGA, большие Matrix_Size затем может использоваться, так как расчет FPGA намного быстрее. Можно также настроить эти параметры в скрипте.

Скрипт затем моделирует модель и проверяет результат путем сравнения записанного результата симуляции с ожидаемым значением.

По умолчанию Matrix_Multiplication_On соответствует true, скрипт проверяет результат умножения матричного вектора.

Когда Matrix_Multiplication_On имеет значение false, скрипт проверяет режим обратного цикла, что означает чтение DUT Burst_Length объем данных из DDR и запись данных обратно в DDR.

Если у вас есть лицензия DSP System Toolbox, можно просмотреть сигналы модели с течением времени с помощью Logic Analyzer.

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

Затем запустите HDL Workflow Advisor и используйте рабочий процесс генерации IP-ядра, чтобы развернуть этот проект на оборудовании Zynq. Более подробное пошаговое руководство можно найти в примере Начало работы с Targeting Xilinx Zynq Platform.

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

  hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2018.2\bin\vivado.bat')

2. Запустите HDL Workflow Advisor из подсистемы DUT, hdlcoder_external_memory/DUT. Настройки целевого интерфейса сохраняются в модели. Заметьте, что целевой рабочий процесс IP Core Generation, целевая платформа Xilinx Zynq ZC706 evaluation kit, Исходный проект Default System with External DDR3 memory access, и настройки таблицы интерфейсов целевой платформы показаны ниже.

В этом примере входы параметров, такие как matrix_mul_on, matrix_size, burst_len, burst_from_ddr и burst start сопоставлены с AXI4-Lite интерфейс. HDL Coder будет генерировать AXI4 регистры для этих портов. Позже можно использовать MATLAB, чтобы настроить эти параметры во время выполнения, когда проект работает на плате FPGA.

Главный интерфейс AXI4 имеет отдельные каналы чтения и записи. Считываемые порты канала, такие как 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. Щелкните правой кнопкой мыши Задачу 3.2, Сгенерируйте код RTL и IP Core и выберите Выполнить до выбранной задачи, чтобы сгенерировать ядро IP. В сгенерированном отчете IP Core Report можно найти отображение адресов регистров и другую документацию для ядра IP.

4. Теперь щелкните правой кнопкой мыши Task 4.2 Build FPGA Bitstream и выберите Run to Selected Task, чтобы сгенерировать проект Vivado, а затем создайте bitstream FPGA.

Во время создания проекта сгенерированное ядро IP DUT интегрируется в Default System with External DDR3 Memory Access исходный проект. Этот исходный проект содержит генератор IP интерфейса памяти Xilinx для связи с встроенной памятью внешнего DDR3 на ZC706 платформе. MATLAB в качестве AXI Master IP также добавляется, чтобы MATLAB мог управлять DUT IP, а также инициализировать и проверить содержимое памяти DDR.

Вы можете щелкнуть ссылку в окне результата в Задаче 4.1 «Создать проект», чтобы просмотреть проект генерации Vivado. Если вы открываете проект блока Vivado, сгенерированный исходный проект выглядит аналогично этой архитектурной схеме.

Запуск реализации FPGA на наборе для оценки ZC706 Xilinx Zynq

После генерации битового потока FPGA можно запустить задачу 4.3 Program Target Device для программирования платы FPGA через кабель JTAG.

Затем можно запустить реализацию FPGA и проверить аппаратный результат, запустив следующий скрипт в MATLAB

  hdlcoder_external_memory_hw_run

Этот скрипт сначала инициализирует Matrix_Size к 500, что означает матрицу 500x500. Можно настроить Matrix_Size до 4000.

Затем конфигурируются базовые адреса канала чтения и записи AXI4 Master. Эти адреса определяют базовый адрес, с которого считывается DUT и записывается во внешнюю память DDR. В этом скрипте DUT читается с базового адреса '40000000' и записывается на базовый адрес '50000000'.

Затем функция MATLAB в качестве AXI Master используется для инициализации внешней DDR3 памяти с входом вектора и матричными данными, а также для очистки выхода места памяти DDR.

Затем начинается вычисление DUT путем управления AXI4-Lite доступными регистрами. Ядро DUT IP сначала считывает входные данные из памяти DDR, выполняет умножение вектора матрицы, а затем записывает результат обратно в память DDR.

Наконец, выход считывается обратно в MATLAB и сравнивается с ожидаемым значением. Таким образом, результаты оборудования проверяются в MATLAB.

Доступ к памяти внешнего DDR4 на Xilinx Zynq Ultrascale + MPSoC ZCU102 Evaluation Kit

1. Используйте ту же модель hdlcoder_external_memory для доступа к внешней DDR4 памяти на ZCU102 с помощью рабочего процесса генерации ядра IP-кода HDL Coder.

2. Запустите HDL Workflow Advisor из подсистемы DUT, hdlcoder_external_memory/DUT. В задаче 1.1 Установите целевую платформу следующим Xilinx Zynq Ultrascale+ MPSoC ZCU102 Evaluation Kit и в Задаче 1.2 установите Исходный Проект следующим Default System with External DDR4 Memory Access

3. Теперь щелкните правой кнопкой мыши Task 4.2 Build FPGA Bitstream и выберите Run to Selected Task, чтобы сгенерировать проект Vivado, а затем создайте bitstream FPGA.

4. Можно запустить задачу 4.3 Program Target Device, чтобы запрограммировать устройство и проверить аппаратный результат, запустив следующий скрипт в MATLAB:

  hdlcoder_external_memory_hw_run_ZCU102

Этот скрипт сначала инициализирует Matrix_Size по 2000 год, что означает матрицу 2000x2000. В этом скрипте DUT читается с базового адреса '80000000' и записывается на базовый адрес '90000000'.

Наконец, выход считывается обратно в MATLAB и сравнивается с ожидаемым значением. Таким образом, результаты оборудования проверяются в MATLAB.