В этом примере показано, как проектировать фильтры, работающие на многопиксельном входном видеопотоке. Использование многопиксельной потоковой передачи для обработки видео с высоким разрешением или высокой частотой кадров с той же тактовой частотой, что и потоковый интерфейс с одним пикселем. Многопиксельная потоковая передача также повышает скорость и пропускную способность моделирования, поскольку для обработки каждого кадра требуется меньше итераций, сохраняя при этом аппаратные преимущества потокового интерфейса.
Примерная модель имеет три подсистемы, каждая из которых выполняет один и тот же алгоритм:
SinglePixelGaussianEdge: использует блоки «Фильтр изображения» и «Детектор края» для работы с однопиксельным потоком. Эта подсистема показывает, как скорости и интерфейсы для потоковой передачи с одним пикселом сравниваются с многопиксельными конструкциями.
MultiPixelGaussianEdge: использует блоки «Фильтр изображения» и «Детектор края» для работы с многопиксельным потоком. В этой подсистеме показано, как использовать мультипиксельный интерфейс с блоками библиотеки.
MultiPixelCustomGaussianEdge: использует блок «Буфер линии» для построения гауссова фильтра и обнаружения края Собеля для многопиксельного потока. В этой подсистеме показано, как использовать выходные данные линейного буфера для многопиксельного проектирования.
Обработка многопиксельных видеопотоков позволяет достичь более высоких скоростей кадров без соответствующего увеличения тактовой частоты. Каждая из подсистем может достичь 200MHz тактовой частоты на плате ZC706 Xilinx. Видеопоток 480p имеет суммарные пиксели на строку x Суммарные видеопостроки = 800 * 525 циклов на кадр. С помощью одного пиксельного потока можно обрабатывать 200M/ (800 * 525) = 475 кадров в секунду. В мультипиксельной подсистеме на каждом цикле обрабатывается 4 пикселя, что уменьшает число циклов на строку до 200. Это означает, что при многопиксельном потоке, работающем с 4 пикселями в момент времени, в 200MHz, в потоке 480p, 1900 кадров могут обрабатываться в секунду. Если разрешение увеличивается с 480p до 1080p, 80 кадров в секунду может быть достигнуто в случае одного пикселя против 323 кадров в секунду для 4 пикселей в момент времени или 646 кадров в секунду для 8 пикселей в момент времени.
![]()
Создание многопиксельного потока из блока Frame to Pixels путем установки для параметра Number of pixels значения 4 или 8. Значение по умолчанию 1 возвращает скалярный поток пикселей с частотой дискретизации Total pixels на строку * Total video lines быстрее, чем частота кадров. Эта скорость показывает красный цвет в примерной модели. Две мультипиксельные подсистемы используют мультипиксельный поток с числом пикселей, равным 4. Эта конфигурация возвращает 4 пикселя в каждом такте и имеет частоту дискретизации (Всего пикселей на строку/4) * Всего строк видео. Более низкая выходная скорость, зеленая в модели, показывает, что можно увеличить частоту входных кадров или разрешение в 4 раза и, следовательно, обрабатывать в 4 раза больше пикселей в том же периоде кадра, используя ту же тактовую частоту, что и в случае одного пикселя.
Подсистемы SinglePixelGaussianEdge и MultiPixelGaussianEdge вычисляют один и тот же результат с помощью блоков «Фильтр изображений» и «Детектор кромок».
В MultiPixelGaussianEdge блоки принимают и возвращают по четыре пикселя в каждом такте. Нет необходимости настраивать блоки для многопиксельной потоковой передачи, они обнаруживают входной размер порта. pixelcontrol шина указывает действительность и местоположение в кадре каждого набора из четырех пикселей. Блок блокирует поток [4x1], чтобы сформировать четыре ядра [KernelHeight x KernelWidth], и вычисляет четыре свертки параллельно, чтобы получить выход [4x1].
![]()
Подсистема MultiPixelCustomGaussianEdge использует блок Line Buffer для реализации пользовательского алгоритма фильтрации. Эта подсистема аналогична тому, как блоки библиотеки внутренне реализуют операции мультипиксельного ядра. Блоки «Фильтр изображения» и «Детектор кромок» используют более детальную оптимизацию, чем показано здесь. Эта реализация показывает начальную точку для построения пользовательских мультипиксельных алгоритмов с использованием выходных данных блока линейного буфера.
Пользовательский фильтр и пользовательский детектор кромок используют блок буфера линий для возврата последовательных областей [KernelHeight x NumberofPixels]. Каждая область передается подсистеме KernelIndexer, которая использует логику буферизации и индексирования для формирования ядер фильтров Number of Pixels * [KernelHeight x KernelWidth]. Затем каждое ядро передается в отдельную подсистему FilterKernel для параллельного выполнения сверток.
![]()
Подсистема KernelIndexer формирует 4 [5x5] ядра фильтров из 2-D выходных данных блока Line Buffer.
![]()
Диаграмма показывает, как ядро фильтра извлекается из выходного потока [5x4] для ядра, которое центрировано на первом пикселе в выводе [4x1]. Это первое ядро включает в себя пиксели из 2 соседних выходов [5x4] линейного буфера.
![]()
Ядро, центрированное на последнем пикселе в выводе [4x1], также включает в себя третий соседний вывод [5x4]. Таким образом, чтобы сформировать четыре ядра [5x5], подсистема должна получить доступ к столбцам из трех матриц [5x4].
![]()
Подсистема KernelIndexer использует текущий входной сигнал [5x4] и сохраняет еще две матрицы [5x4], используя регистры, разрешенные shiftEnable. Эта конструкция аналогична линии задержки с отводом, используемой с буфером линии, использующим потоковую передачу одного пикселя. Затем подсистема обращается к данным пикселей по столбцам для формирования четырех ядер [5x5]. Блок фильтра изображения использует эту же логику внутри, когда блок имеет многопиксельный вход. Блок автоматически создает эту логику во время компиляции для любого поддерживаемого размера ядра.
Поскольку входной многопиксельный поток является вектором [4x1], фильтры должны выполнять четыре свертки в каждом цикле, чтобы идти в ногу с поступающими данными. Существует четыре параллельных подсистемы FilterKernel, каждая из которых выполняет одну и ту же операцию. Умножение матрицы [5x5] осуществляется как умножение вектора [25x1] путем сглаживания входной матрицы и использования подсистемы For Each, содержащей конвейерный множитель. Выходной сигнал передается в дерево сумматоров. Дерево сумматоров также конвейерно, и задержка конвейера применяется к pixelcontrol сигнал для согласования. Результаты четырех подсистем FilterKernel затем объединяются в выходной вектор [4x1].
![]()
Для соответствия алгоритму блока Edge Detector этот пользовательский детектор краев использует размер ядра [3x3]. Сравните эту подсистему KernelIndexer для обнаружения границ [3x3] с ядром [5x5], описанным выше. Алгоритм по-прежнему должен получать доступ к трем последовательным матрицам с выхода блока линейного буфера (включая заполнение на каждой стороне ядра). Однако алгоритм экономит меньше столбцов, чтобы сформировать меньшее ядро фильтра.
![]()
Для многопиксельного потока [4x1] логика KernelIndexer будет выглядеть аналогично [11x11] размеру ядра. При таком размере количество пикселов заполнения, (floor(11/2)) = 5, наложится на две матрицы [11x4], возвращенные из буфера строк. Это перекрытие означает, что алгоритм должен хранить пять [5x4] матриц из линейного буфера, чтобы сформировать четыре ядра [11x11] в каждом цикле.
![]()
В примере конфигурации по умолчанию все подсистемы одного пикселя, мультипикселя и пользовательского мультипикселя работают параллельно. Скорость моделирования ограничена временем обработки пути с одним пикселем, поскольку для обработки одного и того же размера кадра требуется больше итераций. Чтобы наблюдать улучшение скорости моделирования для многопиксельной потоковой передачи, прокомментируйте путь к однопиксельным данным.
HDL был создан как из подсистемы MultiPixelGaussianEdge, так и из подсистемы MultiPixelCustomGaussianEdge и помещен через Place и Route на плату Xilinx™ ZC706. Подсистема MultiPixelCustomGaussianEdge, которая не пытается оптимизировать коэффициенты, имела следующие результаты -
T =
4x2 table
Resource Usage
_________ _____
DSP48 108
Flip Flop 4195
LUT 4655
BRAM 12
Подсистема MultiPixelGaussianEdge, использующая оптимизированные блоки «Фильтр изображений» и «Детектор кромок», использует меньше ресурсов, как показано в таблице ниже. Это сравнение показывает экономию ресурсов, достигнутую, поскольку блоки анализируют структуру фильтра и предварительно добавляют повторяющиеся коэффициенты.
T =
4x2 table
Resource Usage
_________ _____
DSP48 16
Flip Flop 3959
LUT 1797
BRAM 10
Детектор кромок | От кадра до пикселов | Фильтр изображений | Пикселы к кадру