Выполнение Большой Операции над матрицей на FPGA с помощью Внешней памяти

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

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

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

  • Комплект Проекта Xilinx Vivado, с поддерживаемой версией, перечисленной в документации HDL Coder

  • Оценочный комплект Xilinx Zynq ZC706

  • Пакет поддержки HDL Coder для платформы Xilinx Zynq

  • Пакет поддержки HDL Verifier для Советов FPGA Xilinx

  • Этот пример может также быть запущен по Ультрашкале Xilinx Zynq + Оценочный комплект MPSoC ZCU102

Введение

В этом примере, вас:

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

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

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

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

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

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

modelname = 'hdlcoder_external_memory';
open_system(modelname);

Алгоритм модели Используя основной протокол AXI4

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

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

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

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

open_system('hdlcoder_external_memory/DUT');

В DUT подсистема, DDR_Access модуль моделирует упрощенный Основной протокол AXI4, и используйте его, чтобы читать, и записывает данные на DDR. Во время рабочего процесса Генерации Ядра IP HDL Coder затем сгенерирует переводчика между упрощенным Основным протоколом AXI4 и фактическим Основным протоколом AXI4 в сгенерированном ядре IP HDL. Для получения дополнительной информации об упрощенном Основном протоколе AXI4 обратитесь к Проекту Модели для Основной Интерфейсной документации Генерации AXI4.

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

Позволяет говорят, A будьте матрицей размера NxN и B вектор размера Nx1

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

Первые значения N от DDR обработаны как вектор размера Nx1, сопровождаемый матричными данными о размере NxN. Первые значения N (векторные данные) хранятся в RAM. От значений N+1 вперед, данные непосредственно передаются потоком как матричные данные. Векторные данные будут считаны из Vector_RAM параллельно. И матричные и векторные входные параметры поданы в Matrix_mul_top подсистема. Первый матричный выход доступен после N такты и будет храниться в выход RAM. Снова, векторный адрес чтения RAM повторно инициализируется к 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 верен, скрипт проверяет матричный результат векторного умножения.

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

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

Сгенерируйте ядро IP HDL с Основным Интерфейсом AXI4

Затем мы запускаем HDL Workflow Advisor и используем рабочий процесс Генерации Ядра IP, чтобы развернуть этот проект на оборудовании Zynq. Для более подробного пошагового руководства можно обратиться к Началу работы с Рабочим процессом Элемента кода HW/SW для примера Платформы Xilinx Zynq.

1. Настройте инструмент path синтеза 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_onMatrixSize , burst_len, burst_from_ddr и burst start сопоставлены с AXI4-Lite интерфейс. HDL Coder сгенерирует интерфейс AXI4 доступные регистры для этих портов. Позже, можно использовать MATLAB, чтобы настроить эти параметры во времени выполнения, когда проект работает на плате FPGA.

Интерфейс 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. Щелкните правой кнопкой по Task 3.2, Сгенерируйте Код RTL и Ядро IP, и выберите Run to Selected Task, чтобы сгенерировать ядро IP. Можно найти отображение адресов регистра и другую документацию для ядра IP в сгенерированном Отчете Ядра IP.

4. Теперь Щелкните правой кнопкой по Потоку битов FPGA Сборки Task 4.2 и выберите Run to Selected Task, чтобы сгенерировать проект Vivado, и затем создать поток битов FPGA.

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

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

Запустите реализацию FPGA на оценочном комплекте Xilinx Zynq ZC706

После того, как поток битов FPGA сгенерирован, можно запустить Задачу 4.3 Целевых устройства Программы, чтобы программировать плату FPGA через кабель JTAG.

Можно затем запустить реализацию FPGA и проверить аппаратный результат путем выполнения после скрипта в MATLAB

  hdlcoder_external_memory_hw_run

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

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

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

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

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

Доступ к Внешней памяти DDR4 по Ультрашкале Xilinx Zynq + Оценочный комплект MPSoC ZCU102

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 и исходный проект как Default System with External DDR4 Memory Access

3. Теперь Щелкните правой кнопкой по Потоку битов FPGA Сборки Task 4.2 и выберите Run to Selected Task, чтобы сгенерировать проект Vivado, и затем создать поток битов FPGA.

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

  hdlcoder_external_memory_hw_run_ZCU102

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

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