Краткий обзор
: Ambilight - это система на некоторых телевизорах Philips, которая анализирует информацию о цвете на экране, а затем устанавливает несколько светодиодов на задней панели дисплея, чтобы проецировать цвет экрана на стену. Это довольно изящный эффект. Сейчас есть клоны этой системы, которые используют ПК для обработки видео и управления светодиодами. Я нахожу это немного излишним - использование всей машины для танцевания некоторых светодиодов ...
Я бы хотел изменить NeTV от bunnie для обработки незашифрованныхВидеопоток HDMI и привод некоторых светодиодов Я знаю, что NeTV был разработан для других целей, но я чувствую, что он может быть изменен для достижения моей цели. Меня не волнует подсистема Linux, спуфинг I2C, наложение видео и т. Д. На данный момент меня не интересует работа с зашифрованными потоками HDCP.
Блок-схема ПЛИС
Это блок-схема одного из слайдов презентации Банни. Остальной набор слайдов здесь .
Этот слайд, по-видимому, подразумевает, что пиксели видео фактически декодируются (необязательно дешифрованы ) .
Напоследок ... некоторые мои мысли и вопросы:
Можно ли это сделать на моем желаемом оборудовании? Если «да», продолжайте! Если "нет", скажи мне, что еще мне нужно!
Смогу ли я обрабатывать видеоинформацию без какой-либо внешней памяти? Насколько я могу судить, нет памяти, к которой FPGA может обращаться напрямую. Это, вероятно, зависит от того, какой алгоритм я использую для обработки видеоданных - чтобы использовать как можно меньше ОЗУ блока FPGA, я предполагаю, что я хотел бы использовать какое-то «итеративное суммирование» поступающих пикселей вместо хранения целого кадр данных изображения, а затем усреднение цветов. Любые намеки относительно реализации этого алгоритма? Как начать с этим - мое самое большое препятствие.
Я исследовал исходный код относительно того, где я должен «подключиться» к видеоданным.
Это выглядит как подходящее место:
я знаю, что это изображение длинное - это лучшее, что я мог сделать, делая его понятным для чтения. В этом виноват инструмент Xilinx!
Похоже, что это берет данные TMDS и выводит 8-битный для каждого цвета.У меня должен быть какой-то конечный автомат для драйвера светодиодов - каждый тактовый цикл он получает информацию о пикселях от любого модуля, который я создаю для обработки видеоданных.
Извините, если это многословно или долго - я пытаюсь быть тщательным ... Мне просто нужна помощь, чтобы справиться с этим. Это моя первая попытка проекта FPGA - некоторые могут сказать, что это слишком сложно для новичка, но я говорю ... надо с чего-то начинать :) Спасибо за чтение.
Ответы:
Я полностью основываю свой ответ на коде и документации модуля dvi_decoder и предполагаю, что он действительно работает так, как рекламируется. Этот файл является (измененным?) Копией IP-адреса в примечаниях приложения. Подключение видео Использование ввода-вывода TMDS в FPGA Spartan-3A и / или реализация видеоинтерфейса TMDS в FPGA Spartan-6 . Эти заметки приложения полны важных деталей, и я предлагаю вам внимательно их прочитать.
Как вы указали в вопросе, я предполагаю, что вы обрабатываете незашифрованные потоки, то есть потоки не HDCP. Я вполне уверен, что информация в проекте NeTV может быть адаптирована для дешифрования HDCP, но это потребует нетривиального объема дополнительной работы и будет на сомнительных юридических основаниях в зависимости от вашей юрисдикции.
Похоже, вы сможете получить необходимые данные из выходных данных блока dvi_decoder. Информация выходов блока 24-битного цвета с помощью проводов
red
,green
иblue
, синхронизированная с тактовой частотой пикселяpclk
. Выводитhsync
иvsync
предупреждает пользователя до конца строки / экрана соответственно. В общем, вы должны уметь усреднять на лету, используя эти выходы.Вам потребуются некоторая базовая логика для перевода
hsync
,vsync
и пиксельные часов в место (X, Y). Просто создайте два счетчика, один дляX
и один дляY
. УвеличениеX
на каждый пиксель часов. СбросX
на ноль приhsync
. ИнкрементY
на каждыйhsync
. СбросY
на ноль на каждомvsync
.Используя
red
,green
,blue
,X
иY
, вы можете сделать на лету усреднения. Сравнивая сX
иY
, вы можете определить, какой блок должен вносить каждый отдельный пиксель, если таковой имеется. Суммируйте значения цвета в регистре накопления. Чтобы получить среднее значение, вам нужно разделить значение в регистре на количество пикселей. Если вы умны, вы убедитесь, что количество пикселей является степенью двойки. Затем вы можете просто подключить MSB регистра к тому, что вы хотите управлять.Поскольку мы хотим управлять дисплеями во время накопления, нам потребуется двойная буферизация. Таким образом, нам понадобится два регистра на блок для каждого компонента. Если вы используете строку из 25 светодиодов, это означает, что вам потребуется 25 * 3 * 2 = 150 регистров. Это совсем немного, так что вы можете использовать блок памяти вместо регистров. Все зависит от ваших точных требований, эксперимент!
Я предполагаю , что вы будете управлять строкой во главе , как та , которая используется в исходном наборе Adafruit проекта . Вы должны быть в состоянии выяснить, как легко извлечь его из значений в регистрах с помощью SPI.
Модуль dvi_decoder является довольно сложным компонентом. Я предлагаю вам изучить примечания приложения в деталях.
Кроме того, если вы еще не приобрели NeTV для использования в этом проекте, я рекомендую вам также взглянуть на плату Atlys от Digilent . С двумя входами HDMI и двумя выходами HDMI, он, кажется, специально для проектов такого рода.
источник