Этот пример показывает как:
Сгенерируйте ядро IP HDL с интерфейсом AXI4 Master.
Доступ к большим матрицам из внешней памяти DDR3 на плате Xilinx Zynq ZC706 с помощью интерфейса AXI4 Master.
Выполните матричное векторное умножение в ядре IP HDL и запишите выходной результат обратно к памяти DDR с помощью интерфейса AXI4 Master.
Этот пример может также быть запущен в Ультрашкале 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);
Эта модель в качестве примера включает 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. Для более подробного пошагового руководства можно обратиться к Началу работы с Рабочим процессом Элемента кода 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 сгенерирован, можно запустить Задачу 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
и Исходный проект как 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.