¿Cómo crear un clon de Ambilight basado en FPGA?

10

Algunos antecedentes rápidos:
Ambilight es un sistema en algunos televisores Philips que analiza la información de color en la pantalla y luego establece algunos LED en la parte posterior de la pantalla para proyectar el color de la pantalla en la pared. Es un efecto bastante ingenioso. Hay clones de este sistema ahora que usan una PC para procesar el video y controlar los LED. Encuentro que esto es un poco excesivo: usar una máquina completa para bailar algunos LEDs ...

Me gustaría modificar NeTV de Bunnie para procesar un sin cifrar canal de video HDMI y conducir algunos LEDs. Sé que el NeTV ha sido diseñado para otros fines, pero creo que puede modificarse para lograr mi objetivo. No me importa el subsistema Linux subyacente, la falsificación I2C, la superposición de video, etc. En este punto, no me preocupa trabajar con flujos encriptados HDCP.

Esquemas de NeTV

Código fuente de NeTV

Diagrama de bloques FPGA
EsteesundiagramadebloquesdeunadelasdiapositivasdepresentacióndeBunnie.
El resto del conjunto de diapositivas está aquí .


Estadiapositivapareceimplicarque,dehecho,lospíxelesdelvideoestándecodificados(nonecesariamentedescifrado).

Finalmente...algunosdemispensamientosypreguntas:

  1. ¿Sepuedehacerestoenmihardwaredeseado?Sies"sí", continúa! Si la respuesta es "no", ¡dime qué más necesito!

  2. ¿Podré procesar información de video sin memoria externa? No hay memoria a la que el FPGA pueda acceder directamente, por lo que puedo decir. Probablemente, esto depende del algoritmo que utilice para procesar los datos de video: para usar la menor RAM de bloque FPGA posible, supongo que me gustaría usar algún tipo de "suma iterativa" de los píxeles que ingresan, en lugar de almacenar un todo Marco de datos de la imagen y luego promediando los colores. ¿Alguna pista con respecto a la implementación de este algoritmo? Cómo comenzar con esto es mi mayor obstáculo.

  3. He investigado el código fuente en cuanto a dónde debo "acceder" a los datos de video.
    Este es el lugar adecuado:

    Lo sé, esta imagen es larga. es lo mejor que pude hacer y dejarlo claro para leer. ¡Culpa a la herramienta de Xilinx por eso!
    Esto parece tener en cuenta los datos TMDS y la salida de 8 bits para cada color.

  4. Debería tener algún tipo de máquina de estado para el controlador LED: cada ciclo de reloj obtiene la información de píxeles de cualquier módulo que cree para procesar los datos de video.

Lo siento si esto es prolijo o largo. Estoy tratando de ser minucioso ... Solo necesito ayuda para despegar con esto. Este es mi primer intento en un proyecto de FPGA. Algunos pueden decir que es demasiado difícil para un principiante, pero yo digo que ... tengo que comenzar en alguna parte :) Gracias por leer.

    
pregunta dext0rb

1 respuesta

7

Estoy basando completamente mi respuesta en el código y la documentación de dvi_decoder module , y asumiendo que realmente funciona como se anuncia. Este archivo parece ser una copia (¿modificada?) De la IP en las notas de la aplicación Conectividad de video usando TMDS I / O en Spartan-3A FPGAs y / o Implementando una interfaz de video TMDS en el Spartan-6 FPGA . Estas notas de la aplicación están repletas de detalles importantes, y le sugiero que las lea detenidamente.

Como indicaste en la pregunta, asumiré que estás tratando flujos sin cifrar, es decir, flujos que no son HDCP. Estoy bastante seguro de que la información en el proyecto NeTV se puede adaptar para descifrar HDCP, pero involucraría una cantidad no trivial de trabajo adicional y podría tener motivos legales cuestionables dependiendo de su jurisdicción.

Parece que podrá obtener los datos que necesita de las salidas del bloque dvi_decoder. El bloque genera información de color de 24 bits utilizando los cables red , green y blue , sincronizados con el reloj de píxeles pclk . Las salidas hsync y vsync alertan al usuario al final de una línea / pantalla respectivamente. En general, debería poder hacer promedios de vuelo utilizando estas salidas.

Necesitarás una lógica básica para traducir hsync , vsync y el reloj de píxeles en una ubicación (X, Y). Solo instancia dos contadores, uno para X y otro para Y . Incremento X en cada reloj de píxel. Restablecer X a cero en hsync . Incrementa Y en cada hsync . Restablece Y a cero en cada vsync .

Usando red , green , blue , X y Y , puedes hacerlo sobre la marcha promediando. Al comparar con X y Y , puede determinar a qué cuadro debe contribuir cada píxel individual, si corresponde. Suma los valores de color en un registro de acumulación. Para obtener el valor promedio, debe dividir el valor en el registro por el número de píxeles. Si eres inteligente, te asegurarás de que la cantidad de píxeles sea una potencia de dos. Luego, solo puede conectar los MSB del registro a lo que quiera conducir.

Debido a que queremos conducir pantallas mientras hacemos la acumulación, tendremos que hacer doble búfer. Así que necesitaremos dos registros por caja por componente. Si está utilizando una cadena de 25 derivaciones, esto significa que necesitará 25 * 3 * 2 = 150 registros. Eso es bastante, por lo que es posible que desee utilizar bloque ram en lugar de registros. Todo depende de tus requisitos exactos, ¡experimenta!

Supongo que conducirá una cadena led como la que se usa en el kit de proyecto original de adafruit . Debería poder averiguar cómo manejarla a partir de los valores en los registros con bastante facilidad utilizando SPI.

El módulo dvi_decoder es un kit bastante complejo. Te sugiero que estudies las notas de la aplicación en detalle.

Como nota aparte, si aún no ha adquirido un NeTV para usar en este proyecto, le recomiendo que también vea tablero de Atlys de Digilent . Con dos entradas HDMI y dos salidas HDMI, parece estar hecho a medida para proyectos de este tipo.

    
respondido por el drxzcl

Lea otras preguntas en las etiquetas