Вертикальное зеркальное отражение видео Используя внешнюю память

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

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

  • Оценочный комплект Xilinx® Zynq® ZC706 + дополнительная плата FMC-HDMI-CAM

Введение

Чтобы инвертировать входящий видеопоток из источника HDMI (RX), логика FPGA пишет видеокадрам линию за один раз к внешней памяти. Позже, логика FPGA читает сохраненное изображение назад, линия за один раз в обратном порядке, таким образом инвертируя изображение вертикально. Видеокадр чтения затем отправляется в HDMI (TX). Видеокадры хранятся в буфере пинг-понга в PL-DDR, который включает независимую запись памяти и операции чтения. Отдельное, PS-DDR используется для хранения видеокадров во время передачи данных к HDMI. Схема ниже подсвечивает полный поток данных.

Моделирование

В топ-модели, soc_video_flipping_top логика FPGA соединяется с внешней памятью и HDMI В / блоках.

soc_video_flipping_fpga модель включает логику FPGA. Это соединяется как модель, на которую ссылаются, от топ-модели. Это изображение показывает содержимое подсистемы VideoFlipping в soc_video_flipping_fpga модели.

Логика FPGA состоит из четырех ключевых компонентов:

  • Ведущий Диспетчер Записи AXI4 получает видео от HDMI Rx и пишет данные в DDR. Одна линия данных записана на пакет. Когда одна система координат заканчивается, она отправляет сигнал конца системы координат (EOF) инициировать Контроллер Ведущего устройства AXI4 Рида.

  • Контроллер Ведущего устройства AXI4 Рида читает строки видеокадра от буфера пинг-понга внешней памяти в обратном порядке. Одна строка данных прочитана на пакет. Новые запросы чтения приостановлены, если нисходящий блок Read FIFO не готов обработать данные. Когда система координат полностью читается из памяти, Диспетчер Рида ожидает следующего сигнала EOF от Диспетчера Записи начать читать в новой системе координат. Если контроллер памяти не имеет достаточного количества полосы пропускания, контроллер чтения может все еще обрабатывать более ранний кадр, когда диспетчер записи закончил написать в следующей системе координат. В этом случае Контроллер Рида выдаст ошибку errFrameDrop сигнал.

  • Запишите, что FIFO буферизует данные, записанные в буфер пинг-понга, когда диспетчер памяти DDR утверждает сигнал противодавления (подсветил Красную стрелу), чтобы позволить видеоданным из источника HDMI быть обработанными. Запись FIFO должна быть достаточно большой, чтобы предотвратить переполнение и вместить любую задержку в письменной форме с внешней памятью. В этом примере глубина Записи FIFO собирается в 2 048 вместить 1 линию HD противодавления.

  • FIFO Рида буферизует данные от Диспетчера Рида, когда DMA в Tx HDMI утверждает сигнал противодавления (подсветил Красную стрелу). Противодавление распространено к восходящему потоку Контроллер Ведущего устройства AXI4 Рида, чтобы прекратить запрашивать данные от DDR. Заметьте, что, поскольку Контроллер Ведущего устройства AXI4 Рида не сделает паузу во время пакета чтения, важно убедиться, что FIFO Рида имеет достаточно комнаты, чтобы хранить данные даже после его готового сигнала de-asserts. В этом примере глубина FIFO Рида установлена в 2 048, и почти весь порог устанавливается к 128. Когда FIFO имеет 128 выборок, FIFO Рида отправляет 'Полный' сигнал в восходящий блок, чтобы остановить любые новые запросы чтения. В это время это может буферизовать 2048-128 = 1 920 выборок без переполнения. Установка достаточна даже для системы координат на 1 080 пунктов.

В аппаратной реализации Tx HDMI включает два кадровых буфера DMA и один контроллер синхронизации видео (VTC) для устойчивого и бесплатного видео слезы выход. DMAs может отправить противодавление в DUT, когда контроллер памяти занят другим чтением или транзакциями записи. В модели FPGA противодавление сигнализирует о hdmiOutputReady установлен во всегда верный для симуляции только (который указывает, что контроллер памяти всегда доступен). На практике этот сигнал часто переключается между высоким и низким. Блок Read FIFO в DUT используется, чтобы обработать это противодавление.

Симуляция

Требование полосы пропускания памяти должно быть рассмотрено при разработке приложения, которое взаимодействует через интерфейс с внешней памятью. Каков уровень, которому необходимо передать данные удовлетворить требованиям алгоритма? А именно, для приложений видения, каковы формат кадра и частота кадров, которую необходимо смочь обеспечить?

Для выбранной платы ZC706 контроллер PL DDR сконфигурирован с 64-битным интерфейсом AXI4-Slave, достигающим 200 МГц. Получившаяся полоса пропускания составляет 1 600 Мбайт/с. Давайте сначала оценим, если полоса пропускания памяти достаточна, чтобы обеспечить 1920x1080p видеопоток на уровне 60 кадров в секунду. Когда формат видео является YCbCr 4:2:2, мы требуем 2 байт на пиксель. Однако для чтения DUT AXI4 и записи, каждый пиксель дополнен нулем к 4 байтам, это приравнивается к требованию пропускной способности

$$2\times 4\times 1920\times 1080\times 60 = 995.328 \, \textrm{MB/s}$$

Расчетная пропускная способность удовлетворяет требованию полосы пропускания.

Чтобы симулировать случай на 1 080 пунктов 60 футов в секунду, запустите следующую команду и затем симулируйте модель

soc_video_flipping_set_parameters("1080p")

Выход показывают как ниже.

Если вы хотите смоделировать другой DUT доступ к той же внешней памяти, можно использовать блок генератора трафика памяти, чтобы симулировать конкуренцию перед реализацией, таким образом, можно сэкономить усилия на аппаратной отладке. В этой модели, двух блоках генератора трафика памяти, Contention Write и Contention Read блокируйтесь, моделируются, чтобы подражать транзакциям AXI другого кадрового буфера. Пропускная способность двух генераторов трафика памяти вычисляется как

$$2\times 2\times 1920\times 1080\times 60 = 497.664 \, \textrm{MB/s}$$

Общая необходимая полоса пропускания контроллера памяти -$497.664 + 995.328 = 1492.992 \, \textrm{MB/s}$ Который меньше ее максимальной полосы пропускания 1 600 Мбайт/с. Не прокомментируйте блок Contention Write и Contention Read, симулируйте модель для 1080P снова, выход является teared в нижней части. Вы также получите утверждение блоком 'soc_video_flipping_fpga/VideoFlipping/Assertion', что система координат пропущена.

Симуляция показывает, что контроллер памяти не может удовлетворить требование полосы пропускания для DUT и генераторов трафика памяти. Вы, возможно, должны рассмотреть сокращение разрешения системы координат или создание алгоритм DUT более эффективный, например, реализация упаковывает/распаковывает пиксель YCbCr на 16 битов к 32 битам кроме нулевого дополнения.

Топ-модель запускается в Режиме Accelerator по умолчанию. Если вы хотите смотреть записанные данные в Logic Analyzer, изменить топ-модель в Режим normal mode. Лучше симулировать с 480 пунктами или меньшим форматом кадра для более быстрых результатов.

Реализация

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

  • HDL Coder™

Перед реализацией,

  • Установите режим симуляции на 'Normal' на топ-модели.

  • Закомментируйте Contention Write и Contention Read блоки.

  • Запустите эту команду, если модель была изменена для формата кадра кроме 1 080 пунктов.

soc_video_flipping_set_parameters("1080p")

Чтобы реализовать модель на поддерживаемой плате SoC используют инструмент SoC Builder (SoC Blockset). Убедитесь, что вы установили требуемые продукты и программное обеспечение поставщика FPGA перед реализацией. Открытому Разработчику SoC (SoC Blockset) кликают, кнопка Configure, Build, & Deploy в панели инструментов и выполняют эти шаги:

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

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

  3. Задайте папку проекта на экране 'Select Project Folder'. Нажмите 'Next'.

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

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

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

  7. Нажмите 'Test Connection' на экране 'Connect Hardware', чтобы протестировать возможность соединения хоста - компьютера с платой SoC. Нажмите 'Next', чтобы перейти к экрану 'Run Application'.

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

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

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

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

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

Четыре светодиода на ZC706 управляются сигналами и могут использоваться для отладки проекта:

  • GPIO_LED_LEFT управляется Ведущим устройством AXI4, записывают данные допустимые. Это должно быть включено или мигание, когда приложение запускается.

  • GPIO_LED_CENTER управляется считанными допустимыми данными Ведущего устройства AXI4. Это должно быть включено или мигание, когда приложение запускается.

  • GPIO_LED_RIGHT управляется Записью готовый FIFO. Это должно быть всегда включено, в противном случае AXI4 Записывают данные, пропущены.

  • GPIO_LED_0 управляется Чтением готовый FIFO. Это могло быть включено или прочь. Данным не будут заглядывать этот FIFO, потому что восходящий контроллер обработает это противодавление правильно.

Заключение

Этот пример показывает моделирование Основных интерфейсов AXI4 для доступа к внешней памяти случайным способом с помощью SoC Blockset. Можно использовать этот метод для приложений видения модели, включающих внешнюю память. Одним таким примером является Контрастная Ограниченная Адаптивная Эквализация Гистограммы с Внешней памятью, которая создает далее на этом примере.

Смотрите также

(SoC Blockset) | (SoC Blockset) | (SoC Blockset)

Похожие темы