Comment créer un clone Ambilight basé sur FPGA?

10

Un bref aperçu:
Ambilight est un système sur certains téléviseurs Philips qui analyse les informations de couleur sur l'écran, puis définit des LED à l'arrière de l'écran pour projeter la couleur de l'écran sur le mur. C'est un effet assez astucieux. Il existe maintenant des clones de ce système qui utilisent un PC pour traiter la vidéo et contrôler les LED. Je trouve que c'est un peu exagéré - utiliser une machine entière pour danser certaines LED ...

Je voudrais modifier le NeTV de bunnie pour traiter un non cryptéAlimentation vidéo HDMI et commande de LED. Je sais que le NeTV a été conçu à d'autres fins, mais je pense qu'il peut être modifié pour atteindre mon objectif. Je ne me soucie pas du sous-système Linux sous-jacent, de l'usurpation d'identité I2C, de la superposition vidéo, etc. À ce stade, je ne suis pas concerné par le travail avec des flux cryptés HDCP.

Schémas NeTV

Code source NeTV

Diagramme de blocs FPGA Schéma fonctionnel NeTV
Il s'agit d'un diagramme de blocs d'une des diapositives de présentation de bunnie.
Le reste du jeu de diapositives est ici .

Diapositive montrant HSYNC, VSYNC, PIXCLK
Cette diapositive semble impliquer que les pixels vidéo sont en fait décodés (pas nécessairement décryptés ) .

Enfin ... certaines de mes réflexions et questions:

  1. Cela peut-il être fait sur le matériel que je souhaite? Si "oui", continuez! Si "non", dites-moi de quoi j'ai besoin!

  2. Pourrai-je traiter les informations vidéo sans mémoire externe? Il n'y a pas de mémoire à laquelle le FPGA puisse accéder directement, pour autant que je sache. Cela dépend probablement de l'algorithme que j'utilise pour traiter les données vidéo - pour utiliser le moins de RAM FPGA Block possible, je suppose que je voudrais utiliser une sorte de `` sommation itérative '' des pixels entrant, plutôt que de stocker un ensemble cadre de données d'image, puis la moyenne des couleurs. Des conseils concernant la mise en œuvre de cet algorithme? Comment commencer avec cela est mon plus grand obstacle.

  3. J'ai étudié le code source pour savoir où je dois «puiser» dans les données vidéo.
    Cela ressemble à l'endroit approprié:
    Schéma fonctionnel du décodeur DVI
    je sais, cette image est longue - c'est le mieux que je pouvais faire tout en la rendant claire à lire. Blâmez l'outil de Xilinx pour cela!
    Cela semble prendre les données TMDS et produire 8 bits pour chaque couleur.

  4. Je devrais avoir une sorte de machine d'état pour le pilote LED - à chaque cycle d'horloge, il obtient les informations sur les pixels du module que je crée pour traiter les données vidéo.

Désolé si c'est verbeux ou long - j'essaie d'être minutieux ... J'ai juste besoin d'aide pour décoller avec ça. C'est ma première tentative sur un projet FPGA - certains diront que c'est trop difficile pour un débutant mais je dis ... je dois commencer quelque part :) Merci d'avoir lu.

dext0rb
la source
1
Le NeTV ne décode pas le flux HDMI. Il suit le processus de négociation HDCP et chiffre le nouveau flux pour qu'il corresponde; Je ne pense pas que vous pourrez obtenir des informations vidéo à partir de cela.
akohlsmith
Pourriez-vous s'il vous plaît poster (un lien vers) les schémas pertinents? En outre, la déclaration des modules HDL pertinents serait utile.
drxzcl
1
@AndrewKohlsmith, donc la superposition se fait à la fin du téléviseur? Wow, je ne savais pas que HDMI pouvait faire ça!
drxzcl
1
Je ne sais pas si vous serez en mesure de faire tout ce dont vous avez besoin sans utiliser un tampon de trame de mémoire externe, mais de toute façon, quelle analyse des couleurs prévoyez-vous d'utiliser? S'il s'agit de FFT, cela prendra un certain temps et je ne sais pas si la lumière ambiante ne sera pas trop tard pour la couleur vidéo. Je dirais tout d'abord essayer d'obtenir des données du HDMI et de vérifier si vous pouvez les analyser. Par exemple, faites un filtre passe-bas et sortez le résultat.
Socrates
1
Je me souviens avoir relu cela lorsque le NeTV est sorti. Selon ce post, Bunnie utilise un schéma de superposition délicat qui ne nécessite pas de décrypter la source HDMI; il le recrypte juste quand c'est nécessaire. Il n'y a pas de décodage des flux cryptés.
mng

Réponses:

7

Je base entièrement ma réponse sur le code et la documentation du module dvi_decoder , et en supposant qu'il fonctionne réellement comme annoncé. Ce fichier semble être une copie (modifiée?) De l'adresse IP dans les notes de l'application Connectivité vidéo utilisant les E / S TMDS dans les FPGA Spartan-3A et / ou Implémentant une interface vidéo TMDS dans le FPGA Spartan-6 . Ces notes d'application regorgent de détails importants, et je vous suggère de les lire attentivement.

Comme vous l'avez indiqué dans la question, je suppose que vous traitez des flux non chiffrés, c'est-à-dire des flux non HDCP. Je suis assez certain que les informations contenues dans le projet NeTV peuvent être adaptées pour décrypter HDCP, mais cela impliquerait une quantité non négligeable de travail supplémentaire et serait sur des bases juridiques douteuses selon votre juridiction.

Il semble que vous puissiez obtenir les données dont vous avez besoin à partir des sorties du bloc dvi_decoder. Le bloc de l'information de couleur de 24 bits en utilisant les fils red, greenet blue, synchronisé à l'horloge de pixel pclk. Les sorties hsyncet vsyncalertent l'utilisateur à la fin d'une ligne / écran respectivement. En général, vous devriez pouvoir faire la moyenne à la volée en utilisant ces sorties.

Vous aurez besoin d' une logique de base pour traduire hsync, vsyncet l'horloge pixel dans un emplacement (X, Y). Il suffit d'instancier deux compteurs, un pour Xet un pour Y. Incrémenter Xà chaque horloge de pixel. Remise Xà zéro à hsync. Incrément Yà chaque fois hsync. Remise Yà zéro à chaque fois vsync.

En utilisant red, green, blue, Xet Y, vous pouvez le faire sur la moyenne mouche. En comparant avec Xet Y, vous pouvez déterminer à quelle case chaque pixel individuel devrait contribuer, le cas échéant. Additionnez les valeurs de couleur dans un registre d'accumulation. Pour obtenir la valeur moyenne, vous devez diviser la valeur dans le registre par le nombre de pixels. Si vous êtes intelligent, vous vous assurerez que le nombre de pixels est une puissance de deux. Ensuite, vous pouvez simplement câbler les MSB du registre à ce que vous voulez conduire.

Parce que nous voulons piloter des affichages tout en faisant l'accumulation, nous devrons faire un double tampon. Nous aurons donc besoin de deux registres par boîte et par composant. Si vous utilisez une chaîne à 25 leds, cela signifie que vous aurez besoin de 25 * 3 * 2 = 150 registres. C'est un peu, donc vous voudrez peut-être utiliser le bloc RAM au lieu des registres. Tout dépend de vos besoins exacts, expérimentez!

Je suppose que vous conduirez une chaîne LED comme celle utilisée dans le kit de projet adafruit d'origine . Vous devriez être en mesure de comprendre comment le conduire à partir des valeurs dans les registres en utilisant SPI assez facilement.

Le module dvi_decoder est un kit assez complexe. Je vous suggère d'étudier les notes de l'application en détail.

Soit dit en passant, si vous n'avez pas encore acheté de NeTV pour l'utiliser dans ce projet, je vous recommande également de consulter la carte Atlys de Digilent . Avec deux entrées HDMI et deux sorties HDMI, il semble être fait sur mesure pour des projets de ce type.

drxzcl
la source
NP, merci pour la question cool. Si vous rencontrez des problèmes spécifiques avec ce projet, n'hésitez pas à publier à nouveau.
drxzcl
Btw, (et c'est hors de portée de la question) avez-vous envisagé de conduire la chose à partir d'un système de microcontrôleur relativement costaud? Quelque chose comme le RaspberryPi est environ 6 fois moins cher et devrait pouvoir piloter les leds et afficher la vidéo en même temps.
drxzcl
toujours en attente de mon outil JTAG pour que je puisse déboguer avec ChipScope ... va accepter cette réponse; il présente une approche fondamentale pour résoudre ce problème. @drzxcl j'ai déjà le netv en ma possession. RaspPi est une suggestion intéressante, mais impossible d'utiliser HDMI comme source vidéo.
dext0rb
Avez-vous déjà obtenu ceci pour travailler? J'adorerais voir un article / vidéo!
drxzcl
Non, pas vraiment. : | J'ai créé un pilote de LED à demi-cul , mais je n'ai pas eu le temps d'y entrer davantage. Bientôt je l'espère.
dext0rb