Начало работы с AXI4-Stream интерфейсом в рабочем процессе Zynq

В этом примере показано, как использовать интерфейс AXI4-Stream для высокоскоростной передачи данных между процессором и FPGA на оборудовании Zynq.

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

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

Для настройки платы Zedboard см. раздел Set up Zynq hardware and tools в примере Начало работы with Targeting Xilinx Zynq Platform.

Введение

В этом примере показано, как:

  1. Моделируйте алгоритм потоковой передачи с помощью упрощенного протокола потоковой передачи.

  2. Сгенерируйте ядро IP HDL с AXI4-Stream интерфейсом.

  3. Интеграция сгенерированного IP-ядра с контроллером DMA в исходный проект Zedboard.

  4. Используйте блок драйверов AXI4-Stream, чтобы сгенерировать код С, который запускается на процессоре ARM.

Рисунок выше представляет собой схему архитектуры высокого уровня, которая показывает потоковую передачу данных между процессором и FPGA-тканью на платформе Zynq. Обычно AXI4-Stream интерфейс используется вместе с контроллером DMA для передачи большого фрагмента данных от процессора в FPGA. Данные обычно представляются в виде векторных данных на стороне программного обеспечения. Контроллер DMA считывает векторные данные из памяти и «передает» их в IP FPGA через AXI4-Stream интерфейс. «Потоковый» процесс отправляет по одному элементу данных на выборку, что означает, что путь данных алгоритма потоковой передачи в IP FPGA использует скалярный тип данных.

IP FPGA может также включать в себя интерфейс AXI4-Lite для сигналов управления или настройки параметра. По сравнению с AXI4-Lite интерфейсом интерфейс AXI4-Stream передает данные намного быстрее, что делает его более подходящим для пути данных алгоритма.

Кроме подключения к процессору, IP-интерфейс FPGA с AXI4-Stream интерфейсом также может быть соединен с другими IP-узлами с AXI4-Stream интерфейсом для передачи данных внутри FPGA.

Моделируйте алгоритм потоковой передачи с помощью упрощенного протокола потоковой передачи

Предположим, что мы хотим развернуть простой симметричный конечная импульсная характеристика на Zynq. Мы хотим реализовать фильтр на FPGA. И процессор ARM генерирует исходные данные для потоковой передачи их в FPGA через интерфейс AXI4-Stream.

Начнем с sfir_fixed модель.

open_system('sfir_fixed')
set_param('sfir_fixed', 'SimulationCommand', 'Update')

Обратите внимание, что путь данных этой модели (от x_in до y_out) обрабатывает скалярные входные данные, который подходит для потокового интерфейса.

В порядок, чтобы включить передачу данных от программного обеспечения к алгоритму фильтра, нам нужно сопоставить порты пути данных с AXI4-Stream интерфейсом. Интерфейс AXI4-Stream содержит данные (Data) и сигналы управления, такие как действительные данные (Valid), обратные давления (Ready) и контура данных (TLAST).

Функция генерации AXI4-Stream ядра IP требует, по крайней мере, сигналов данные и Valid, которые должны быть смоделированы в DUT. Сигнал данные является основной полезной нагрузкой, которая передается через интерфейс. Сигнал Valid указывает, когда сигнал данные действителен. Другие сигналы управления опциональны.

Примечание. Для генерации ядра IP, данных и действительных следуйте упрощенному протоколу потоковой передачи. Вам не нужно моделировать полный протокол AXI4-Stream, который сложнее. HDL Coder автоматически генерирует модуль потокового интерфейса в IP-ядре HDL, чтобы преобразовать упрощенный протокол потоковой передачи в полный протокол AXI4-Stream. Как показано на рисунке ниже, протокол прост: всякий раз, когда сигнал данные действителен, сигнал Valid также должен быть утвержден.

Итак, в порядок на карту sfir_fixed алгоритм к упрощенному потоковому протоколу, сигнал Valid должен быть добавлен. Чтобы добавить сигнал Valid к вашей модели, мы рекомендуем следующий шаблон моделирования:

  1. Преобразуйте подсистему алгоритма в включенную подсистему.

  2. Добавьте входной порт управления, Valid_In, и выходного порта управления, Valid_Out.

  3. Использование Valid_In для управления портом включения и портом включения подсистемы алгоритма, и Valid_Out.

В этом шаблоне и входной потоковый канал, и выходной потоковый канал следуют упрощенному протоколу потоковой передачи.

Теперь рассмотрим пример модели.

open_system('hdlcoder_sfir_fixed_stream');

Подсистема DUT является оборудованием подсистемой, предназначенной для фабрики FPGA. Внутри этой подсистемы symmetric_fir подсистема представляет алгоритм фильтра. Входные порты, x_in_data и x_in_valid и выходные порты, y_out_data и y_out_valid, являются портами пути данных фильтра. Другие входные порты, такие как h_in1, являются портами управления, которые настраивают параметры фильтра.

Модель следует шаблону моделирования для упрощенного протокола потоковой передачи. Подсистема symmetric_fir является включенной подсистемой. Входной сигнал управления, x_in_valid, управляет портом включения symmetric_fir подсистемы, а также управляет выходным сигналом управления, y_out_valid.

С AXI4-Stream генерации ядра IP вы можете опционально смоделировать другие потоковые сигналы управления. Для примера можно смоделировать сигнал заднего давления, Ready. Интерфейс AXI4-Stream сообщается в главном/ведомом режиме, где ведущее устройство отправляет данные в ведомое устройство. Сигнал Ready является сигналом обратного давления от ведомого устройства к ведущему устройству, который указывает, может ли ведомое устройство принимать новые данные. Как показано на следующей схеме, сигнал Ready утверждается, когда ведомое устройство может принимать новые данные. Когда ведомое устройство больше не может принимать новые данные, ему нужно отменить утверждение сигнала Ready. Когда ведущее устройство видит, что сигнал Ready отключен, оно останавливает передачу данных самое большее на одну выборку позже. Этот выборочный допуск встроен в протокол.

Примечание. Эта схема иллюстрирует взаимосвязь между данными, Valid и Ready согласно упрощенному протоколу потоковой передачи. Когда вы запускаете IP Core Generation рабочий процесс, генератор кода добавляет модуль потокового интерфейса в HDL IP ядре, который переводит упрощенный протокол к полному потоковому протоколу.

Например, вы можете использовать сигнал Ready, когда используете блок FIFO для сбора системы координат входящих потоковых данных, который затем обрабатывается вашим алгоритмом. Во время обработки данных вы отключите сигнал Ready, чтобы предотвратить дальнейшие входящие данные.

Сгенерируйте IP-ядро HDL с AXI4-Stream интерфейсом

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

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

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

2. Запустите HDL Workflow Advisor из подсистемы DUT, hdlcoder_sfir_fixed_stream/DUT. Настройки целевого интерфейса уже сохранены в этой модели примера, поэтому настройки в Задании 1.1 и 1.2 загружаются автоматически. Чтобы узнать больше о сохранении настроек целевого интерфейса в модели, можно обратиться к примеру Save Target Hardware Settings in Model.

В Задаче 1.1 для рабочего процесса Target выбирается IP Core Generation, а для Целевой платформы - Zedboard. В Задаче 1.2 Система по умолчанию с AXI4-Stream интерфейсом выбрана для Исходный Проект, и таблица интерфейса целевой платформы загружена как показано на следующем рисунке. Порты, x_in_data, x_in_valid, y_out_data и y_out_valid пути данных сопоставлены с AXI4-Stream интерфейсами, а порты параметров управления, такие как h_in1, сопоставлены с AXI4-Lite интерфейсом.

Интерфейс AXI4-Stream сообщается в главном/ведомом режиме, где ведущее устройство отправляет данные в ведомое устройство. Поэтому, если порт данных является входом портом, присвойте его интерфейсу AXI4-Stream Slave, а если порт данных является выходом портом, присвойте его главному интерфейсу AXI4-Stream.

3. Щелкните правой кнопкой мыши Задачу 3.2, Сгенерируйте код RTL и IP Core и выберите Выполнить до выбранной задачи, чтобы сгенерировать ядро IP. В сгенерированном отчете IP Core Report можно найти отображение адресов регистров и другую документацию для ядра IP.

Интеграция IP-адресов с AXI4-Stream совместимым исходным проектом

Далее в HDL Workflow Advisor запускаем задачи Встраиваемая Система Integration для развертывания сгенерированного IP-ядра HDL на оборудовании Zynq.

1. Запуск задачи 4.1, создание проекта. Эта задача вставляет сгенерированное IP-ядро в систему по умолчанию с AXI4-Stream исходного проекта интерфейса. Этот исходный проект содержит Xilinx AXI DMA IP для обработки потоковой передачи данных процессора к FPGA. Как показано на первой схеме или в отчете ядра IP, данные передаются из системы обработки ARM через контроллер DMA и AXI4-Stream интерфейс в сгенерированное ядро HDL конечной импульсной характеристики фильтра IP. Выход ядра IP фильтра затем отправляется обратно в систему обработки.

2. Для открытия сгенерированного проекта Vivado необходимо щелкнуть ссылку на панели результатов. В инструменте Vivado нажмите Open Block Design, чтобы просмотреть конструкторскую схему Zynq, которая включает сгенерированное IP-ядро HDL, контроллер AXI DMA и процессор.

3. В HDL Workflow Advisor запустите остальные задачи, чтобы сгенерировать модель интерфейса программного обеспечения, и создайте и загрузите битовый поток FPGA.

Сгенерируйте исполняемый файл ARM AXI4-Stream используя блок драйверов

Модель интерфейса программного обеспечения сгенерирована в Задаче 4.2, Generate Software Interface Model, как показано на следующем рисунке.

Несмотря на то, что драйвер AXI4-Lite автоматически генерируется в модели программного интерфейса, блок драйверов AXI4-Stream не может быть автоматически сгенерирован. Причина в том, что AXI4-Stream блока драйверов ожидает соединения с вектором портом на стороне программного обеспечения, но x_in_data порт DUT является скалярным портом.

1. Прежде чем вы сгенерируете код из модели программного интерфейса:

  1. Добавьте блоки драйверов AXI4-Stream IIO Read и AXI4-Stream IIO Write из Simulink Library Browser - > Пакет поддержки Embedded Coder для библиотеки платформы Xilinx Zynq.

  2. Используйте векторный источник данных для управления портом x_in_data.

  3. Подключите x_in_data порт к блоку драйверов.

  4. Дважды кликните на AXI4-Stream IIO Write блока и установите значение Timeout равным 0 вместо inf.Это показано ниже.

5. Установите приоритет блока AXI4-Stream IIO Write равным 1, чтобы убедиться, что запись происходит перед чтением. Чтобы задать приоритет, щелкните правой нажатие кнопки по блоку и откройте свойства, установите приоритет равным 1. Это показано ниже.

6. Теперь дважды нажатию кнопки на блоке AXI4-Stream IIO Read и установите формат кадра равным 100, Шаг расчета на Ts и Timeout равными 10. Это показано ниже.

7. Приоритет блока AXI4-Stream IIO Read не должен быть установлен. Установка приоритета только для блока записи равного 1 уже гарантирует, что запись происходит перед чтением.

В данном примере предусмотрена обновленная модель интерфейса программного обеспечения: hdlcoder_sfir_fixed_stream_sw.slx. Источник векторных данных со 100 элементами данных используется в этой модели и соединяется с AXI4-Stream блоком драйверов DMA. Это означает, что для каждого шага расчета процессора контроллер DMA будет передавать 100 32-битовых выборок данных в ядро IP HDL через интерфейс AXI4-Stream и принимать 100 32-битовых выборок потоковых данных.

2. Сконфигурируйте и создайте модель программного интерфейса для режима external mode:

  1. В сгенерированной модели щелкните на панели Hardware и перейдите в Hardware settings, чтобы открыть диалоговое окно Параметр Конфигурации.

  2. Выберите решатель и установите «Stop Time» на «inf».

  3. На панели « Оборудовании» нажмите кнопку «Монитор и настройка».

  4. Нажмите кнопку Run на панели инструментов модели. Embedded Coder создает модель, загружает исполняемый файл ARM на оборудование Zedboard, выполняет его и соединяет модель с исполняемым файлом, работающим на оборудовании Zedboard.

3. Теперь и аппаратные, и программные части проекта работают на оборудовании Zynq. Процессор ARM отправляет исходные данные в IP FPGA через контроллер DMA и AXI4-Stream интерфейс. Процессор ARM получает данные результата фильтра от IP FPGA и отправляет данные результата в Simulink через режим external mode. Наблюдайте за выходом ядра IP-фильтра конечной импульсной характеристики от оборудования Zynq на y_out Time Scope.

4. Настройте параметры конечной импульсной характеристики в модели программного интерфейса и наблюдайте, как изменяется выход конечной импульсной характеристики, когда вы настраиваете параметры. Значения параметров передаются на оборудование Zynq через режим external mode и AXI4-Lite интерфейс.