Гистограмма эквализации с использованием буфера видеокадра

Приложения обработки видео часто хранят полную систему координат данных видео, чтобы обработать систему координат и изменить следующую систему координат. В таких проектах видеокадры хранятся во внешней памяти, в то время как ресурсы FPGA используются для обработки одних и тех же данных. Этот пример показывает, как спроектировать видео приложение с HDMI входом и выводом, выполняющим гистограмму эквализации, используя внешнюю память для буферизации видеокадра.

Поддерживаемая аппаратная платформа

  • Комплект для оценки ZC706 Xilinx ® Zynq ® + карта для мезонина FMC-HDMI-CAM

Проект и системные требования

Рассмотрим заявку, включающую непрерывную потоковую передачу видео данных через FPGA. В топ-модели soc_histogram_equalization_top FPGA вычисляет гистограмму поступающего видео потока, в подсистеме 'FPGA', при вытекании того же видео потока к внешней памяти для хранения. После вычисления и накопления гистограммы во всем видеокадре сигнал синхронизации переключается, чтобы инициировать обратное считывание сохранённой системы координат из внешней памяти. Накопленный вектор гистограммы затем применяется к видеопотоку, считанному из внешней памяти, для выполнения алгоритма эквализации. Буфер системы координат внешней памяти моделируется с помощью блока 'Memory Channel' в AXI4-Stream Video Frame Buffer режим.

Блок 'HDMI Входа' считывает видео файла и предоставляет видео данных и сигналы управления нисходящим блокам обработки FPGA. Видео данных в формате YCbCr 4:2:2, и сигналы управления в pixel control bus формат. Блок 'HDMI Выхода' считывает видеосигналы данных и управления в том же формате, как выводится блоком 'HDMI Входа', и обеспечивает визуальный выход с использованием блока Video Отображения.

Блок Push Button включает обход алгоритма эквализации гистограммы, маршрутизацию необработанного вывода из буфера системы координат внешней памяти на выход.

Существует ряд требований, которые необходимо учитывать при разработке приложения, которое взаимодействует с внешней памятью:

  • Пропускная способность: Какова скорость передачи данных в/из памяти, чтобы удовлетворить требования вашего алгоритма? Что конкретно для приложений зрения, каковы формат кадра и частота кадров, которые вы должны иметь возможность поддерживать?

  • Задержка: Каково максимальное количество времени, которое ваш алгоритм может терпеть между запросом и получением данных? Для приложений зрения вам нужен непрерывный поток данных, без разрывов? Вы можете буферизировать выборки внутренне к своему алгоритму в порядок, чтобы предотвратить потерю данных, когда доступ к памяти заблокирован?

Для этого примера гистограммы эквализации мы определили следующие требования:

  • Пропускная способность должна быть достаточной, чтобы поддерживать видеопоток 1920x1080p со скоростью 60 кадров в секунду.

  • Задержка должна быть достаточно низкой, чтобы не сбрасывать системы координат.

При вышеописанном требовании пропускной способности мы можем вычислить значение, которое требуется для буфера системы координат:

$$1920\times1080\times60 = 124.416\,\mathrm{Msps}$$

Поскольку формат видео является YCbCr 4:2:2, нам требуется 2 байта на пиксель (BPP), это равняется требованию пропускной способности

$$2\times124.416 = 248.832\,\mathrm{MB/s}$$

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

$$2\times248.832 = 497.664\,\mathrm{MB/s}$$

Проект с использованием SoC Blockset

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

  • Какова общая доступная пропускная способность памяти в системе SoC?

  • Как ваш алгоритм адаптируется к полосе пропускания общей памяти?

  • Может ли ваш алгоритм терпеть увеличенную задержку чтения/записи?

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

Чтобы избежать моделирования всех устройств чтения и средств записи памяти в общей системе, можно использовать блоки 'Memory Traffic Generator', чтобы использовать пропускную способность чтения/записи в вашей системе путем создания запросов доступа. Таким образом, вы можете симулировать дополнительные доступы к памяти в вашей системе без явного моделирования.

Моделирование дополнительных потребителей памяти

Симулируйте систему без дополнительных потребителей памяти и просмотрите график эффективности памяти из блока 'Memory Controller'.

Здесь хозяева памяти следующие:

  1. Мастер 1: Запись буфера системы координат

  2. Мастер 2: Считывание буфера системы координат

  3. Мастер 3: Конфликт (Генератор трафика памяти) (комментируется)

Обратите внимание, что оба активных хозяина потребляют 248,8 МБ/с полосы пропускания памяти.

Больше потребителей памяти: Примите во внимание, что ваш алгоритм является частью большей системы, и вторичный алгоритм разрабатывается коллегой или третьей стороной. В этом сценарии вторичный алгоритм будет разрабатываться отдельно для интереса времени и деления работы. Вместо того, чтобы объединять два алгоритма в одну симуляцию, можно смоделировать доступ к памяти вторичного алгоритма с помощью генератора трафика памяти и симулировать влияние, если оно есть, которое оно окажет на ваш алгоритм.

Например, предположим, что у вас есть следующие требования к памяти для вторичного алгоритма:

  • Пропускная способность: 1150 МБ/с

Учитывая, что основной алгоритм потребляет ~ 500 Мбайт/с полосы пропускания памяти, а общая доступная полоса пропускания памяти составляет 1600 Мбайт/с, мы знаем, что общая потребность в полосе пропускания для нашей системы превышает общую доступную полосу пропускания ~ на 50 Мбайт/с.

Чтобы включить моделирование доступа к памяти вторичного алгоритма, раскомментируйте Contention Блок генератора трафика памяти. Настройки маски блока показаны ниже.

Симуляция системы с доступами вторичного алгоритма к памяти приводит к следующему графику использования полосы пропускания памяти.

Как видим, на отметке 0,03 с - когда вторичный алгоритм начинает запросы доступа к памяти, другие мастера не достигают своей необходимой пропускной способности. Глядя на форму волны логического анализатора, мы видим, что это проявляется как сброшенные буферы для ведущего устройства записи буфера системы координат и состояния ожидания для ведущего устройства чтения буфера системы координат.

Реализация и запуск оборудования

Для этого раздела требуются следующие продукты:

  • HDL Coder™

Для реализации модели на поддерживаемой плате SoC используйте приложение SoC Builder. Откройте маску подсистемы 'FPGA' и установите вариант модели на 'Pixel based processing'.

Закомментируйте блок 'Confention'.

Нажмите кнопку 'Configure, Build, & Deploy' на панели инструментов, чтобы открыть SoC Builder

  • Выберите 'Build Model ' on ' Setup' экран. Нажмите 'Next'.

  • Нажмите 'View/Edit Memory Map', чтобы просмотреть карту памяти на экране 'Review Memory Map'. Нажмите 'Next'.

  • Укажите папку проекта на экране 'Select Project Folder'. Нажмите 'Next'.

  • Выберите 'Build, load and run ' on ' Select Build Action'. Нажмите 'Next'.

  • Нажмите 'Validate', чтобы проверить совместимость модели для реализации на экране 'Validate Model'. Нажмите 'Next'.

  • Нажмите 'Build', чтобы начать создание модели на экране 'Build Model'. Внешний интерпретатор откроется, когда начнется синтез FPGA. Нажмите 'Next'.

  • Выберите 'Next' для 'Load Bitstream'.

Синтез FPGA может занять более 30 минут. Чтобы сэкономить время, вы можете захотеть использовать предоставленный предварительно сгенерированный битовый поток путем следующих шагов:

  • Закройте внешний интерпретатор, чтобы завершить синтез.

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

  • Нажмите кнопку 'Load and Run', чтобы загрузить предварительно сгенерированный битовый поток и запустить модель на SoC-плате

copyfile(fullfile(matlabshared.supportpkg.getSupportPackageRoot,'toolbox','soc',...
         'supportpackages','xilinxsoc','xilinxsocexamples','bitstreams',...
         'soc_histogram_equalization_top-zc706.bit'), './soc_prj');

Сейчас модель работает на оборудовании. Чтобы получить использование полосы пропускания памяти в оборудовании, выполните следующие испытательные стенды aximaster для soc_histogram_equalization_top_aximaster.

Следующий рисунок показывает использование полосы пропускания памяти при развертывании приложения на оборудовании.

Сводные данные

Вы разработали видео приложение с HDMI ввода-вывода в реальном времени и буферизацией систем координат во внешней памяти. Вы исследовали эффекты других потребителей памяти на общую пропускную способность. Вы использовали SoC Builder, чтобы реализовать модель на оборудовании и проверить проект.