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

Этот пример показывает как:

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

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

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

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

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

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

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

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

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

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

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

Введение

Этот пример моделирует матричный алгоритм векторного умножения и реализует алгоритм на плате 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_on, matrix_size, 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.