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

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

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

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

Введение

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

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

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

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

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

  • AXI4 Master Write Controller получает видео от HDMI RX и записывает данные в DDR. Одна линия данных записывается на пакет. Когда одна система координат заканчивается, он отправляет конец системы координат (EOF) сигнала, чтобы запустить AXI4 Master Read Контроллера.

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

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

  • Read FIFO буферизует данные от контроллера Read Controller, когда DMA в HDMI Tx утверждает сигнал противодавления (подсвеченная красная стрела). Противодавление передается на верхний контроллер AXI4 Master Read Controller, чтобы остановить запрос данных из 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 только для симуляции (что указывает на то, что контроллер памяти всегда доступен). На практике этот сигнал часто переключается между высоким и низким. Блок Read FIFO в DUT используется для обработки этого противодавления.

Симуляция

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

Для выбранной платы ZC706 контроллер PL DDR сконфигурирован с 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 60 fps, запустите следующую команду, а затем симулируйте модель

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 Confention Write и Confention Read, моделируйте модель для 1080P еще раз, выход выделяется внизу. Вы также получите подтверждение от блока 'soc _ video _ flipping _ fpga/VideoFlipping/Assertion', что система координат будет сбрасываема.

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

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

Реализация

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

  • HDL Coder™

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

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

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

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

soc_video_flipping_set_parameters("1080p")

Для реализации модели на поддерживаемой плате SoC используйте инструмент SoC Builder (SoC Blockset). Перед реализацией убедитесь, что установлены необходимые продукты и программное обеспечение поставщиков FPGA. Чтобы открыть SoC Builder (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 Оборудования', чтобы проверить связь хоста-компьютера с платой СнК. Нажмите '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 Master. Он должен быть включен или мигать, когда приложение работает.

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

  • GPIO_LED_RIGHT управляется функцией Write FIFO ready. Оно должно быть всегда включено, в противном случае AXI4 Write data get drop.

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

Заключение

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

См. также

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

Похожие темы