Этот пример показывает, как проектировать фильтры, которые работают с мультипиксельным входным видеопотоком. Используйте многопиксельную потоковую передачу для обработки видео с высоким разрешением или высокой частотой кадров с той же синтезированной тактовой частотой, что и однопиксельный потоковый интерфейс. Многопиксельная потоковая передача также улучшает скорость симуляции и пропускную способность, потому что для обработки каждой системы координат требуется меньше итераций, при этом сохраняя аппаратные преимущества потокового интерфейса.
Модель примера имеет три подсистемы, каждая из которых выполняет один и тот же алгоритм:
SinglePixelGaussianEdge: Использует блоки Image Filter и Edge Detector для работы с однопиксельным потоком. Эта подсистема показывает, как скорости и интерфейсы для однопиксельной потоковой передачи сравниваются с мультипиксельными проектами.
MultiPixelGaussianEdge: Использует блоки Image Filter и Edge Detector для работы с мультипиксельным потоком. Эта подсистема показов, как использовать мультипиксельный интерфейс с библиотечными блоками.
MultiPixelCustomGaussianEdge: Использует блок Line Buffer для создания Гауссова фильтра и обнаружения ребра Собеля для мультипиксельного потока. Эта подсистема показывает, как использовать выход Line Buffer для мультипиксельного проекта.
Обработка мультипиксельных видеопотоков позволяет достигать более высоких частот систем координат без соответствующего увеличения тактовой частоты. Каждая из подсистем может достичь 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 в Пиксели путем установки значения Number of pixels 4
или 8
. Значение по умолчанию 1
возвращает скалярный поток пикселей с частотой дискретизации Total pixels на линию * Total video lines быстрее, чем частота систем координат. Эта скорость показывает красный цвет в модели примера. Две мультипиксельные подсистемы используют мультипиксельный поток с количеством пикселей, установленным на 4
. Это строение возвращает 4 пикселя на каждом тактовом цикле и имеет частоту дискретизации (Total pixels per line/4) * Total video lines. Более низкая скорость выхода, которая является зеленой в модели, показывает, что вы можете увеличить скорость входного кадра или разрешение в 4 раза и, следовательно, обработать в 4 раза больше пикселей в той же системе координат периоде, используя ту же тактовую частоту, что и в случае с одним пикселем.
Подсистемы SinglePixelGaussianEdge и MultiPixelGaussianEdge вычисляют один и тот же результат с помощью блоков Image Filter и Edge Detector.
В MultiPixelGaussianEdge блоки принимают и возвращают четыре пикселя на каждом такте. Вам не придется конфигурировать блоки для мультипиксельной потоковой передачи, они обнаруживают размер входа на порте. The pixelcontrol
шина указывает валидность и местоположение в системе координат каждого набора из четырех пикселей. Блоки буферизуют поток [4x1], образуя четыре ядра [KernelHeight x KernelWidth], и вычисляют четыре свертки параллельно, получая выход [4x1].
Подсистема MultiPixelCustomGaussianEdge использует блок Line Buffer для реализации пользовательского алгоритма фильтрации. Эта подсистема похожа на то, как библиотечные блоки внутренне реализуют мультипиксельные операции с ядром. Блоки Image Filter и Edge Detector используют более подробную оптимизацию, чем показано здесь. Эта реализация показывает начальную точку для создания пользовательских мультипиксельных алгоритмов с использованием выхода блока Линии Buffer.
Пользовательский фильтр и пользовательский детектор ребер используют блок Line Buffer, чтобы вернуть последующие области [KernelHeight x NumberofPixels]. Каждая область передается в подсистему KernelIndexer, которая использует логику буферизации и индексации для формирования ядер фильтров Number of Pixels * [KernelHeight x KernelWidth]. Затем каждое ядро передается в отдельную подсистему FilterKernel, чтобы выполнять свертки параллельно.
Подсистема KernelIndexer формирует 4 [5x5] фильтра ядер из 2-D выходы блока Line Buffer.
Схема показывает, как ядро фильтра извлекается из выходного потока [5x4] для ядра, который центрирован на первом пикселе в выходе [4x1]. Это первое ядро включает пиксели из 2 смежных выходов [5x4] Line Buffer.
Ядро, центрированное на последнем пикселе выходного сигнала [4x1], также включает третий соседний выход [5x4]. Итак, чтобы сформировать четыре ядра [5x5], подсистема должна получить доступ к столбцам из трех матриц [5x4].
Подсистема KernelIndexer использует текущий вход [5x4] и хранит еще две матрицы [5x4], используя регистры, активированные shiftEnable
. Этот проект подобен линии задержки, используемой с Line Buffer, использующей потоковую передачу одного пикселя. Затем подсистема получает доступ к пиксельным данным через столбцы, чтобы сформировать четыре ядра [5x5]. Блок Image Filter использует эту же логику внутри, когда блок имеет мультипиксельный вход. Блок автоматически проектирует эту логику во время компиляции для любого поддерживаемого размера ядра.
Поскольку входной мультипиксельный поток является вектором [4x1], фильтры должны выполнить четыре свертки для каждого цикла, чтобы идти в ногу с входящими данными. Существует четыре параллельные подсистемы FilterKernel, каждая из которых выполняет одну и ту же операцию. Умножение матрицы [5x5] реализовано как умножение вектора [25x1] путем уплощения матрицы входа и использования подсистемы For Each, содержащей конвейерный умножитель. Выход передается в дерево сумматоров. Дерево сумматоров также конвейерно, и задержка трубопровода применяется к pixelcontrol
сигнал для соответствия. Результаты четырех подсистем FilterKernel затем объединяются в выходной вектор [4x1].
Чтобы соответствовать алгоритму блока Edge Detector, этот пользовательский детектор ребер использует [3x3] размер ядра. Сравните эту подсистему KernelIndexer для обнаружения ребер [3x3] с описанным выше ядром [5x5]. Алгоритм все еще должен получить доступ к трем последовательным матрицам из выхода блока Line Buffer (включая заполнение по обе стороны ядра). Однако алгоритм сохраняет меньше столбцов, чтобы сформировать меньшее ядро фильтра.
Для мультипиксельного потока [4x1] логика KernelIndexer будет выглядеть аналогично [11x11] размеру ядра. При этом размере количество пикселей заполнения, (floor(11/2)) = 5
, будет перекрываться на двух [11x4] матрицах, возвращенных из линейного буфера. Это перекрытие означает, что алгоритму нужно будет хранить пять матриц [5x4] из Line Buffer, чтобы сформировать четыре ядра [11x11] для каждого цикла.
В примере по умолчанию строение, один пиксель, мультипиксельные и пользовательские мультипиксельные подсистемы запуска параллельно. Скорость симуляции ограничена временем обработки однопиксельного пути, потому что для обработки того же размера системы координат требуется больше итераций. Чтобы наблюдать улучшение скорости симуляции для мультипиксельной потоковой передачи, закомментируйте однопиксельный путь данных.
HDL был сгенерирован из подсистемы MultiPixelGaussianEdge и подсистемы MultiPixelCustomGaussianEdge и помещен через Place и Route на Xilinx™ ZC706 плату. Подсистема MultiPixelCustomGaussianEdge, которая не пытается оптимизировать коэффициенты, имела следующие результаты -
T = 4x2 table Resource Usage _________ _____ DSP48 108 Flip Flop 4195 LUT 4655 BRAM 12
Подсистема MultiPixelGaussianEdge, которая использует оптимизированные блоки Image Filter и Edge Detector, использует меньше ресурсов, как показано в таблице ниже. Это сравнение показывает экономию ресурсов, достигнутую, потому что блоки анализируют структуру фильтра и предварительно добавляют повторные коэффициенты.
T = 4x2 table Resource Usage _________ _____ DSP48 16 Flip Flop 3959 LUT 1797 BRAM 10
Edge Detector | Frame To Pixels | Image Filter | Pixels To Frame