В этом примере показано, как сгенерировать IP-ядро HDL с AXI4 интерфейса Master, выполнить матричное умножение в IP-ядре HDL и записать выход в память DDR.
Чтобы запустить этот пример, вы должны установить и настроить следующее программное и оборудование:
Xilinx Vivado Design Suite с поддерживаемой версией в HDL Language Support и поддерживаемыми сторонними программами и оборудованием
Набор для оценки ZC706 Xilinx Zynq
HDL Coder поддержки платформы Xilinx Zynq
HDL Verifier поддержки плат Xilinx FPGA
Этот пример также можно запустить на наборе для оценки ZCU102 Xilinx Zynq Ultrascale + MPSoC
В этом примере вы:
Сгенерируйте ядро IP HDL с AXI4 Master.
Доступ к большим матрицам из внешней памяти DDR3 на ZC706 плате Xilinx Zynq с помощью интерфейса AXI4 Master.
Выполните умножение матричных векторов в 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);
Эта модель примера включает реализуемую 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
модуль.
Можно симулировать эту модель примера и проверить результат симуляции, запустив следующий скрипт в 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.
Затем запустите 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 можно запустить задачу 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.
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.