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.
FPGA-
Blockdiagramm Dies ist ein Blockdiagramm von einer der Präsentationsfolien von bunnie.
Der Rest des Foliensatzes ist hier .
Diese Folie scheint zu implizieren, dass Videopixel tatsächlich dekodiert (nicht unbedingt entschlüsselt ) werden .
Endlich ... einige meiner Gedanken und Fragen:
Kann dies auf meiner gewünschten Hardware durchgeführt werden? Wenn "Ja", fahren Sie fort! Wenn "nein", sag mir, was ich noch brauche!
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.
Ich habe den Quellcode untersucht, wo ich die Videodaten "abhören" soll.
Dies scheint der richtige Ort zu sein:
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.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.
Antworten:
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
,green
undblue
auf dem Pixeltakt synchronisiertpclk
. Die Ausgabenhsync
und dievsync
Warnung 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
,vsync
und den Pixeltakt in eine (X, Y) Position. Instanziieren Sie einfach zwei Zähler, einen fürX
und einen fürY
. InkrementX
bei jedem Pixeltakt. BeiX
auf Null zurücksetzenhsync
. InkrementY
bei jedemhsync
. ZurücksetzenY
auf Null bei jedemvsync
.Mit
red
,green
,blue
,X
undY
können Sie im laufenden Betrieb Lungs zu tun. Durch Vergleichen mitX
undY
kö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.
quelle