exponenta event banner

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

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

Перед началом работы

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

Введение

В этом примере выполняется следующее:

  1. Создайте ядро IP HDL с интерфейсом AXI4 Master ".

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

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

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

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

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

modelname = 'hdlcoder_external_memory';
open_system(modelname);

Алгоритм модели с использованием главного протокола AXI4

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

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

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

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

open_system('hdlcoder_external_memory/DUT');

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

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

Давайте скажем: 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 можно просматривать сигналы модели с течением времени с помощью логического анализатора.

Произведите IP ядро HDL с Основным Интерфейсом AXI4

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

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

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

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

4. Теперь щелкните правой кнопкой мыши задачу 4.2 Построить битовый поток FPGA и выберите Выполнить до выбранной задачи, чтобы создать проект Vivado, а затем создайте битовый поток FPGA.

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

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

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

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

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

  hdlcoder_external_memory_hw_run

Этот сценарий сначала инициализирует Matrix_Size для 500, что означает матрицу 500x500. Вы можете настроить Matrix_Size до 4000.

Владелец AXI4 Рид и Пишет, что базовые адреса канала тогда настроены. Эти адреса определяют базовый адрес, с которого считывается DUT, и записываются во внешнюю память DDR. В этом сценарии DUT считывается с базового адреса «» 40000000 «» и записывается на базовый адрес «» 50000000 «».

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

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

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

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

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

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

3. Теперь щелкните правой кнопкой мыши задачу 4.2 Построить битовый поток FPGA и выберите Выполнить до выбранной задачи, чтобы создать проект Vivado, а затем создайте битовый поток FPGA.

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

  hdlcoder_external_memory_hw_run_ZCU102

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

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