Jak utworzyć klon Ambilight oparty na FPGA?

10

Szybkie tło:
Ambilight to system w niektórych telewizorach Philips, który analizuje informacje o kolorze na ekranie, a następnie ustawia diody LED z tyłu wyświetlacza, aby wyświetlać kolor ekranu na ścianie. To całkiem fajny efekt. Istnieją klony tego systemu, które używają teraz komputera do przetwarzania wideo i sterowania diodami LED. Uważam, że to trochę przesada - za pomocą całej maszyny tańczyć niektóre diody LED ...

Chciałbym zmodyfikować NeTV Bunnie, aby przetwarzać niezaszyfrowanePrzesyłaj wideo HDMI i napędzaj niektóre diody LED. Wiem, że NeTV został zaprojektowany do innych celów, ale uważam, że można go zmodyfikować, aby osiągnąć mój cel. Nie dbam o bazowy podsystem Linux, fałszowanie I2C, nakładkę wideo itp. W tym momencie nie interesuje mnie praca z szyfrowanymi strumieniami HDCP.

Schematy NeTV

Kod źródłowy NeTV

Schemat blokowy FPGA Schemat blokowy NeTV
Jest to schemat blokowy z jednego ze slajdów prezentacji Bunnie. Reszta zestawu slajdów jest tutaj .

Pokaz slajdów HSYNC, VSYNC, PIXCLK
Ten slajd wydaje się sugerować, że piksele wideo są w rzeczywistości odkodowane (niekoniecznie odszyfrowane ) .

Wreszcie ... niektóre z moich myśli i pytań:

  1. Czy można to zrobić na wybranym sprzęcie? Jeśli „tak”, kontynuuj! Jeśli „nie”, powiedz mi, czego więcej potrzebuję!

  2. Czy będę mógł przetwarzać informacje wideo bez pamięci zewnętrznej? O ile wiem, nie ma pamięci, do której FPGA miałoby bezpośredni dostęp. Prawdopodobnie zależy to od tego, jakiego algorytmu używam do przetwarzania danych wideo - aby użyć tak małej pamięci RAM bloku FPGA, jak sądzę, chciałbym użyć pewnego rodzaju „iteracyjnego sumowania” nadchodzących pikseli, zamiast przechowywać całość ramka danych obrazu, a następnie uśrednianie kolorów. Wszelkie wskazówki dotyczące implementacji tego algorytmu? Jak zacząć, to moja największa przeszkoda.

  3. Sprawdziłem kod źródłowy, gdzie powinienem „wykorzystać” dane wideo.
    To wygląda na właściwe miejsce:
    Schemat blokowy dekodera DVI
    wiem, że ten obraz jest długi - to najlepsze, co mogłem zrobić, jednocześnie umożliwiając czytelne czytanie. Wini za to narzędzie Xilinx!
    Wydaje się, że pobiera dane TMDS i generuje 8-bit dla każdego koloru.

  4. Powinienem mieć jakąś maszynę stanu dla sterownika LED - w każdym cyklu zegara pobiera informacje o pikselach z dowolnego modułu, który tworzę do przetwarzania danych wideo.

Przepraszam, jeśli to jest trudne lub długie - Staram się być dokładny ... Potrzebuję tylko pomocy, aby z tym zacząć. To moja pierwsza próba projektu FPGA - niektórzy mogą powiedzieć, że jest to zbyt trudne dla początkującego, ale mówię ... muszę zacząć gdzieś :) Dziękuję za przeczytanie.

dext0rb
źródło
1
NeTV nie dekoduje strumienia HDMI. Śledzi proces negocjacji HDCP i szyfruje nowy strumień w celu dopasowania; Nie sądzę, że będziesz w stanie uzyskać z tego informacje wideo.
akohlsmith,
Czy możesz zamieścić (link do) odpowiednich schematów? Pomogłaby również deklaracja odpowiednich modułów HDL.
drxzcl,
1
@AndrewKohlsmith, więc nakładanie odbywa się na końcu telewizora? Wow, nie miałem pojęcia, że ​​HDMI może to zrobić!
drxzcl,
1
Nie jestem pewien, czy będziesz w stanie zrobić wszystko, czego potrzebujesz bez użycia bufora ramki pamięci zewnętrznej, ale w każdym razie, jakiej analizy kolorów zamierzasz użyć? Jeśli jest to FFT, zajmie to trochę czasu i nie jestem pewien, czy światło otoczenia nie będzie za późno na kolor wideo. Powiedziałbym, że najpierw spróbuj pobrać dane z HDMI i sprawdź, czy możesz to przeanalizować. Np. Wykonaj filtr dolnoprzepustowy i wypisz wynik.
Sokrates,
1
Pamiętam, jak czytałem to z powrotem, kiedy wyszedł NeTV. Zgodnie z tym postem Bunnie stosuje skomplikowany schemat nakładki, który nie wymaga odszyfrowywania źródłowego HDMI; po prostu ponownie go szyfruje , jeśli to konieczne. Nie ma dekodowania zaszyfrowanych strumieni.
mng

Odpowiedzi:

7

Opieram swoją odpowiedź całkowicie na kodzie i dokumentacji modułu dvi_decoder i zakładam , że faktycznie działa tak jak w reklamie. Ten plik wydaje się być (zmodyfikowaną?) Kopią adresu IP w notatkach aplikacji Łączność wideo Korzystanie z We / Wy TMDS w układach FPGA Spartan-3A i / lub Implementacja interfejsu wideo TMDS w układzie FPGA Spartan-6 . Te notatki aplikacji są pełne ważnych szczegółów i sugeruję uważne ich przeczytanie.

Jak wskazałeś w pytaniu, założę, że traktujesz niezaszyfrowane strumienie, czyli strumienie inne niż HDCP. Jestem całkiem pewien, że informacje w projekcie NeTV można dostosować do odszyfrowania HDCP, ale wymagałoby to dodatkowej pracy i byłoby uzasadnione prawnie w zależności od twojej jurysdykcji.

Wygląda na to, że będziesz w stanie uzyskać potrzebne dane z wyjść bloku dvi_decoder. 24-bitowe dane w bloku WYJŚCIA kolorów za pomocą przewodów red, greeni bluezsynchronizowany z zegarem pikseli pclk. Wyjścia hsynci vsyncostrzegają użytkownika odpowiednio do końca linii / ekranu. Ogólnie rzecz biorąc, powinieneś być w stanie wykonać uśrednianie w locie za pomocą tych danych wyjściowych.

Musisz przetłumaczyć podstawową logikę hsync, vsynca zegar pikseli na lokalizację (X, Y). Po prostu utwórz dwa liczniki, jeden dla Xi jeden dla Y. Przyrost Xprzy każdym zegarze pikseli. Resetuj Xdo zera o hsync. Przyrost Yprzy każdym hsync. Zresetuj Ydo zera za każdym razem vsync.

Korzystanie red, green, blue, Xi Ymożna zrobić na uśrednianiu latać. Porównując zX i Y, możesz określić, do którego pola każdy piksel powinien się przyczynić, jeśli w ogóle. Zsumuj wartości kolorów w rejestrze akumulacji. Aby uzyskać średnią wartość, należy podzielić wartość w rejestrze przez liczbę pikseli. Jeśli jesteś mądry, upewnisz się, że liczba pikseli to potęga dwóch. Następnie możesz po prostu połączyć MSB rejestru z tym, co chcesz prowadzić.

Ponieważ chcemy sterować wyświetlaniem podczas gromadzenia, będziemy musieli wykonać podwójne buforowanie. Potrzebujemy więc dwóch rejestrów na pudełko na komponent. Jeśli używasz ciągu 25 diod, oznacza to, że potrzebujesz 25 * 3 * 2 = 150 rejestrów. To całkiem sporo, więc możesz chcieć użyć pamięci RAM zamiast rejestrów. Wszystko zależy od twoich dokładnych wymagań, eksperymentuj!

Zakładam, że będziesz prowadził łańcuch ledowy, taki jak ten użyty w oryginalnym zestawie projektu adafruit . Powinieneś być w stanie dowiedzieć się, jak łatwo wyprowadzić go z wartości w rejestrach za pomocą SPI.

Moduł dvi_decoder jest dość złożonym zestawem. Sugeruję szczegółowe przestudiowanie notatek aplikacji.

Na marginesie, jeśli jeszcze nie kupiłeś NeTV do użytku w tym projekcie, polecam również rzucić okiem na płytę Atlys Digilent . Dzięki dwóm wejściom HDMI i dwóm wyjściom HDMI wydaje się być dostosowany do tego rodzaju projektów.

drxzcl
źródło
NP, dzięki za fajne pytanie. Jeśli napotkasz jakieś szczególne problemy z tym projektem, możesz opublikować ponownie.
drxzcl,
A tak przy okazji (a to jest całkowicie poza zakresem pytania) czy zastanawiałeś się nad napędzeniem tego urządzenia ze stosunkowo mocnego systemu mikrokontrolera? Coś takiego jak RaspberryPi jest około 6 razy tańsze i powinno być w stanie prowadzić diody LED i wyświetlać wideo w tym samym czasie.
drxzcl,
wciąż czekam na moje narzędzie JTAG, aby móc debugować za pomocą ChipScope ... zamierzając zaakceptować tę odpowiedź; określa podstawowe podejście do rozwiązania tego problemu. @drzxcl Mam już sieć w swoim posiadaniu. RaspPi to ciekawa sugestia, ale nie można użyć HDMI jako źródła wideo.
dext0rb,
Czy kiedykolwiek sprawiłeś, że to zadziałało? Chciałbym zobaczyć artykuł / wideo!
drxzcl
Nie, nie bardzo. : | Zrobiłem na wpół ospały sterownik LED , ale nie miałem czasu, aby się tym zająć. Miejmy nadzieję, że wkrótce.
dext0rb