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.
Schemat blokowy FPGA
Jest to schemat blokowy z jednego ze slajdów prezentacji Bunnie. Reszta zestawu slajdów jest tutaj .
Ten slajd wydaje się sugerować, że piksele wideo są w rzeczywistości odkodowane (niekoniecznie odszyfrowane ) .
Wreszcie ... niektóre z moich myśli i pytań:
Czy można to zrobić na wybranym sprzęcie? Jeśli „tak”, kontynuuj! Jeśli „nie”, powiedz mi, czego więcej potrzebuję!
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.
Sprawdziłem kod źródłowy, gdzie powinienem „wykorzystać” dane wideo.
To wygląda na właściwe miejsce:
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.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.
Odpowiedzi:
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
,green
iblue
zsynchronizowany z zegarem pikselipclk
. Wyjściahsync
ivsync
ostrzegają 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
,vsync
a zegar pikseli na lokalizację (X, Y). Po prostu utwórz dwa liczniki, jeden dlaX
i jeden dlaY
. PrzyrostX
przy każdym zegarze pikseli. ResetujX
do zera ohsync
. PrzyrostY
przy każdymhsync
. ZresetujY
do zera za każdym razemvsync
.Korzystanie
red
,green
,blue
,X
iY
można zrobić na uśrednianiu latać. Porównując zX
iY
, 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.
źródło