Приложения обработки видео часто хранят полный кадр видеоданных для обработки кадра и модификации следующего кадра. В таких конструкциях видеокадры хранятся во внешней памяти, в то время как ресурсы FPGA используются для обработки одних и тех же данных. В этом примере показано, как создать видеоприложение со входом и выходом HDMI, выполняющее выравнивание гистограммы с использованием внешней памяти для буферизации видеокадров.
Поддерживаемая аппаратная платформа
Оценочный комплект Xilinx ® Zynq ® ZC706 + мезонинная карта FMC-HDMI-CAM
Рассмотрим приложение, включающее непрерывную потоковую передачу видеоданных через FPGA. В верхней модели soc_histogram_equalization_top FPGA вычисляет гистограмму входящего видеопотока, в подсистеме 'FPGA', при этом потоковая передача того же видеопотока во внешнюю память для хранения. Как только гистограмма вычислена и накоплена по всему видеокадру, переключается сигнал синхронизации для запуска обратного считывания сохраненного кадра из внешней памяти. Затем вектор накопленной гистограммы применяют к видеопотоку, считанному из внешней памяти, для выполнения алгоритма выравнивания. Буфер кадров внешней памяти моделируется с использованием блока «Канал памяти» в AXI4-Stream Video Frame Buffer режим.
Блок «HDMI Input» считывает видеофайл и подает видеоданные и управляющие сигналы в нижестоящие блоки обработки FPGA. Видеоданные находятся в формате YCbCr 4:2:2, а управляющие сигналы находятся в pixel control bus формат. Блок «HDMI Output» считывает видеоданные и управляющие сигналы в том же формате, что и на выходе блока «HDMI Input», и обеспечивает визуальный вывод с помощью блока «Video Display».
Блок Push Button позволяет обходить алгоритм выравнивания гистограммы, направляя необработанные выходные данные из буфера кадров внешней памяти в выходные данные.

При разработке приложения, взаимодействующего с внешней памятью, необходимо учитывать ряд требований:
Пропускная способность: Какова скорость передачи данных в/из памяти для удовлетворения требований вашего алгоритма? Какой размер кадра и частоту кадров необходимо поддерживать специально для приложений технического зрения?
Задержка: Сколько времени может выдержать ваш алгоритм между запросом и получением данных? Вам нужен непрерывный поток данных, без пробелов? Можно ли буферизовать образцы, входящие в алгоритм, чтобы предотвратить потерю данных при блокировке доступа к памяти?
Для этого примера выравнивания гистограммы определены следующие требования:
Пропускная способность должна быть достаточной для поддержания видеопотока 1920x1080p со скоростью 60 кадров в секунду.
Задержка должна быть достаточно низкой, чтобы не сбрасывать кадры.
С помощью вышеуказанного требования к пропускной способности можно вычислить значение, необходимое для буфера кадров:

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

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

В общем, ваш алгоритм будет частью более крупного приложения SoC. В таких приложениях, вероятно, будут другие алгоритмы, также требующие доступа к внешней памяти. В этом сценарии необходимо учитывать влияние доступа к памяти другого алгоритма на производительность и требования алгоритма. Предполагая, что алгоритм совместно использует канал памяти с другими компонентами, следует учитывать следующее:
Какова общая доступная пропускная способность памяти в системе SoC?
Как алгоритм адаптируется к общей полосе пропускания памяти?
Может ли ваш алгоритм выдерживать увеличенную задержку чтения/записи?
С помощью соответствующего моделирования дополнительных потребителей памяти в общем приложении вы можете систематически разрабатывать свой алгоритм в соответствии с вашими требованиями в ситуациях, когда доступ к памяти не является исключительным для вашего алгоритма.
Чтобы избежать моделирования всех устройств чтения и записи в системе в целом, можно использовать блоки генератора трафика памяти для использования полосы пропускания чтения/записи в системе путем создания запросов доступа. Таким образом, можно моделировать дополнительные доступы к памяти в системе без явного моделирования.
Моделирование системы без дополнительных потребителей памяти и просмотр графика производительности памяти из блока «Контроллер памяти».

Ниже приведены основные параметры памяти:
Ведущий 1: запись в буфер кадров
Мастер 2: считывание буфера кадров
Master 3: Contention (генератор трафика памяти) (комментируется)
Обратите внимание, что оба активных мастера потребляют 248,8 МБ/с пропускной способности памяти.
Другие потребители памяти: учтите, что ваш алгоритм является частью более крупной системы, и вторичный алгоритм разрабатывается коллегой или сторонним производителем. В этом сценарии вторичный алгоритм будет разрабатываться отдельно для интересов времени и разделения работы. Вместо объединения двух алгоритмов в одно моделирование можно смоделировать доступ к памяти вторичного алгоритма с помощью генератора трафика памяти и смоделировать влияние, если таковое имеется, на алгоритм.
Например, предположим, что для вторичного алгоритма предусмотрены следующие требования к памяти:
Пропускная способность: 1150 МБ/с
Учитывая, что основной алгоритм потребляет ~ 500 МБ/с пропускной способности памяти, а общая доступная пропускная способность памяти составляет 1600 МБ/с, мы знаем, что общая потребность в пропускной способности нашей системы превышает общую доступную пропускную способность на ~ 50 МБ/с.
Чтобы включить моделирование вторичного алгоритма доступа к памяти, раскомментируйте Contention Блок генератора трафика памяти. Параметры маски блока показаны ниже.

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

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

Для этого раздела требуются следующие продукты:
Coder™ ЛПВП
Пакет поддержки SoC Blockset для устройств Xilinx. Дополнительные сведения о пакете поддержки см. в разделе Оборудование, поддерживаемое блоками SoC
Для реализации модели на поддерживаемой плате SoC используйте приложение SoC Builder. Откройте маску подсистемы «FPGA» и установите вариант модели на «Pixel based processing».
Прокомментируйте блок «Конкуренция».
Нажмите кнопку «Настроить, построить и развернуть» на панели инструментов, чтобы открыть SoC Builder
Выберите «Build Model» на экране «Setup». Нажмите кнопку «Далее».
Нажмите кнопку «View/Edit Memory Map» для просмотра карты памяти на экране «Review Memory Map». Нажмите кнопку «Далее».
Укажите папку проекта на экране «Select Project Folder». Нажмите кнопку «Далее».
Выберите «Build, load and run» на экране «Select Build Action». Нажмите кнопку «Далее».
Нажмите кнопку «Validate», чтобы проверить совместимость модели для реализации на экране «Validate Model». Нажмите кнопку «Далее».
Нажмите кнопку «Build», чтобы начать построение модели на экране «Build Model». Внешняя оболочка откроется, когда начнется синтез FPGA. Нажмите кнопку «Далее».
Нажмите кнопку «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.