Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Межкадровое вычитание в реальном времени
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
edren_baton
Всем доброго времени суток!

Есть у меня задача: в видеосистеме реализовать межкадровое вычитание и результат этого вычитания выводить.

По моим представлениям, для этого потребуется три буфера в памяти:
1. Предыдущий кадр
2. Текущий кадр
3. Результат вычитания (используется для обеспечения непрерывности вывода данных)

На данный момент работает следующая система на шине Avalon-ST:

Clocked Video Input >> Всякие фильтры >> Frame Buffer (данные во внешней памяти RAM) >> Clocked Video Output

Есть мысли для решения применить SGDMA в следующем ключе:
- после "Всякие фильтры" устанавливаем SGDMA (stream to memory). Им заполняем 2 буфера памяти (два разных кадра).
- nios напрямую соединен с памятью, с его помощью происходит сравнение кадров и запись результата в 3й буфер.
- затем стоит SGMDA (memory to stream) и FIFO с выводом на clocked video output. Есть ли смысл вместо этой связки (SGDMA и FIFO) использовать Frame Buffer (можно ли этим компонентом напрямую из памяти читать, убрав вход Avalon Sink)?

Будет ли работать такая система? Насколько этот вариант оптимален?

Прошу помощи в определении направления дальнейших действий.
o_khavin
Для начала имеет смысл посчитать, хватит ли производительности NIOS-а для этой задачи.
Кроме того, было бы весьма рационально считать разницу сразу с приходящим сигналом (и буфером предыдущего кадра), а не сначала сохранять данные в память, а потом уже их читать для сравнения. Т.е. приходящие данные используются для сравнения и тут же пишутся в буфер (который будет использован на следующем кадре). В таком варианте двух буферов действительно хватит, в отличии от Вашей идеи, которая не учитывает, что видео как правило идёт непрерывно.
Результат сравнения тоже имеет смысл сразу выводить на выход. По крайней мере совершенно не понятно, зачем его где-то хранить перед выводом, если речь идёт про поточные операции.
warrior-2001
Самое простое - на пролете делать вычисление/вычитание и по интерфейсу AvalonST подавать на вход Frame Buffer. В зависимости от его настроек он сам выделит в памяти 2-3 страницы и будет со скоростью выходного потока читать их из памяти и выдавать! И никакого ниоса!
Блоки Clocked Video Input, Frame Buffer и Clocked Video Output ненадёжны в версии 11.1 SP2. Есть косяки в формировании потока при срывах синхронизации!
boul
Цитата(o_khavin @ Mar 5 2014, 13:08) *
Для начала имеет смысл посчитать, хватит ли производительности NIOS-а для этой задачи.
Кроме того, было бы весьма рационально считать разницу сразу с приходящим сигналом (и буфером предыдущего кадра), а не сначала сохранять данные в память, а потом уже их читать для сравнения. Т.е. приходящие данные используются для сравнения и тут же пишутся в буфер (который будет использован на следующем кадре). В таком варианте двух буферов действительно хватит, в отличии от Вашей идеи, которая не учитывает, что видео как правило идёт непрерывно.
Результат сравнения тоже имеет смысл сразу выводить на выход. По крайней мере совершенно не понятно, зачем его где-то хранить перед выводом, если речь идёт про поточные операции.


Да, все верно, достаточно двух буферов. Я сам так и делаю.
Во время прихода пикселей текущего кадра подгружать соответствующие пиксели предыдущего. Приходящие пиксели кадра записывается на место тех же пикселей предыдущего кадра. Нужно учесть что скорость работы с памятью должна быть в 2 раза выше скорости входного потока. Результат операции вычитания на выход. Что, кстати, будет выходом? Запись в другую память? внешний интерфейс?
edren_baton
Всем спасибо за ответы!

Цитата(o_khavin @ Mar 5 2014, 15:08) *
Для начала имеет смысл посчитать, хватит ли производительности NIOS-а для этой задачи.
...
Результат сравнения тоже имеет смысл сразу выводить на выход. По крайней мере совершенно не понятно, зачем его где-то хранить перед выводом, если речь идёт про поточные операции.


Если Nios не будет успевать, то третий буфер позволит выводить не битые кадры, пусть и повторяющиеся.

Цитата(warrior-2001)
Самое простое - на пролете делать вычисление/вычитание и по интерфейсу AvalonST подавать на вход Frame Buffer. В зависимости от его настроек он сам выделит в памяти 2-3 страницы и будет со скоростью выходного потока читать их из памяти и выдавать! И никакого ниоса!
Блоки Clocked Video Input, Frame Buffer и Clocked Video Output ненадёжны в версии 11.1 SP2. Есть косяки в формировании потока при срывах синхронизации!

На пролете эт, конечно, хорошо. =) А как правильно подгрузить информацию о предыдущем кадре? Если потребуются более сложные функции, та же корреляция, например, не слишком ли жестоко будет руками на HDL писать?
Через nios удобно управлять настройками отдельных блоков, так что совсем без него - тоже не очень )
Про 11.1 спасибо, но я 13й версией пользуюсь ) На моей памяти одна из самых стабильных была 9я версия, потом разом на 13ю перешел.

Цитата(boul)
Да, все верно, достаточно двух буферов. Я сам так и делаю.
Во время прихода пикселей текущего кадра подгружать соответствующие пиксели предыдущего. Приходящие пиксели кадра записывается на место тех же пикселей предыдущего кадра. Нужно учесть что скорость работы с памятью должна быть в 2 раза выше скорости входного потока. Результат операции вычитания на выход. Что, кстати, будет выходом? Запись в другую память? внешний интерфейс?


Подскажите, пожалуйста, механизм подгрузки предыдущих пикселей. =) Все эт хозяйство идет на Clocked Video Output, а там на монитор.
boul
Механизм это уже чисто схемотехническое решение, зависит, например, от типа памяти которую вы используете, у меня стоит DDR.
DDR controller -> FIFO -> Схема вычитания -> OUT
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.