Как создать клон Ambilight на базе FPGA?

10


Краткий обзор

: Ambilight - это система на некоторых телевизорах Philips, которая анализирует информацию о цвете на экране, а затем устанавливает несколько светодиодов на задней панели дисплея, чтобы проецировать цвет экрана на стену. Это довольно изящный эффект. Сейчас есть клоны этой системы, которые используют ПК для обработки видео и управления светодиодами. Я нахожу это немного излишним - использование всей машины для танцевания некоторых светодиодов ... Я бы хотел изменить NeTV от bunnie для обработки незашифрованныхВидеопоток HDMI и привод некоторых светодиодов Я знаю, что NeTV был разработан для других целей, но я чувствую, что он может быть изменен для достижения моей цели. Меня не волнует подсистема Linux, спуфинг I2C, наложение видео и т. Д. На данный момент меня не интересует работа с зашифрованными потоками HDCP.

NeTV схемы

Исходный код NeTV

Блок-схема ПЛИС Блок-схема NeTV
Это блок-схема одного из слайдов презентации Банни. Остальной набор слайдов здесь .

Слайд, показывающий HSYNC, VSYNC, PIXCLK
Этот слайд, по-видимому, подразумевает, что пиксели видео фактически декодируются (необязательно дешифрованы ) .

Напоследок ... некоторые мои мысли и вопросы:

  1. Можно ли это сделать на моем желаемом оборудовании? Если «да», продолжайте! Если "нет", скажи мне, что еще мне нужно!

  2. Смогу ли я обрабатывать видеоинформацию без какой-либо внешней памяти? Насколько я могу судить, нет памяти, к которой FPGA может обращаться напрямую. Это, вероятно, зависит от того, какой алгоритм я использую для обработки видеоданных - чтобы использовать как можно меньше ОЗУ блока FPGA, я предполагаю, что я хотел бы использовать какое-то «итеративное суммирование» поступающих пикселей вместо хранения целого кадр данных изображения, а затем усреднение цветов. Любые намеки относительно реализации этого алгоритма? Как начать с этим - мое самое большое препятствие.

  3. Я исследовал исходный код относительно того, где я должен «подключиться» к видеоданным.
    Это выглядит как подходящее место:
    Блок-схема декодера DVI
    я знаю, что это изображение длинное - это лучшее, что я мог сделать, делая его понятным для чтения. В этом виноват инструмент Xilinx!
    Похоже, что это берет данные TMDS и выводит 8-битный для каждого цвета.

  4. У меня должен быть какой-то конечный автомат для драйвера светодиодов - каждый тактовый цикл он получает информацию о пикселях от любого модуля, который я создаю для обработки видеоданных.

Извините, если это многословно или долго - я пытаюсь быть тщательным ... Мне просто нужна помощь, чтобы справиться с этим. Это моя первая попытка проекта FPGA - некоторые могут сказать, что это слишком сложно для новичка, но я говорю ... надо с чего-то начинать :) Спасибо за чтение.

dext0rb
источник
1
NeTV не декодирует поток HDMI. Он следует процессу согласования HDCP и шифрует новый поток для соответствия; Я не думаю, что вы сможете получить видео информацию от этого.
akohlsmith
Не могли бы вы опубликовать (ссылку на) соответствующие схемы? Также поможет объявление соответствующих модулей HDL.
drxzcl
1
@AndrewKohlsmith, так что наложение делается на конце телевизора? Ух, я понятия не имел, что HDMI сможет это сделать!
drxzcl
1
Я не уверен, что Вы сможете сделать все, что Вам нужно, без использования буфера кадров внешней памяти, но в любом случае, какой анализ цвета Вы планируете использовать? Если это БПФ, тогда это займет некоторое время, и я не уверен, что окружающий свет не будет слишком поздно для цвета видео. Я бы сказал, во-первых, попробуйте получить данные с HDMI и проверить, можете ли вы их проанализировать. Например, сделать фильтр нижних частот и вывести результат.
Сократ
1
Я помню, как читал это, когда вышел NeTV. Согласно этому посту, Банни использует хитроумную схему наложения, которая не требует расшифровки источника HDMI; он просто перекодирует его, когда это необходимо. Нет расшифровки зашифрованных потоков.
MNG

Ответы:

7

Я полностью основываю свой ответ на коде и документации модуля 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, он, кажется, специально для проектов такого рода.

drxzcl
источник
Н.П., спасибо за классный вопрос. Если у вас возникнут какие-либо конкретные проблемы с этим проектом, не стесняйтесь писать снова.
drxzcl
Кстати, (и это, безусловно, выходит за рамки вопроса) вы рассматривали возможность управления этим устройством от относительно громоздкой микроконтроллерной системы? Нечто подобное RaspberryPi примерно в 6 раз дешевле и должно быть в состоянии управлять светодиодами и отображать видео одновременно.
drxzcl
все еще жду, когда появится мой инструмент JTAG, чтобы я смог отладить его с помощью ChipScope ... собираюсь принять этот ответ; в нем изложен фундаментальный подход к решению этой проблемы. @drzxcl У меня уже есть netv в моем распоряжении. RaspPi - интересное предложение, но невозможно использовать hdmi в качестве источника видео.
dext0rb
Вы когда-нибудь заставляли это работать? Я хотел бы увидеть рецензию / видео!
drxzcl
Нет, не совсем. : | Я сделал наполовину светодиодный драйвер , но больше не успел в него разобраться. Надеюсь скоро.
dext0rb