¿Por qué los FPGA no son ubicuos?

Leyendo sobre FPGA, si entiendo correctamente, son básicamente circuitos de puerta lógica totalmente configurables. Siendo esto, uno puede diseñar cualquier cosa con ellos. Uno puede diseñar todo de la manera más personalizada posible y, por lo tanto, cumplir los mismos fines de una manera mucho más eficiente que la que se puede obtener con un microcontrolador. Teniendo esto, parece que un FPGA le gana a un microcontrolador en cualquier momento, cualquier día. Así que mi pregunta es, si los FPGA son realmente tan asombrosos, ¿qué les impide ser mucho más frecuentes que los microcontroladores? Desde este punto de vista, me parece que los FPGA deberían haber eliminado a los microcontroladores hace mucho tiempo. Entonces, ¿por qué no es este el caso? ¿Es el costo, la dificultad de programar un FPGA o algo completamente diferente?

posible duplicado de procesadores de núcleo blando VS procesadores de núcleo duro
Los helicópteros son más flexibles que los automóviles, entonces, ¿por qué alguien todavía usa un automóvil para ir al trabajo?
Porque todas las compañías de FPGA le brindan herramientas propietarias absolutamente horribles que tienen una gran curva de aprendizaje y no son accesibles para la mayoría de los desarrolladores. Reemplace eso con una cadena de herramientas completamente abierta y probablemente serían omnipresentes.
@R.. ... o al menos no una opción de último recurso absoluto.

Respuestas (8)

Está ignorando muchos factores que intervienen en la toma de decisiones de diseño:

  1. costo _ Los FPGA son más caros que los micros por la misma complejidad de lógica.

  2. Complejidad lógica . El código ejecutable puede implementar una lógica mucho más complicada que el mismo número de puertas en el micro utilizado directamente.

  3. Facilidad de desarrollo . Es más fácil escribir código ejecutable que definir la lógica para todos los problemas excepto para los pequeños. Incluso los proyectos de microcontroladores modestos tienen miles de líneas de código. Desarrollar las definiciones lógicas equivalentes llevaría mucho más tiempo y sería mucho más difícil de depurar y verificar.

  4. consumo de energía Dado que los FPGA están destinados a operaciones de alta velocidad que los micros no pueden manejar (de lo contrario, usaría un micro), no están optimizados para baja potencia. Esto los hace inadecuados para algunas aplicaciones de baja potencia. Algunos micros tienen corrientes de sueño por debajo de 1 µA y pueden operar con solo unos pocos µA a velocidades de reloj lentas. Intente encontrar un FPGA que pueda hacer esto.

Las principales ventajas de los FPGA frente a los micros es que son más rápidos y pueden hacer más cosas en paralelo. Aparte de eso, preferirías usar un micro. Por lo tanto, en el proceso de diseño, generalmente comienza con un micro y luego, de mala gana, pasa a un FPGA cuando realmente necesita la velocidad y/o la operación simultánea de alta velocidad. Incluso entonces, implementa solo las partes críticas para la velocidad en un FPGA y deja las funciones de control de velocidad más bajas y similares en el micro.

"Incluso entonces, implementa solo las partes críticas para la velocidad en un FPGA y deja las funciones de control de velocidad más bajas y similares en el micro". Y eso es porque el desarrollo de un FPGA es un fastidio, ¿verdad?
@Utku: Sí, esa es la razón 3 anterior, aunque las razones 1-2 generalmente también se aplican. Los FPGA simplemente no son tan rentables como los micros para la misma tarea, a menos que esa tarea tenga requisitos de velocidad tan altos que un micro simplemente no pueda hacerlo.
Es fácil decir que esta respuesta está escrita desde el punto de vista del usuario de la CPU. "ir a regañadientes a un FPGA cuando realmente necesita la velocidad y/o la operación simultánea de alta velocidad". No son tan malos . Hay aplicaciones en las que uno ni siquiera pensaría en usar una CPU sobre un FPGA.
La forma en que suelo explicarlo: es difícil hacer cosas en paralelo en una CPU, y es difícil hacer cosas en serie en un FPGA.
Si está pirateando por diversión, simplemente implemente un microcontrolador HDL en su FPGA y obtenga lo mejor de ambos mundos.
Una gran cosa para recordar acerca de los FPGA: la reconfigurabilidad de la lógica tiene un precio: la lógica equivalente que implementa un FPGA es mucho menos complicada que el propio FPGA. Todas las tablas de búsqueda, los componentes de la matriz de enrutamiento, etc. consumen mucha más área de silicio y energía que las implementaciones equivalentes en lógica dura. Esto significa que los FPGA son peores en todas las métricas de rendimiento (consumo de energía activo e inactivo, densidad, velocidad de reloj, etc.) que construir la misma funcionalidad directamente en silicio como se hace con microcontroladores, CPU de propósito general y el FPGA mismo.

Una distinción que no he visto detallada aquí es que los FPGA se usan y se comportan de una manera completamente diferente a los procesadores.

Un FPGA es realmente bueno para hacer exactamente la misma tarea, una y otra vez. Por ejemplo, procesamiento de señales de video, audio o RF. O enrutar paquetes Ethernet. O simulando el flujo de fluidos. Cualquier situación en la que tenga una gran cantidad de datos del mismo tipo que se le arrojan muy rápido y desea tratar con todo de la misma manera. O desea ejecutar el mismo algoritmo repetidamente. El FPGA realmente no tiene 'tareas' que comiencen y se detengan [1], todo su trabajo es hacer lo mismo con cualquier dato que obtenga, mientras esté encendido. No cambia de marcha, no hace nada más. Es el último trabajador de la línea de producción. Hará lo mismo repetidamente, tan rápido como pueda, para siempre.

Las CPU, por otro lado, son el epítome de la flexibilidad. Se pueden programar para hacer cualquier cosa y se pueden programar para hacer varias cosas diferentes al mismo tiempo. Tienen tareas que comienzan y se detienen, cambian de marcha, realizan múltiples tareas, están constantemente cambiando y cambiando funciones.

La FPGA y la CPU son completamente opuestos. El producto de la CPU es el tiempo: debe hacer las cosas más rápido. Cuanto más rápido se ejecute su aplicación, mejor.

El producto de la FPGA es el espacio. Su FPGA es tan grande y solo hay tantas puertas disponibles para realizar la tarea que desea. La mayoría de las veces, el problema es más el tamaño que la velocidad[2].

Es posible hacer que una FPGA actúe como una CPU. Puede colocar un núcleo IP de CPU en un FPGA, sin embargo, es muy difícil de justificar debido a las razones que otros han descrito [3]. El FPGA y la CPU son opuestos, ambos tienen sus propias fortalezas y debilidades y, como resultado, ambos tienen su propio lugar.


Notas:

1) Un FPGA podría diseñarse para realizar diferentes tareas, pero incluso entonces sería un número específico para el que fue diseñado previamente.

2) La velocidad también es una especificación de diseño de FPGA. Es realmente una compensación entre la velocidad y el tamaño.

3) Poner una CPU en un FPGA se hace con relativa frecuencia, sin embargo, se hace caso por caso, dependiendo de las aplicaciones específicas. Por ejemplo, si necesita un microcontrolador realmente pequeño y tiene espacio adicional para FPGA.

Y finalmente: esta respuesta es una gran simplificación: los FPGA se usan de formas enormemente variadas y complejas y esta es una descripción muy breve de la forma en que se usan en general.

"O enrutar paquetes de ethernet. O simular el flujo de fluidos". Aunque, que yo sepa, ASIC se suele utilizar para lo primero (al menos en la producción en masa) y las GPU son más rápidas, baratas, de menor consumo y más fáciles de programar para lo segundo.
@reirab Esos fueron ejemplos del tipo de operaciones que los FPGA pueden hacer bien, me vinieron a la mente porque ambas son aplicaciones para las que personalmente he codificado FPGA. Hay más de una forma de despellejar a un gato. La elección del dispositivo depende de muchos factores de diseño.
@reirab cualquier cosa que un FPGA pueda hacer, un ASIC lo puede hacer por menor potencia y un menor costo marginal de producción. Las ventajas de FPGA están en la creación de prototipos y la producción de bajo volumen porque los costos iniciales de un ASIC son mucho mayores; lo que significa que estos últimos solo tienen sentido cuando el diseño está finalizado y estás haciendo muchos de ellos.
Es extraño afirmar que una CPU es más flexible que una FPGA, considerando que puede implementar una CPU fácilmente dentro de una FPGA (cualquier estudiante serio de informática debería hacerlo al menos una vez). Un FPGA es un concepto mucho más bajo que una CPU, por lo que no tiene mucho sentido compararlos directamente en mi humilde opinión.
Esta respuesta realmente me molesta. "La materia prima de la CPU es el tiempo", "La materia prima de las FPGA es el espacio". ¿Eh? Los ASIC y las CPU son polos opuestos, y los FPGA se encuentran en el medio y obtienen lo mejor y lo peor de ambos mundos.
@Jotorio. está bien.

Como dice Olin, algo como un micro es más eficiente para muchas tareas, y casi siempre encontrarás un micro usado dondequiera que aparezca un FPGA. La superficie cultivada de silicio utilizada (que se traduce en costo de manera no lineal) y el consumo de energía son mucho menores. Por esa razón, no es raro implementar una MCU 'suave' en un FPGA, pero el costo y el rendimiento de tal micro son decepcionantes.

Algunos FPGA modernos contienen uno o más núcleos "duros", como la omnipresente serie ARM. Además, pueden contener bloques de memoria dedicados, ya que es realmente ineficiente crear memoria fuera de las puertas. Un micronúcleo de 32 bits ocupa una pequeña parte del área de silicio en un FPGA típico, lo que le da una idea de los costos relativos.

El desarrollo es significativamente más difícil, y la IP tiende a no estar disponible de forma tan gratuita como para micros y soluciones SOC dedicadas, por ejemplo, controladores LCD, interfaces PCI, MAC Ethernet. La razón es en parte que al revelar las descripciones lógicas HDL están transfiriendo el diseño, no solo la instanciación del diseño. Otra razón es que el rendimiento depende del diseño de la lógica en el FPGA, lo que requiere mucho esfuerzo durante el desarrollo.

Una complicación adicional es que los FPGA más complejos están basados ​​en RAM para la configuración y los costos del proceso son tales que se requiere una memoria no volátil externa para almacenar la configuración y la memoria del programa para cualquier MCU a bordo. Esta memoria debe cargarse en la RAM durante el encendido.

Los FPGA son herramientas extremadamente útiles en la caja de herramientas, pero no reemplazarán universalmente a los MCU o ASIC en el corto plazo.

El mejor uso del silicio para un trabajo es un ASIC, nada desperdiciado, pero tienen una gran curva de aprendizaje, NRE e inflexibilidad.

Hay dos formas de construir flexibilidad en un chip. a) Tener una ALU optimizada para el espacio y usarla una y otra vez en los datos almacenados. Esto se denomina MCU y requiere una gran área de silicio que "no hace nada", la memoria del programa, buses anchos que van de una unidad a otra y conmutadores de acceso al bus. b) Tener una lógica detallada, con algunas piezas opcionales optimizadas para el espacio, como multiplicadores, RAM pequeñas y CPU simples. Esto se llama FPGA y requiere una gran área de silicio que "no hace nada", interruptores programables y líneas de conexión.

Obviamente, con esas estructuras, los MCU funcionan mejor para tareas que se pueden dividir en fragmentos en serie, y los FPGA funcionan mejor para tareas que necesitan una operación paralela de alta velocidad. Cuando la aplicación es pesada y el costo está dominado por el costo del silicio, así es como se usarán naturalmente los dos tipos.

Cuando la aplicación es liviana pero de gran volumen, el costo está dominado por el empaque en lugar del silicio, y cualquiera de los dos tipos es viable. Altera tiene algunos FPGA muy pequeños y de muy baja potencia para competir con MCU de un dólar el puñado.

Para aplicaciones de bajo volumen, el costo de desarrollo tiende a dominar, y las MCU ganan, suponiendo que tengan la velocidad

En términos de consumo de energía y utilización de silicio, un FPGA es muy pobre en comparación con un microprocesador.

Un FPGA consume gran parte de su área de silicio en el circuito de configuración lógica, algo que no se aplica a un micro. Tiene que haber muchas más interconexiones disponibles de las que se necesitarían en una implementación dedicada de un microprocesador.

El FPGA consume más energía que un ASIC dedicado, como un microprocesador, ya que la lógica no se implementa de manera tan eficiente.

Cualquier función que se pueda implementar en un FPGA se puede realizar de manera más eficiente, más económica, con menor consumo de energía, menor espacio en la placa, etc. en un ASIC dedicado. Esto supone que los volúmenes son lo suficientemente grandes como para compensar el NRE.

Si el objetivo es implementar todo el conjunto de características del microprocesador, seguro. Una vez que se dedica a una tarea específica, también puede identificar una gran cantidad de silicio desperdiciado en el microcontrolador; tal vez ese motor de cifrado sea espacio desperdiciado en su proyecto. ¿O el periférico CAN? ¿O la unidad de punto flotante? La mejor utilización de FPGA es menor, pero tampoco sufre una utilización del 0% en áreas grandes como lo hace un microcontrolador. (Por otro lado, con la activación del reloj, tener un 0% de uso de circuitos grandes es muy deseable desde una perspectiva de potencia)

Los sistemas basados ​​en microprocesadores y, más tarde, los microcontroladores, han sido capaces de lograr un enorme grado de funcionalidad gracias a su capacidad para utilizar muchas de las piezas individuales de los circuitos para realizar muchas tareas diferentes en momentos diferentes. Creo que es instructivo comparar la máquina recreativa Tank, diseñada en 1976, con el juego Combat que se ejecuta en la segunda máquina de juego controlada por microprocesador del mundo, la Atari 2600. Si bien existen algunas diferencias en el juego, el hardware de la Atari 2600 se diseñó esencialmente implementar juegos como Tank a un costo mínimo; el hecho de que se pudiera hacer para jugar diferentes juegos insertando diferentes cartuchos ROM fue una buena ventaja.

El juego Tank permite a dos jugadores conducir tanques por la pantalla y dispararse entre sí. Tiene contadores de "deslizamiento" para la posición X e Y de cada tanque, la posición X e Y de los disparos de cada jugador, contador arriba/abajo para el ángulo de cada jugador y el ángulo de disparo de cada jugador, un contador para la puntuación de cada jugador, haz de trama X e Y -Contadores de posición y muchos circuitos de control encima de esas cosas. Tiene hardware para obtener datos del campo de juego de la ROM y mostrarlos, así como hardware para obtener formas para los tanques de dos jugadores y puntajes de la ROM y mostrarlos.

El Atari 2600 tiene un contador de deslizamiento para las posiciones horizontales de cada uno de los dos objetos del jugador, cada uno de los dos objetos de misiles y un objeto adicional llamado "bola" que no se usa en Combat pero se usa en algunos otros juegos. Para cada uno de los objetos del jugador, tiene hardware para generar un patrón almacenado en un latch de 8 bits, así como un latch de ocho bits "retrasado" para cada jugador que se copia en el latch principal de 8 bits cada vez que el otro jugador. se actualiza la forma. También tiene un contador de posición de haz horizontal y un pestillo con forma de campo de juego de 20 bits que se envía a la pantalla dos veces por línea de escaneo, y la copia del lado derecho aparece como una repetición o un reflejo de la izquierda. Tiene hardware para detectar colisiones, pero no para hacer nada como consecuencia de las mismas. no lo haceno tiene ningún hardware para las posiciones verticales de ningún objeto, ni la posición vertical del haz de trama (!), ni tiene ningún hardware asociado con el mantenimiento de la puntuación, la visualización de la puntuación, la duración del juego, etc.

Todas las funciones para las que el 2600 omite el hardware son manejadas por software en el cartucho. Solo es necesario verificar la posición vertical de cada objeto contra la posición del haz de trama una vez por línea de exploración, solo es necesario actualizar la puntuación del jugador y el tiempo de juego restante como máximo uno por cuadro, las puntuaciones de los jugadores se almacenan en líneas de exploración sobre el campo de juego y por lo tanto pueden compartir el mismo hardware que se usa para el campo de juego, etc.

El enfoque normal para implementar un juego como "Tank" en un FPGA sería usar circuitos separados para diferentes funciones de la misma manera que lo hizo la máquina recreativa de 1976. Tal enfoque funcionaría, pero usaría una cantidad sustancial de hardware. Un enfoque basado en microprocesador podría eliminar más de la mitad de ese hardware a cambio de agregar un microprocesador, que probablemente contendría menos circuitos que el hardware que reemplazó (el 2600 podría implementar juegos mucho más sofisticados que Tank, lo que requeriría mucho más hardware si no usaran un microprocesador).

Los FPGA son excelentes en los casos en que se necesita un dispositivo que pueda realizar muchas tareas simples simultáneamente . Sin embargo, los sistemas basados ​​en microprocesadores (o basados ​​en microcontroladores) generalmente son mejores en los casos en que hay muchas tareas que deben realizarse, pero no es necesario procesarlas simultáneamente, porque facilitan el uso de una pequeña cantidad. de circuitos para lograr un gran número de propósitos distintos.

¿No podrías poner minas también? ;-)
@ScottSeidman: La máquina recreativa tenía algunas minas en posiciones cableadas, que se dibujaron como X. Habría sido muy difícil para el 2600 mostrar las minas como X mientras mostraba a ambos jugadores y ambos misiles. Si a uno no le importara que las minas parpadearan a 60 Hz, habría sido posible usar algunos trucos que se descubrieron más tarde, pero habría requerido más código (COMBAT es un cartucho de 2K que está bastante lleno, incluso los dos bytes en el no utilizado ¡Los vectores BRK/IRQ en $FFFE/FFFF se utilizan para mantener una tabla de dos bytes!).
Probablemente hubiera sido posible que Combat implementara las minas como cuadrados intermitentes si hubiera estado dispuesto a renunciar a algunas de sus otras opciones, como disparos que rebotan, etc., pero creo que Joe Decuir (programador) hizo un buen trabajo al elegir las opciones jugables. Mi único problema es que el biplano contra el bombardero podría haber sido más divertido si el bombardero fuera un sprite 2x en lugar de 4x.

Solo para agregar a las otras muy buenas respuestas, creo que la adopción de FPGA también es una cuestión de dominio: por ejemplo, para dispositivos neuromórficos, las placas FPGA se están volviendo bastante omnipresentes porque existe una gran necesidad de paralelismo, que es un punto fuerte de FPGA.

Si extrapolas la tendencia que vemos para los dispositivos neuromórficos, uno puede imaginar que otros campos que se basan, o que requieren críticamente, el paralelismo probablemente adoptarán mucho más los FPGA. Entonces, tal vez FPGA no se vuelva omnipresente para los productos de consumo, pero puede serlo para dominios específicos, como parece que está sucediendo actualmente para los dispositivos neuromórficos.

Si bien esto puede ser cierto, esto no parece suficiente para una respuesta completa. Tal vez sería mejor como comentario, o podría ampliarlo.
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
@Funkyguy, esto responde la pregunta. Esencialmente, están diciendo que los FPGA no son ubicuos porque las aplicaciones de consumo comunes no requieren el paralelismo que es el punto fuerte de los FPGA.

Es totalmente el costo. Cuando un micro puede costar tan solo 30 centavos, un FPGA barato está en el territorio de los $5. El costo puede no parecer tan alto, pero cuando haces un millón de un juguete novedoso que se tira pedos para venderlo a $ 10, entonces el precio del FPGA mata tu resultado final.

El costo es ciertamente un problema, pero decir que la diferencia es completamente el costo es tan ingenuo como pensar que todos los micros pueden ser reemplazados por FPGA.
@OlinLathrop si el costo no fuera un problema, entonces cualquier cosa que pueda hacer un micro, lo puede hacer un FPGA. Esto se ha demostrado con la capacidad de un FPGA para contener un núcleo de microcontrolador suave. El problema es que un FPGA que puede contener un núcleo de este tipo es al menos y en un orden de magnitud más caro que el micro cuyo núcleo está siendo emulado.
El costo puede significar mucho más que el precio por unidad, pero eso es todo lo que desea incluir en este análisis.
No puedo decir si estás fingiendo deliberadamente perder el punto, o simplemente denso. De cualquier manera, estás respondiendo a algo que nadie dijo. Todos están de acuerdo en que los FPGA cuestan más y que el costo es un problema. Pero, de nuevo, afirmar que es el único problema es simplemente incorrecto. Si le doy un montón de micros y FPGA gratuitos, todavía hay razones importantes por las que usaría los micros sobre los FPGA en muchos diseños.
El costo es una pista falsa. Los micros cuestan menos porque se usan más. Si los FPGA se usan más, también costarían menos. Tomemos, por ejemplo, los ARM que solían costar más que x86 pero eran muy atractivos para aplicaciones de bajo consumo. Cuando los teléfonos con funciones comenzaron a aparecer en el mercado, el costo de los ARM comenzó a caer. Cuando los teléfonos inteligentes comenzaron a aparecer, era obvio qué arquitectura de CPU usar porque el costo de los ARM era significativamente más bajo que cualquier otra cosa. Pero el costo era bajo porque se usaban mucho. No al revés.
@sleb: No, la diferencia de costos no se debe solo al volumen. El área de silicio requerida por puerta entregada es significativamente mayor en un FPGA que en un chip personalizado como un microcontrolador. Toda esa configurabilidad en el nivel de interconexión de la puerta requiere un área de silicio para implementarse. En grandes volúmenes, el costo de un chip tiene que ver con su área de silicio.