Come creare un clone Ambilight basato su FPGA?


10

Qualche rapido sfondo:
Ambilight è un sistema su alcuni televisori Philips che analizza le informazioni sul colore sullo schermo e quindi imposta alcuni LED sul retro del display per proiettare il colore dello schermo sul muro. È un effetto piuttosto elegante. Ora ci sono cloni di questo sistema che usano un PC per elaborare il video e controllare i LED. Trovo che sia un po 'eccessivo - usare un'intera macchina per ballare alcuni LED ...

Mi piacerebbe modificare la NeTV del coniglietto per elaborare un non crittografatoFeed video HDMI e guida alcuni LED. So che il NeTV è stato progettato per altri scopi, ma sento che può essere modificato per raggiungere il mio obiettivo. Non mi interessa il sottosistema Linux sottostante, lo spoofing I2C, l'overlay video, ecc. A questo punto, non mi preoccupo di lavorare con flussi crittografati HDCP.

Schemi NeTV

Codice sorgente NeTV

Diagramma a blocchi FPGA Diagramma a blocchi NeTV
Questo è uno schema a blocchi di una delle diapositive di presentazione del coniglietto.
Il resto del set di diapositive è qui .

Diapositiva che mostra HSYNC, VSYNC, PIXCLK
Questa diapositiva sembra implicare che i pixel video siano, di fatto, decodificati (non necessariamente decifrati ) .

Finalmente ... alcuni dei miei pensieri e domande:

  1. Questo può essere fatto sul mio hardware desiderato? Se "sì", continua! Se "no", dimmi di cosa ho bisogno di più!

  2. Sarò in grado di elaborare le informazioni video senza memoria esterna? Non c'è memoria a cui l'FPGA possa accedere direttamente, per quanto ne so. Questo probabilmente dipende da quale algoritmo che uso per elaborare i dati video - per usare il minor numero di RAM di blocco FPGA possibile, immagino che vorrei usare una sorta di "sommatoria iterativa" dei pixel in arrivo, piuttosto che archiviare un intero frame di dati immagine e quindi media dei colori. Qualche suggerimento riguardo all'implementazione di questo algoritmo? Come iniziare con questo è il mio più grande ostacolo.

  3. Ho studiato il codice sorgente su dove dovrei "attingere" ai dati del video.
    Questo sembra il punto appropriato:
    Schema a blocchi del decodificatore DVI
    lo so, questa immagine è lunga - è la migliore che potessi fare mentre chiarivo la lettura. Dai la colpa allo strumento di Xilinx per questo!
    Questo sembra contenere i dati TMDS e produrre 8 bit per ciascun colore.

  4. Dovrei avere una sorta di macchina a stati per il driver LED: ad ogni ciclo di clock, ottiene le informazioni sui pixel da qualsiasi modulo che creo per elaborare i dati video.

Scusate se questo è prolisso o lungo - Sto cercando di essere accurato ... Ho solo bisogno di aiuto per scendere da terra con questo. Questo è il mio primo tentativo di un progetto FPGA - alcuni potrebbero dire che è troppo difficile per un principiante, ma io dico ... devo iniziare da qualche parte :) Grazie per aver letto.


1
Il NeTV non decodifica il flusso HDMI. Segue il processo di negoziazione dell'HDCP e crittografa il nuovo flusso affinché corrisponda; Non credo che sarai in grado di ottenere informazioni sui video da questo.
akohlsmith il

Potresti per favore pubblicare (un link al) schemi rilevanti? Inoltre, sarebbe utile la dichiarazione dei relativi moduli HDL.
drxzcl,

1
@AndrewKohlsmith, quindi la sovrapposizione viene eseguita alla fine della TV? Wow, non avevo idea che HDMI potesse farlo!
drxzcl,

1
Non sono sicuro che sarai in grado di fare tutto il necessario senza utilizzare un buffer di frame di memoria esterno, ma comunque, quale analisi del colore hai intenzione di utilizzare? Se è FFT, ci vorrà del tempo e non sono sicuro che la luce ambientale non sarà troppo tardi per il colore del video. Direi innanzitutto di provare a ottenere dati dall'HDMI e verificare se è possibile analizzarli. Ad esempio fare un filtro passa-basso e produrre il risultato.
Socrate,

1
Ricordo di aver letto questo indietro quando la NeTV è venuto fuori. Secondo quel post, Bunnie utilizza uno schema di sovrapposizione complicato che non richiede la decodifica della sorgente HDMI; lo crittografa solo quando necessario. Non c'è decodifica di flussi crittografati.
mng

Risposte:


7

Sto basando la mia risposta completamente sul codice e sulla documentazione del modulo dvi_decoder e supponendo che funzioni effettivamente come pubblicizzato. Questo file sembra essere una copia (modificata?) Dell'IP nelle note dell'app Connettività video Utilizzo di I / O TMDS negli FPGA Spartan-3A e / o Implementazione di un'interfaccia video TMDS nell'FPGA Spartan-6 . Queste note sull'app sono piene di dettagli importanti e ti suggerisco di leggerle attentamente.

Come hai indicato nella domanda, suppongo che stai trattando flussi non crittografati, ovvero flussi non HDCP. Sono abbastanza certo che le informazioni contenute nel progetto NeTV possano essere adattate per decrittografare l'HDCP, ma implicherebbero una quantità non banale di lavoro aggiuntivo e sarebbero su basi legali discutibili a seconda della tua giurisdizione.

Sembra che sarai in grado di ottenere i dati necessari dagli output del blocco dvi_decoder. Il blocco uscite dati a 24 bit colore utilizzando i fili red, greene blue, sincronizzato alla frequenza dei pixel pclk. Le uscite hsynce vsyncavvisano l'utente rispettivamente alla fine di una riga / schermata. In generale, dovresti essere in grado di fare una media al volo usando questi output.

Avrete bisogno di un po 'di logica di base di tradurre hsync, vsynce la frequenza dei pixel in una posizione (X, Y). Crea un'istanza di due contatori, uno per Xe uno per Y. Incremento Xad ogni pixel clock. Ripristina Xa zero a hsync. Incremento Yad ogni hsync. Ripristina Ya zero ad ogni vsync.

Usando red, green, blue, Xe Y, si può fare sulla media volo. Confrontando con Xe Y, è possibile determinare a quale casella ogni singolo pixel dovrebbe contribuire, se presente. Somma i valori di colore in un registro di accumulazione. Per ottenere il valore medio, è necessario dividere il valore nel registro per il numero di pixel. Se sei intelligente, ti assicurerai che il numero di pixel sia una potenza di due. Quindi puoi semplicemente collegare gli MSB del registro a qualsiasi cosa tu voglia guidare.

Poiché vogliamo guidare i display mentre facciamo l'accumulo, dovremo fare un doppio buffering. Quindi avremo bisogno di due registri per scatola per componente. Se stai usando una stringa a 25 led, questo significa che avrai bisogno di 25 * 3 * 2 = 150 registri. È un bel po ', quindi potresti voler usare block ram invece dei registri. Tutto dipende dalle tue esatte esigenze, sperimenta!

Suppongo che guiderete una stringa led come quella usata nel kit di progetto adafruit originale . Dovresti essere in grado di capire come guidarlo dai valori nei registri abbastanza facilmente usando SPI.

Il modulo dvi_decoder è un kit abbastanza complesso. Ti suggerisco di studiare le note dell'app in dettaglio.

A parte questo, se non hai ancora acquistato un NeTV per l'uso in questo progetto, ti consiglio di dare un'occhiata anche alla scheda Atlys di Digilent . Con due ingressi HDMI e due uscite HDMI, sembra fatto su misura per progetti di questo tipo.


NP, grazie per la bella domanda. Se riscontri problemi specifici con questo progetto, sentiti libero di postare di nuovo.
drxzcl,

A proposito, (e questo è ampiamente escluso dallo scopo della domanda) hai preso in considerazione l'idea di guidare la cosa da un sistema di microcontroller relativamente robusto? Qualcosa come il RaspberryPi è circa 6 volte più economico e dovrebbe essere in grado di guidare i led e visualizzare il video allo stesso tempo.
drxzcl,

sto ancora aspettando che arrivi il mio strumento JTAG in modo da poter eseguire il debug con ChipScope ... accetterò questa risposta; stabilisce un approccio fondamentale per risolvere questo problema. @drzxcl Ho già il netv in mio possesso. RaspPi è un suggerimento interessante, ma impossibile usare hdmi come sorgente video.
dext0rb

L'hai mai fatto funzionare? Mi piacerebbe vedere un commento / video!
drxzcl,

No, non proprio. : | Ho realizzato un driver LED a metà prezzo , ma non ho avuto il tempo di approfondire. Speriamo presto.
Dext0rb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.