Wie erstelle ich einen FPGA-basierten Ambilight-Klon?

10

Ein kurzer Hintergrund:
Ambilight ist ein System auf einigen Philips Fernsehgeräten, das die Farbinformationen auf dem Bildschirm analysiert und dann einige LEDs auf der Rückseite des Displays anbringt, um die Farbe des Bildschirms auf die Wand zu projizieren. Es ist ein ziemlich raffinierter Effekt. Es gibt jetzt Klone dieses Systems, die einen PC verwenden, um das Video zu verarbeiten und die LEDs zu steuern. Ich finde das etwas übertrieben - ich benutze eine ganze Maschine, um ein paar LEDs zu tanzen ...

Ich möchte Bunnies NeTV so modifizieren , dass es unverschlüsselt verarbeitet wirdHDMI-Video einspeisen und einige LEDs ansteuern. Ich weiß, dass das NeTV für andere Zwecke entwickelt wurde, aber ich bin der Meinung, dass es modifiziert werden kann, um mein Ziel zu erreichen. Das zugrunde liegende Linux-Subsystem, I2C-Spoofing, Video-Overlay usw. interessieren mich nicht. Derzeit geht es mir nicht um die Arbeit mit HDCP-verschlüsselten Streams.

NeTV-Schaltpläne

NeTV-Quellcode

FPGA- NeTV-Blockdiagramm
Blockdiagramm Dies ist ein Blockdiagramm von einer der Präsentationsfolien von bunnie.
Der Rest des Foliensatzes ist hier .

Diashow HSYNC, VSYNC, PIXCLK
Diese Folie scheint zu implizieren, dass Videopixel tatsächlich dekodiert (nicht unbedingt entschlüsselt ) werden .

Endlich ... einige meiner Gedanken und Fragen:

  1. Kann dies auf meiner gewünschten Hardware durchgeführt werden? Wenn "Ja", fahren Sie fort! Wenn "nein", sag mir, was ich noch brauche!

  2. Kann ich Videoinformationen ohne externen Speicher verarbeiten? Soweit ich das beurteilen kann, gibt es keinen Speicher, auf den das FPGA direkt zugreifen kann. Dies hängt wahrscheinlich davon ab, welchen Algorithmus ich zum Verarbeiten der Videodaten verwende. Um so wenig FPGA-Block-RAM wie möglich zu verwenden, würde ich wahrscheinlich eine Art "iterative Summierung" der eingehenden Pixel verwenden wollen, anstatt ein Ganzes zu speichern Bildrahmen und dann Mittelung der Farben. Irgendwelche Hinweise zur Implementierung dieses Algorithmus? Wie ich damit anfangen kann, ist meine größte Hürde.

  3. Ich habe den Quellcode untersucht, wo ich die Videodaten "abhören" soll.
    Dies scheint der richtige Ort zu sein:
    Blockdiagramm des DVI-Decoders
    Ich weiß, dieses Bild ist lang - es ist das Beste, was ich tun kann, um das Lesen klar zu machen. Beschuldigen Sie Xilinx 'Werkzeug dafür!
    Dies scheint die TMDS-Daten aufzunehmen und 8-Bit für jede Farbe auszugeben.

  4. Ich sollte eine Art Zustandsmaschine für den LED-Treiber haben - bei jedem Taktzyklus werden die Pixelinformationen von jedem Modul abgerufen, das ich zur Verarbeitung der Videodaten erstelle.

Tut mir leid, wenn das wortreich oder lang ist - ich versuche gründlich zu sein ... Ich brauche nur etwas Hilfe, um damit in Gang zu kommen. Dies ist mein erster Versuch in einem FPGA-Projekt - einige mögen sagen, dass es für Anfänger zu schwierig ist, aber ich sage ... ich muss irgendwo anfangen :) Danke fürs Lesen.

dext0rb
quelle
1
Das NeTV decodiert den HDMI-Stream nicht. Es folgt dem HDCP-Verhandlungsprozess und verschlüsselt den neuen Stream entsprechend. Ich glaube nicht, dass Sie daraus Videoinformationen erhalten können.
Akohlsmith
Könnten Sie bitte (einen Link zu den) relevanten Schaltplänen posten? Auch die Deklaration der relevanten HDL-Module würde helfen.
drxzcl
1
@ AndrewKohlsmith, also erfolgt die Überlagerung am TV-Ende? Wow, ich hatte keine Ahnung, dass HDMI das kann!
drxzcl
1
Ich bin mir nicht sicher, ob Sie in der Lage sind, alles zu tun, was Sie benötigen, ohne einen externen Speicherrahmenpuffer zu verwenden. Aber welche Farbanalyse planen Sie überhaupt? Wenn es sich um FFT handelt, dauert es einige Zeit und ich bin mir nicht sicher, ob das Umgebungslicht nicht zu spät für die Videofarbe ist. Ich würde sagen, versuchen Sie zunächst, Daten vom HDMI abzurufen und zu prüfen, ob Sie sie analysieren können. Führen Sie beispielsweise einen Tiefpassfilter durch und geben Sie das Ergebnis aus.
Sokrates
1
Ich erinnere mich, dass ich das zurückgelesen habe, als der NeTV herauskam. Laut diesem Beitrag verwendet Bunnie ein kniffliges Overlay-Schema, bei dem das Quell-HDMI nicht entschlüsselt werden muss. er verschlüsselt es nur bei Bedarf neu. Es gibt keine Dekodierung von verschlüsselten Streams.
Mng

Antworten:

7

Ich stütze meine Antwort vollständig auf den Code und die Dokumentation des Moduls dvi_decoder und gehe davon aus , dass es tatsächlich wie angekündigt funktioniert. Diese Datei scheint eine (modifizierte?) Kopie der IP in den App-Hinweisen zu sein. Videokonnektivität mit TMDS-E / A in Spartan-3A-FPGAs und / oder Implementierung einer TMDS-Videoschnittstelle im Spartan-6-FPGA . Diese App-Notizen sind voller wichtiger Details, und ich schlage vor, dass Sie sie sorgfältig lesen.

Wie Sie in der Frage angegeben haben, gehe ich davon aus, dass Sie unverschlüsselte Streams behandeln, dh Nicht-HDCP-Streams. Ich bin mir ziemlich sicher, dass die Informationen im NeTV-Projekt angepasst werden können, um HDCP zu entschlüsseln, aber es würde eine nicht triviale Menge zusätzlicher Arbeit bedeuten und aus fragwürdigen rechtlichen Gründen erfolgen, abhängig von Ihrer Gerichtsbarkeit.

Es sieht so aus, als könnten Sie die benötigten Daten von den Ausgängen des dvi_decoder-Blocks abrufen. Der Block Ausgänge 24-Bit - Farbinformation , die Drähte verwendet red, greenund blueauf dem Pixeltakt synchronisiert pclk. Die Ausgaben hsyncund die vsyncWarnung des Benutzers an das Ende einer Zeile / eines Bildschirms. Im Allgemeinen sollten Sie in der Lage sein, mithilfe dieser Ausgänge eine Mittelwertbildung im laufenden Betrieb durchzuführen.

Sie werden einige grundlegenden Logik müssen zu übersetzen hsync, vsyncund den Pixeltakt in eine (X, Y) Position. Instanziieren Sie einfach zwei Zähler, einen für Xund einen für Y. Inkrement Xbei jedem Pixeltakt. Bei Xauf Null zurücksetzen hsync. Inkrement Ybei jedem hsync. Zurücksetzen Yauf Null bei jedem vsync.

Mit red, green, blue, Xund Ykönnen Sie im laufenden Betrieb Lungs zu tun. Durch Vergleichen mit Xund Ykönnen Sie bestimmen, zu welcher Box jedes einzelne Pixel gegebenenfalls beitragen soll. Summiere die Farbwerte zu einem Akkumulationsregister. Um den Durchschnittswert zu erhalten, müssen Sie den Wert im Register durch die Anzahl der Pixel teilen. Wenn Sie schlau sind, stellen Sie sicher, dass die Anzahl der Pixel eine Zweierpotenz ist. Dann können Sie einfach die MSBs des Registers mit dem verbinden, was Sie fahren möchten.

Da wir während der Akkumulation Anzeigen ansteuern möchten, müssen wir eine doppelte Pufferung durchführen. Wir benötigen also zwei Register pro Box und Komponente. Wenn Sie eine Zeichenfolge mit 25 LEDs verwenden, benötigen Sie 25 * 3 * 2 = 150 Register. Das ist ziemlich viel, also möchten Sie vielleicht Block-RAM anstelle von Registern verwenden. Es hängt alles von Ihren genauen Anforderungen ab, experimentieren Sie!

Ich gehe davon aus, dass Sie eine LED- Saite fahren, wie sie im ursprünglichen Adafruit-Projektkit verwendet wird . Sie sollten in der Lage sein, mithilfe von SPI ganz einfach herauszufinden, wie Sie es aus den Werten in den Registern steuern können.

Das Modul dvi_decoder ist ein ziemlich komplexes Teil des Kits. Ich schlage vor, dass Sie die App-Notizen im Detail studieren.

Wenn Sie noch kein NeTV für dieses Projekt gekauft haben, empfehlen wir Ihnen, sich auch das Atlys-Board von Digilent anzusehen . Mit zwei HDMI-Eingängen und zwei HDMI-Ausgängen scheint es für Projekte dieser Art maßgeschneidert zu sein.

drxzcl
quelle
NP, danke für die coole Frage. Wenn Sie bei diesem Projekt auf bestimmte Probleme stoßen, können Sie diese gerne erneut veröffentlichen.
drxzcl
Übrigens (und das liegt kaum außerhalb des Rahmens der Frage), haben Sie darüber nachgedacht, das Ding von einem relativ bulligen Mikrocontrollersystem aus zu steuern? So etwas wie das RaspberryPi ist ungefähr sechsmal billiger und sollte in der Lage sein, die LEDs zu steuern und das Video gleichzeitig anzuzeigen.
drxzcl
Ich warte immer noch darauf, dass mein JTAG-Tool eingeht, damit ich mit ChipScope debuggen kann. Ich werde diese Antwort akzeptieren. Es enthält einen grundlegenden Ansatz zur Lösung dieses Problems. @drzxcl Ich habe das Netz bereits in meinem Besitz. RaspPi ist ein interessanter Vorschlag, aber es ist unmöglich, HDMI als Videoquelle zu verwenden.
Dext0rb
Hast du das jemals zum Laufen gebracht? Ich würde gerne einen Artikel sehen!
drxzcl
Nein nicht wirklich. : | Ich habe einen halbherzigen LED-Treiber erstellt , hatte aber keine Zeit mehr, mich darauf einzulassen . Hoffentlich bald.
Dext0rb