¿Por qué los FPGA se usan con tanta frecuencia para proyectos de video HDMI?

24

Si observa los proyectos de hdmi en un sitio como hackaday , descubrirá que casi todos ellos involucran un FPGA. No creo haber visto ningún proyecto de bricolaje con salida HDMI que no haya usado un FPGA.

¿Pero por qué? Por lo que puedo decir, los FPGA son caros, alrededor de $ 70- $ 100. Compare eso con una Raspberry Pi por $ 35, que puede hacer cosas mucho más complejas y genera HDMI. ¿Por qué no se usa un ARM? ¿O un microcontrolador aún más barato?

En el caso de actualizar el video en sistemas de juegos antiguos, la lógica no debería ser más complicada que un microcontrolador barato puede manejar , pero sigo viendo HDMI como un obstáculo imposible solo abordado por FPGA.

kcghost
fuente
También puede encontrar G PUS barato (como en RPi). El problema es que no harán cosas que violen la licencia HDMI o que sean completamente ilegales en algunos países (DMCA). Que es lo que hacen la mayoría de los proyectos que vincula. Puede comprar una GPU IP core y modificarla para hacer esas cosas ... Pero, ¿quién la fabricará por usted? FPGA es un hombre pobre (o pirata) fabuloso.
Fizz

Respuestas:

66

Básicamente, ningún microcontrolador, incluso la frambuesa pi, es lo suficientemente rápido. El raspberry pi tiene una GPU integrada que genera la salida HDMI. Y aparte de eso, la capacidad de E / S de la frambuesa pi es increíblemente limitada: la interfaz de mayor ancho de banda aparte de HDMI es USB. Muchos de los proyectos de conversión HDMI implican tomar otro flujo de video en un formato extraño y reelaborarlo en algo que pueda enviarse a un HDTV estándar a través de HDMI. Esto requiere cierta lógica de interfaz personalizada para leer la señal de video, lógica de procesamiento de señal para volver a formatearla, lógica de codificación HDMI TMDS y luego serializadores de alta velocidad para controlar el puerto HDMI.

Trabajar con transmisión de video de alta definición sin comprimir requiere el procesamiento de una gran cantidad de datos, algo que no es factible en una CPU de uso general. Una señal de video de 1080p a 30 cuadros por segundo tiene aproximadamente 62 millones de píxeles por segundo. El raspberry pi funciona a 700 MHz, por lo que tienes, oh, 11 instrucciones por píxel. Y son 11 instrucciones para leer en formato de video extraño en tiempo real, reescalarlo, etc., etc. No es posible. Período.

En un FPGA, es posible generar una larga tubería de procesamiento que puede procesar uno o más píxeles por ciclo de reloj y hacerlo de una manera altamente determinista (¡sin interrupciones ni cambios de tarea!) Para que los datos de píxeles estén listos para la transmisión a través de HDMI exactamente en el momento correcto. Si ha trabajado extensamente con CPU de propósito general que ejecutan cualquier tipo de sistema operativo, sabrá que obtener una sincronización precisa en un nivel de milisegundos es más o menos factible, pero en un nivel de microsegundos es prácticamente imposible. Para HDMI, necesita precisión de escala de nanosegundos. No es factible en una CPU de uso general. Además, eche un vistazo al proyecto de audio / video HDMI para el neo geo. Este no solo tiene que reescalar el video, también tiene que volver a muestrear el audio e insertarlo en la transmisión de video HDMI.

Y esto todavía no está considerando la lógica personalizada requerida para leer en cualquier formato de datos de entrada que tenga. Necesitará hardware personalizado para interpretar esto. El software no es lo suficientemente rápido o lo suficientemente determinista. Es posible que pueda, por ejemplo, volver a formatearlo en algún tipo de flujo basado en USB, pero esto requerirá una lógica digital personalizada de todos modos, por lo que también podría generar HDMI directamente.

Para implementar todo esto, la lógica digital es realmente la única solución viable. Y si está haciendo lógica digital, los FPGA son la única solución factible, ya que es demasiado rápida y demasiado compleja para la lógica discreta 7400 y los ASIC son, bueno, varios órdenes de magnitud más caros.

Otro componente requerido son los serializadores de alta velocidad y los controladores diferenciales para generar los flujos de datos en serie paralelos que se envían por el cable. No es posible hacer un bit de datos en serie del orden de un gigabit por segundo desde una CPU de uso general, esto requiere hardware especializado. La Raspberry Pi tiene una GPU integrada que hace esto, pero está limitada en términos de lo que la GPU es capaz de hacer, sin mencionar lo que está documentado. La mayoría de los FPGA contienen al menos los controladores diferenciales necesarios y los flip flops DDR que son suficientes para admitir video de baja resolución y hay bastantes FPGA que también contienen los serializadores necesarios (es decir, bloques Xilinx OSERDES) para generar transmisiones Full HD. No olvide que la transmisión en serie no es 'banda base' como un puerto serie normal donde los datos reales se envían textualmente con cierta información de trama, pero los datos se codifican realmente con TMDS (señalización diferencial minimizada en transición) para darle a la señal ciertas características eléctricas. Se requiere un poco de lógica para implementar esto además de los serializadores de alta velocidad reales. Todo esto es relativamente simple de hacer en lógica digital pura (bueno, la codificación de todos modos; los serializadores son posiblemente analógicos, o al menos una señal mixta) en un ASIC o un FPGA.

En realidad, es una parte muy importante del proceso general de diseño del sistema digital / embebido determinar qué partes de un sistema se pueden implementar en el software y cuáles requieren hardware, ya sea en forma de chips especializados, FPGAs, personalizados. ASIC, IP dura o blanda (HDL, netlists, GDSII), etc. En este caso, está claro: la generación de señal de video requiere hardware especializado, ya sea una GPU emparejada con una CPU de uso general, una FPGA con un disco duro integral o núcleo de CPU suave o emparejado con una CPU externa, o algo más especializado.

Editar: Me acabo de dar cuenta de que el sitio fpga4fun y el proyecto de video neo geo se ejecutan a 640x480 en lugar de Full HD. Sin embargo, esto realmente no hace esto mientras que la operación sea mucho más simple. El reloj mínimo de píxeles es de 25 MHz, con un reloj de bits de 250 MHz. Esto significa que el FPGA en realidad no requiere serializadores para transmitir HDMI, solo flip flops DDR. Sin embargo, esto todavía no alivia el problema de la lectura de los datos de video. Si desea hacer eso en la frambuesa pi sin asistencia de hardware, tendría que leer de GPIO continuamente a 25 MHz. Cuál es una lectura cada 175 instrucciones. Entrando en el reino de las posibilidades, pero la única forma de hacer que ese trabajo funcione es en metal desnudo (sin Linux) con ensamblaje codificado a mano.

alex.forencich
fuente
2
Ahora que mencioné la lógica 7400 ... Me pregunto si es posible generar una señal HDMI con lógica discreta. El sitio fpga4fun tiene un ejemplo de video 640x480 con un reloj HDMI de 25 MHz para una velocidad de bits de 250 Mbit / seg o DDR de 125 MHz. Eso no es tan alto como para que sea factible con chips lógicos discretos. Podría ser un proyecto interesante para alguien.
alex.forencich
11 instrucciones por píxel: ¿cómo calculó ese número? ¿Asume una instrucción por marca de reloj?
gronostaj
700 MHz / 62 Mpps = 11.3. Suposición aproximada de 1 CPU por ciclo de reloj para una CPU de un solo núcleo.
alex.forencich
Y la otra suposición que supongo que no mencioné es que la señal de video de entrada se golpearía en los pines GPIO sin asistencia de hardware, por lo que las instrucciones para eso tendrían que entrelazarse de alguna manera con el tiempo correcto.
alex.forencich
15
TL; DR: Tiene que hacerse en hardware. El software es muy lento.
JS.