В этом примере показано, как сгенерировать ядро IP HDL с интерфейсом AXI4 Master, выполните умножение матриц в ядре IP HDL и запись выходной результат к памяти DDR.
Чтобы запустить этот пример, необходимо было установить следующее программное и аппаратное обеспечение и настроить:
Набор Проекта Xilinx Vivado, с поддерживаемой версией, перечисленной в Поддержке Языка HDL и Поддерживаемых Сторонних программах и Оборудовании
Оценочный комплект Xilinx Zynq ZC706
Пакет поддержки HDL Coder для платформы Xilinx Zynq
Пакет поддержки HDL Verifier для Советов FPGA Xilinx
Этот пример может также быть запущен по Ультрашкале Xilinx Zynq + Оценочный комплект MPSoC ZCU102
В этом примере, вас:
Сгенерируйте ядро IP HDL с интерфейсом AXI4 Master.
Доступ к большим матрицам из внешней памяти DDR3 на плате Xilinx Zynq ZC706 с помощью интерфейса AXI4 Master.
Выполните матричное векторное умножение в ядре 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);
Эта модель в качестве примера включает 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
модуль.
Можно симулировать эту модель в качестве примера и проверить результат симуляции путем выполнения после скрипта в 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.
Затем мы запускаем HDL Workflow Advisor и используем рабочий процесс Генерации Ядра IP, чтобы развернуть этот проект на оборудовании Zynq. Для более подробного пошагового руководства можно обратиться к Началу работы с Предназначением для примера Платформы 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
MatrixSize
, 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 сгенерирован, можно запустить Задачу 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.
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. Теперь Щелкните правой кнопкой по Потоку битов FPGA Сборки Task 4.2 и выберите Run to Selected Task, чтобы сгенерировать проект Vivado, и затем создать поток битов FPGA.
4. Можно запустить Задачу 4.3 Целевых устройства Программы, чтобы программировать устройство и проверить аппаратный результат путем выполнения после скрипта в MATLAB:
hdlcoder_external_memory_hw_run_ZCU102
Этот скрипт сначала инициализирует Matrix_Size
к 2 000, что означает 2000x2000 матрица. В этом скрипте DUT читает из базового адреса '80000000', и запись к базовому адресу '90000000'.
Наконец, выходной результат читается назад в MATLAB, и по сравнению с ожидаемым значением. Таким образом аппаратные результаты проверяются в MATLAB.