Фоновая подсветка HDMI-FPGA-LED. Часть 1: Введение

Блог им. Perfer
Существует множество проектов/статей о реализации фоновой подсветки для монитора/телевизора типа PC-USB-MCU-LED (ссылки в конце топика) и каждый раз, как поднимается данная тема, возникает мысль: а почему бы не сделать автономное устройство ни как не привязанное напрямую к вычислительным ресурсам PC, ну или что-то вроде того. А почему бы и нет?!

Введение

Некоторые, возможные путей/методы реализации такого устройства:
  1. Вклиниться в аналоговый видеоканал между PC и дисплеем, по быстрому его (видео сигнал) оцифровать, выдержав синхронизацию кадра, получить цвет каждого пикселя на дисплеи, затем по некоторому алгоритму расчитать какой цвет фоновой подсветки должен быть и выдать PWM сигнал на светодиоды. После всех этих манипуляций оцифрованный сигнал необходимо обратно конвертировать в аналоговый и отправить дальше на дисплей.
    У данного метода одни только недостатки: аналоговая передача видеосигнала постепенно уходит в прошлое (спорный момент конечно, но все же); сложно и очень дорого оцифровывать быстро меняющийся видеосигнал; для обработки оцифрованного потока информации в реальном времени нужны производительные ПЛИС/DSP/MCU; возможны потери качества при обратном преобразовании цифрового в аналоговый сигнал; потребности в синхронизации кадра как принимаемого так и передаваемого видео сигналов; и т. д. Поэтому, предлагаю далее, варианты с обработкой аналогового сигнала не рассматривать вообще.
  2. Вклиниться в цифровой видеоканал между PC и дисплеем, выдержав синхронизацию кадра, получить цвет каждого пикселя на дисплеи, затем по некоторому алгоритму расчитать какой цвет фоновой подсветки должен быть и выдать PWM сигнал на светодиоды. После всех этих манипуляций принятый цифровой видео сигнал следует отправить дальше на дисплей.
    Недостатки: скорость передачи информации по цифровым видеоканалам весьма высока, для обработки такого потока информации в реальном времени нужны производительные ПЛИС/DSP/MCU; возможны потери качества при дальнейшей передачи видеосигнала на дисплей; потребности в синхронизации кадра как принимаемого так и передаваемого видео сигналов; патентная чистота (с ней на самом деле все не до конца ясно) и т.д.
    Преимущества: отпадает потребность в преобразователях аналоговый<->цифровой сигналы
  3. Множество современных видеокарт без особого труда осуществляют дублирование одного изображения на 2 монитора по независимым цифровым видеоканалам. Пользуясь данным режимом работы видеокарты можно осуществить следующее:
    Выставить не большое разрешение на одном из каналов видеокарты, подключить его к ПЛИС/DSP/MCU, затем выдержав синхронизацию кадра, получить цвет каждого пикселя на дисплеи, затем по некоторому алгоритму рассчитать какой цвет фоновой подсветки должен быть и выдать PWM сигнал на светодиоды. И все!
    Недостатки: потребность в видеокарте с двумя видеоканалами (в отличии от первых двух методов); вопрос с патентной чистотой остается открытым, но кажется не таким острым как в предыдущем методе
Здесь можно еще много чего напридумывать, как мне кажется, но я остановился на последнем методе реализации, хотя бы из требований патентной чистоты. О ней также пару слов будет, чуть ниже.

Аппаратная реализация

При выборе аппаратной реализации исходил из принципов: простоты (на сколько это возможно), дешевизны и доступности компонентов.

HDMI(DVI)-reciever или все в одном?
На самом деле вопрос в выборе аппаратной платформы стоит очень остро: устройство должно успевать переваривание поток информации (для SVGA (800x600@60 Hz) 24 bits, Pixel Rate — 50 MHz) 500 Mb/s, а если разрешение будет больше то соответственно и поток информации будет еще больше. Также устройство должно иметь, желательно встроенные, дифференциальные приемки TMDS сигнала, которыми и являются сигналы передаваемые по HDMI или DVI видеоканалам.
Для уверенного приема HDMI(DVI) сигнала существуют специализированные микросхемы типа ADV7611/ADV7612 производства Analog Device или TFP401 от Texas Instruments или микросхемы китайского производства EP903 от Explore Semiconductor. Все эти устройства осуществляют прием TMDS сигналов и преобразуют их в параллельный код, который затем может быть обработан на ПЛИС/DSP/MCU. Основной недостаток этих микросхем их цена, которая порой превышает цену хорошего ПЛИС или DSP, поэтому решил что использование reciever-ов TMDS сигналов в данной реализации устройства рассматривается не будет.

ПЛИС или DSP?
DSP-процессоры всем хороши и писать для них можно на С, и купить в розницу проблем нет, но они не имеют встроенных приемников TMDS, к тому же в цене они порядком отличаются от ПЛИС (или равны) и имеют на борту еще много чего совершенно не нужного. С ПЛИС все по другому: писать надо на Verilog или VHDL, некоторые ПЛИС имеют встроенные приемопередатчики TMDS сигналов, скорость обработки сигналов очень высокая, периферии почти никакой нет.
К наиболее распространенным ПЛИС относятся (по моему мнению) микросхемы производимые Xilinx и Altera. Среди них, приемники TMDS имеют лишь ПЛИС Xilinx, семейства Spartan-3AN и выше, поэтому ПЛИС Altera выпадают из рассмотрения, хотя для них и можно сделать преобразователь уровней, но сделать преобразователь уровней не вносящий искажений в полезный сигнал это уже сложнее. Плюсом в огород Xilinx, является наличие замечательных Application Note: Video Connectivity Using TMDS I/O in Spartan-3A FPGAs и Implementing a TMDS Video Interface in the Spartan-6 FPGA, которыми я и руководствовался.
Были выбраны 2 ПЛИС из разных семейств:
  1. Xilinx Spartan 6, а именно XC6SLX9-2TQG144C. Подробнее здесь;
  2. Xilinx Spartan 3A, а именно XC3S200A-4VQG100C. Подробнее здесь.
Окончательная разводка платы будет делаться под XC6SLX9 т.к. она более универсальна: имеет большее количество логических ячеек; имеет 2 аппаратных контроллер доступа к памяти (MCB); имеет 16 блоков умножителей DSP48A1 — все это может может пригодиться в будущем.

Связь с ПК
Пока получается все красиво, но есть одно не большое но: от связи с ПК (помимо видеоканала) абсолютно и бесповоротно избавиться никак не получится. Так как необходимо задавать кол-во зон захвата, кол-во светодиодов, вводить ограничения на скорость смены цветов и т.д. По этому поводу, было решено что на стороне ПЛИС реализую асинхронный приемопередатчик (UART) и уже к нему подключаю все что угодно выдающие UART с уровнями TTL

Функциональная схема
По причине не законченности устройства, принципиальную схему здесь не привожу, оставлю лишь функциональную схему:

Плата дополнительно позиционируется как отладочная, поэтому на ней большинство ног ПЛИС выведены на PLS. К PLS подключаться будут светодиоды, UART и т.д. MiniUSB используется исключительно для подачи электропитания и ни какие данные по нему не передаются. Прошивка и отладка ПЛИС будет осуществляться по интерфейсу JTAG, через китайский клон Xilinx Platform USB Cable.

В место заключения

В следующей части нас ждет:
  • Печатная плата: разводка, изготовление;
  • Альтернативы;
  • Hellow VGA;
  • Галопом по Европам: Hellow TMDS.

Ссылки

Пиксельная подсветка просто и быстро
Lightpack. USB-подсветка монитора для усиления эффекта присутствия
Adalight Project Pack

17 комментариев

avatar
Кстати, вместо просто UART, можно организовать UART через монитор. Сделать это довольно просто — передавать UART сигналы, к примеру, пикселем в координатах 0, 0. Чтобы этот сигнал не спутался ни с чем другим, добавить CRC и дело в шляпе.

В вообще, проект отличный.
avatar
Отличная идея! Но на самом деле возможностей больше:
  • По HDMI передается еще и звук, так что можно частотную модуляцию применить в области высоких частот и никто не услышит и не увидит. Магия :) Также, звук можно разложить в Фурье «по быстрому» и сделать цветомузыку
  • В HDMI есть еще I2С, правда из под OC думаю до него не добраться никак. Хотя покапать в этом направлении можно
avatar
Отличный проект. Буду следить за его развитием.
У меня только вопрос что такое ESD на блок схеме?
avatar
ESD — это защита от статики., Здесь просто и подробно расписанно
avatar
Xilinx и Altera.
да ладно, а как же эти ребятки
avatar
А нельзя интерефейс просто на видеосигнал наложить, ну и еще приемничек ИК для пульта от телека добавить?
avatar
Хотя, да, если оно задумывается е просто как компьютерная штука, управлять с пульта было бы намного разумнее.
avatar
Думаю всеже пульта не будет, а вот Bluetooth с телефона на Android будет точно
avatar
Тож не очень хорошо, штука широкого применения. Тут пульт рулил бы, ну или кнопочки на самом девайсе. Хотя, можно не заморачиваться, и сделать как проще, а потом уже допиливать, когда будет прототип и будет ясно, что нужно.
avatar
Как продвигается разработка? очень интересно!
avatar
IMHO если уж делать автономное устройство, то варианты «видеокарта может дублировать на два монитора» рассматривать не стОит. На PC и так всё работает, зачем менять и увеличивать стоимость в разы? Интересно, чтобы работало с ресивером, Asus O!Play или Android miniPC.

Автономное устройство должно включаться между источником и телевизором как бы в разрыв HDMI кабеля.

Думал о таком варианте:
— HDMI splitter ($15 на eBay)
— HDMI to S-Video converter ($60 на eBay)
— видеосигнал раскладывать на RGB как здесь:
www.unagel.de/pal2rgb/pal2rgb.htm
— капчерить RGB как сделано на AVR здесь:
forum.easyelectronics.ru/viewtopic.php?f=16&t=834
или здесь:
roboforum.ru/forum88/topic6822-15.html
(достаточно снять кадр в минимальном разрешении, хоть 160x120 )
— вывести всё на SPI ленту на WS2801 или WS2811.

В итоге прикинул, сколько это будет стоить (дороже Android miniPC) и сколько придётся разбираться — решил подождать, пока Lightpack выпустят своё ПО для Android, и после этого останется собрать только простейшее устройство на at90usb16 :)

Также в результате поисков по интернету нашел проект, который сделан как раз по варианту выше, на Cortex M-4:
www.keiang.de/Content-pid-32.html
автор его активно развивает.

Если же вы решили привязаться к dualhead видеокарте, тогда зачем связываться с HDMI/DVI? Слишком уж сложно это. Проще воткнуть переходник DVI2VGA и капчерить аналоговые RGB — не нужно разбирать цифровой поток, можно пропускать кучу пикселей в строке; Cortex-M4 должен справиться. К тому же у видеокарт обычно есть и s-video выход — что упрощает проект до минимума. Главное помнить, что для вычисления цвета зон не нужна картинка в полном разрешении.
avatar
Спасибо за комментарий и обилие ссылок.
На PC и так всё работает, зачем менять и увеличивать стоимость в разы?
Работает, но некоторые проблемы возникающие на PC принципиально на PC без вмешательства производителей компонентов PC или операционной системы или драйверов решить невозможно. Далеко ходить не надо — почитайте баг трекер Lightpack.
тогда зачем связываться с HDMI/DVI? Слишком уж сложно это
Сложности не пугают. При обработке HDMI/DVI функционал устройства шире + не стоит забывать про профит :)

PS Проект продвигается помаленьку
avatar
Для приема и обработки HDMI сигнала используете готовый core с доработкой или пишите сами?
Еще вопрос, какую оперативку используете\будете использовать?
avatar
готовый core
?!?! найдете — дайте знать :)
Пока получается сборная солянка из кусков кода. На самом деле писать там совсем немного — один коненчный автомат и логика местами. Гораздо сложнее правильно сконфигурировать периферию Spartan, со всеми особенностями камня и ISE.

PS Кста, новая статья готова на 90-95%
avatar
Как я понимаю, преимущество проекта в том что не потребуется запускать никакого софта на компе, да и вообще без компа можно будет обойтись: втыкать его между блюрей плеером и телеком. Но, насколько я помню, от блюрей плеера по HDMI идёт шифрованный поток, который разобрать не получится.
avatar
Вы совершенно правы: декодирование шифрованного HDMI задача не простая, но она выполнима
avatar
Добавьте ссылку на еще один DIY проект эмбилайт подсветки монитора cxem.net/mc/mc200.php#comment-23608
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.