exponenta event banner

Переворачивание видео по вертикали с использованием внешней памяти

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

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

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

Введение

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

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

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

Модель soc_video_flipping_fpga включает логику FPGA. Она связана как ссылочная модель из верхней модели. На этом рисунке показано содержимое подсистемы VideyFlipping в модели soc_video_flipping_fpga.

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

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

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

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

  • Считывание FIFO буферизирует данные от контроллера считывания, когда DMA в Tx HDMI подает сигнал противодавления (выделенная красная стрелка). Обратное давление распространяется на ведущий контроллер чтения AXI4 вверх по потоку, чтобы прекратить запрос данных от DDR. Обратите внимание, что, поскольку главный контроллер считывания AXI4 не будет приостанавливаться во время пакета считывания, важно убедиться, что Read FIFO имеет достаточно места для хранения данных даже после снятия сигнала готовности. В этом примере глубина FIFO считывания устанавливается равной 2048, а почти полный порог устанавливается равной 128. Когда FIFO имеет 128 выборок, Read FIFO посылает сигнал «Full» в восходящий блок, чтобы остановить любые новые запросы на чтение. Тем временем он может буферизировать 2048-128 = 1920 выборок без переполнения. Эта настройка достаточна даже для кадра 1080p.

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

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

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

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

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

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

Для моделирования случая 1080p 60fps выполните следующую команду, а затем смоделируйте модель.

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}$ его максимальной пропускной способности 1600 МБ/с. Uncomment Contention Write and Contention Read, имитировать модель для 1080P снова, выходные данные рвутся в нижней части. Вы также получите утверждение блока soc _ video _ flipping _ fpga/VideyFlipping/Assertion, который отбрасывает кадр.

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

По умолчанию верхняя модель запускается в режиме ускорителя. Если требуется проверить записанные данные в Logic Analyzer, измените верхнюю модель на обычный режим. Лучше всего моделировать с помощью 480p или меньшего размера кадра для более быстрого получения результатов.

Внедрение

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

  • Coder™ ЛПВП

Перед внедрением,

  • Установите режим моделирования «Normal» в верхней модели.

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

  • Выполните эту команду, если модель была изменена для размера кадра, отличного от 1080p.

soc_video_flipping_set_parameters("1080p")

Для реализации модели на поддерживаемой плате SoC используйте инструмент SoC Builder (SoC Blockset). Перед внедрением убедитесь, что установлены необходимые продукты и программное обеспечение поставщика FPGA. Чтобы открыть SoC Builder (SoC Blockset), нажмите кнопку «Настроить, построить и развернуть» на панели инструментов и выполните следующие действия.

  1. Выберите «Build Model» на экране «Setup». Нажмите кнопку «Далее».

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

  3. Укажите папку проекта на экране «Select Project Folder». Нажмите кнопку «Далее».

  4. Выберите «Build, load and run» на экране «Select Build Action». Нажмите кнопку «Далее».

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

  6. Нажмите кнопку «Build», чтобы начать построение модели на экране «Build Model». Внешняя оболочка откроется, когда начнется синтез FPGA. Нажмите кнопку «Далее».

  7. Нажмите кнопку «Test Connection» на экране «Connect Hardware» для проверки подключения хост-компьютера к плате SoC. Нажмите кнопку «Далее», чтобы перейти к экрану «Запуск приложения».

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

  1. Закройте внешнюю оболочку для завершения синтеза.

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

  3. Нажмите кнопку «Загрузить и выполнить», чтобы загрузить предварительно созданный поток битов.

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 управляется функцией Write FIFO ready. Он должен быть всегда включен, в противном случае AXI4 запись данных будет удалена.

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

Заключение

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

См. также

(блок SoC) | (блок SoC) | (блок SoC)

Связанные темы