Процессоры Arm, доступные как в Zynq, так и в Zynq MPSoC, обеспечивают значительную вычислительную мощность для наших приложений.

Конечно, благодаря программируемой логике, доступной в архитектуре Zynq/Zynq MPSoC, мы можем легко оптимизировать наше приложение для достижения наилучшей производительности.

Одним из часто используемых подходов к повышению производительности является ускорение функций, требующих высокой производительности/интенсивных вычислений, в PL с использованием преимущества присущего логике параллелизма.

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

Для выполнения функций, описанных выше, у нас есть выбор: реализовать сложный конечный автомат на основе FPGA или альтернативно реализовать программное ядро ​​MicroBlaze в PL.

Для многих приложений, использующих MicroBlaze, это имеет смысл, поскольку мы можем легко обновить дизайн, если это необходимо.

Когда дело доходит до внедрения MicroBlaze, мы хотим иметь возможность легко обновлять дизайн. Для этого мы можем использовать два метода:

  1. Используйте двухпортовые BRAM для данных и памяти инструкций с MicroBlaze, подключенным к одной стороне, и процессорной системой на интерфейсе.
  2. Разрешите MicroBlaze запускать свое приложение из PS DDR или OCM.

Сейчас мы рассмотрим второй вариант. Скоро рассмотрю первый вариант. Я выбрал второй вариант, так как он представляет собой более сложный случай.

В этом примере я использую плату Ultra96 — первое, что нужно сделать в Vivado, — это внедрить систему обработки Zynq MPSoC. Во-вторых, внедрить систему обработки MicroBlaze. Чтобы этот пример работал, нам нужно настроить следующее:

  1. Включить дискретные порты
  2. Нет интерфейсов локальной шины памяти
  3. Включить инструкцию AXI и интерфейсы данных

Мы можем настроить эти параметры в стандартном представлении мастера настройки MicroBlaze.

После того, как мы сделали эти настройки, нам нужно переключить представление мастера настройки MicroBlaze в расширенный режим и установить базовый адрес вектора.

То, что мы устанавливаем в качестве базового адреса вектора, зависит от того, какую память мы хотим использовать в PS. У нас есть выбор: встроенная память или DDR.

Однако будьте осторожны, если вы хотите использовать OCM, вам нужно будет сделать что-то умное в этой плачевной системе. В качестве загрузчика первой стадии (FSBL) запускается из OCM.

Таким образом, в этом примере приложение запускается из памяти DDR, поэтому для базового адреса вектора установлено значение 0x00000000.

После этого на блок-диаграмме нам нужно добавить необходимые структуры, чтобы правильно настроить MicroBlaze и позволить PS управлять MicroBlaze.

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

Нам нужно сделать это, так как мы хотим, чтобы MicroBlaze переходил в спящее состояние после сброса сброса, и только для того, чтобы проснуться и начать выполнение кода под управлением PS.

Для этого мы используем два дискретных порта reset_mode[0:1] и wakeup[0:1].

Мы подключим блок констант к reset_mode[0:1], установленному в 0x01. Это определяет поведение MicroBlaze после перезагрузки. Если это 0x00, то он немедленно начнет попытки выполнить код; если это 0x01, MicroBlaze будет спать, пока не проснется.

Это то поведение, которое нам нужно, так как после того, как PL будет настроен в процессе загрузки, мы все равно не будем готовы к немедленному началу выполнения кода.

Чтобы разбудить MicroBlaze, мы используем ввод wakeup[1:0]. Именно этот сигнал мы собираемся подключить к Zynq MPSoC EMIO. Затем мы можем подтвердить это, как только мы будем готовы к тому, что MicroBlaze начнет выполнение кода.

Чтобы позволить MicroBlaze получить доступ к ОЗУ DDR и UART в Zynq MPSoC для связи, нам нужно включить подчиненный порт AXI на Zynq MPSoC. Для этого приложения, поскольку я работаю с DDR, я включил высокопроизводительное ведомое устройство в домене полной мощности.

Я также включил фрагментацию адресов.

Как только это будет завершено, мы можем создать дизайн Vivado и экспортировать HDF в SDK.

В SDK нам нужно создать новый проект, ориентированный на MicroBlaze, который мы только что внедрили в PL.

Пусть проект создаст BSP и выберет простой пример hello world. После создания BSP, поскольку мы работаем с Ultra96 и используем JTAG/UART pd, нам нужно установить для stdin/stdout значение PSU_UART1.

Чтобы загрузить и запустить приложение, нам нужно использовать FSBL для загрузки битового файла и образа MicroBlaze в DDR.

Однако нам нужно обновить FSBL, чтобы переключить GPIO до его завершения, чтобы разбудить MicroBlaze и начать выполнение программы.

Мы делаем это, добавляя следующий код в функцию XFsbl_HookBeforeHandoff(), которая находится в файле XFsbl_hooks.c.

Этот код включает GPIO в качестве выхода и обеспечивает высокий выход.

Прежде чем мы создадим FSBL, если мы хотим увидеть отладочные отпечатки, нам нужно включить символ FSBL_DEBUG_INFO.

Создав FSBL и приложение, мы можем создать загрузочный образ и загрузить его на плату.

Хотя, если мы хотим отладить приложение, а мы, вероятно, это сделаем, мы можем использовать терминал XSCT для подключения к MicroBlaze.

Давайте кратко рассмотрим, как мы можем это сделать. Первое, что нужно сделать в XSCT, — это подключиться, введя connect.

После подключения, если вы посмотрите под системным отладчиком, когда он подключен к работающей цели, вы увидите следующее.

Если вы введете цель команд в XSCT, вы увидите следующий список целей.

Чтобы подключиться к MicroBlaze, введите ta 5

После этого мы можем остановить MicroBlaze с помощью команды СТОП.

Затем мы можем загрузить приложение с помощью команды dow app.elf. Перед загрузкой приложения обратите внимание на то, что работа напрямую соответствует местоположению приложения; в противном случае вам нужно указать путь.

Как только приложение загружено, мы можем запустить приложение, и вы должны увидеть вывод hello world в конце вывода FSBL, если вы посмотрите в окно терминала.

Возможность использовать MicroBlaze в PL таким образом обеспечивает максимальную гибкость для наших систем Zynq / Zynq MPSoC.

Как я упоминал выше, мы также рассмотрим, как мы можем настроить MicroBlaze с помощью двухпортового BRAM в ближайшее время в блоге.

Посмотрите мои проекты FPGA/SoC:Адам Тейлор на Hackster.io

Получите код:ATaylorCEngFIET (Адам Тейлор)

Доступ к архивам MicroZed Chronicles с более чем 260 статьями о Zynq / Zynq MpSoC, которые еженедельно обновляются на MicroZed Chronicles.