¿Qué es una FPGA? Motivos de su auge en la comunidad Maker


Recientemente ha empezado a crearse un interés creciente por los dispositivos denominados FPGA, como alternativa a la electrónica de microprocesadores.

En esta entrada veremos qué es un FPGA, cuales son los motivos de su auge y popularidad en el mundo geek/maker. En el futuro nos adentraremos en los FPGA Open Source de la mano de la FPGA Alhambra

¿Qué es un FPGA?

Es un tipo dispositivo electrónico formado por bloques funcionales unidos a través de un array de conexiones programables.

Las FPGAs fueron inventadas en el año 1984 por Ross Freeman y Bernard Vonderschmitt, co-fundadores de Xilinx. Algunos de los principales fabricantes son Xilinx, Altera (comprado por Intel en 2015), MicroSem, Lattice Semiconductor o Atmel, entre otros.

Los FPGA son más lentos que un ASIC (Application-Specific Integrated Circuit), procesadores específicos desarrollados para desarrollar una determinada tarea. Sin embargo, la gran flexibilidad de poder cambiar su configuración hace que su coste sea menor tanto para pequeños lotes de fabricación como para prototipado, debido al enorme gasto requerido para desarrollar y fabricar un ASIC.

Los FPGA son empleados en la industria dedicadas al desarrollo de circuitos integrados digitales y centros de investigación para crear circuitos digitales para la elaboración de prototipos y pequeñas series de ASIC.

¿En qué se diferencia de un procesador?

Aunque en primer momento parece que un procesador y un FPGA son dispositivos similares, porque ambos son capaces de realizar ciertas tareas, lo cierto es que al profundizar es casi más fácil encontrar diferencias que similaridades.

Para entrar en el tema, recordemos de forma muy resumida la forma de trabajar de un procesador. Un procesador contiene una serie de instrucciones (funciones) que realizan operaciones sobre operadores binarios (sumar, incrementar, leer y escribir de la memoria). Algunos procesadores tienen más instrucciones que otras (asociados a circuitería interna del procesador) y es uno de los factores que determinan su rendimiento.

Por otro lado, contiene una serie de registros, que contienen los datos de entrada y salida en las operaciones del procesador. Además, disponemos de memoria para almacenar información.

Finalmente, un procesador contiene una pila de instrucciones, que contienen el programa que va a ejecutarse en código máquina, y un reloj.

En cada ciclo de reloj, el procesador lee de la pila de instrucciones los valores necesarios, llama a la instrucción oportuna, y ejecuta el cálculo.

Cuando programamos el procesador empleamos uno de los muchos lenguajes disponibles, en un formato entendible y cómodo para los usuarios. En el proceso de enlazado y compilación, el código se traduce a código máquina, que se graba en la memoria del procesador. A partir de ahí, el procesador ejecuta las instrucciones, y por tanto nuestro programa.

Sin embargo, al programar un FPGA lo que estamos haciendo es modificar una matriz de conexiones. Los bloques individuales están constituidos por elementos que les permiten adoptar distintas funciones de transferencia.

Juntos, los distintos bloques, unidos por las conexiones que programamos, hacen que físicamente se constituya un circuito electrónico, de forma similar a como haríamos en una placa de entrenamiento o al fabricar un chip propio.

Como vemos, la diferencia sustancial. Un procesador (en sus muchas variantes) tiene una estructura fija y modificamos su comportamiento a través del programa que realizamos, traducido en código máquina, y ejecutado de forma secuencial.

Sin embargo, en un FPGA variamos la estructura interna, sintetizando uno o varios circuitos electrónicos en su interior. Al “programar” el FPGA definimos los circuitos electrónicos que queremos que se configuren en su interior.

¿Cómo se programa una FPGA?

Los FPGA no se “programan” en el sentido al que estamos acostumbrados, con un lenguaje como C, C++, o Python. De hecho, los FPGA usan un tipo diferente de lenguaje denominado lenguaje descriptivo, en lugar de un lenguaje de programación.

Estos lenguajes descriptivos se denominan HDL o Hardware Description Language. Ejemplos de lenguajes HDL son Verilog, HDL o ABEL. Verilog es Open Source, por lo que será uno de los que oiremos hablar con mayor frecuencia.

Los lenguajes descriptivos no son algo exclusivo de los FPGA. Por el contrario, son una herramienta extremadamente útil en el diseño de chips y SoC.

Posteriormente el integrador (a grandes rasgos, el equivalente al “compilador” en lenguajes de programación) traduce la descripción que hemos realizado del dispositivo en un dispositivo sintetizable (realizable) con los bloques del FPGA, y determina las conexiones que tiene que realizar.

Las conexiones al FPGA se traducen en una determinada trama de comunicación específica del FPGA (bitstream), que es transmitida al FPGA durante la programación. El FPGA interpreta el bitstream y configura las conexiones. A partir de ese momento, el FPGA está configurado con el circuito que hemos definido/descrito.

Los lenguajes HDL tienen una curva de aprendizaje difícil. La mayor dificultad es que tiene un grado de abstracción muy bajo, ya que describen circuitos electrónicos. Esto hace que los proyectos crezcan enormemente a medida que aumenta el código.

Los fabricantes proporcionan herramientas comerciales para programar sus propios FPGA. En la actualidad, configuran entornos completos con una gran cantidad de herramientas y funcionalidades. Lamentablemente, la mayoría no son gratuitos, o lo son sólo para algunos modelos de FPGA del fabricante. Lamentablemente, no son gratuitos, y están unidos a la arquitectura de un único fabricante.

Con el desarrollo de los FPGA han aparecido otros lenguajes que permiten un mayor nivel de abstracción, similar a C, Java, Matlab. Ejemlo son System-C, Handel-C, Impulse-C, Forge, entre otros.

Con la evolución en el desarrollo de las FPGA también han aparecido herramientas centradas en la programación gráfica de las FPGA, como LabVIEW FPGA, o el proyecto Open Source IceStudio desarrollado por Jesús Arroyo Torrens.

Finalmente, algunas iniciativas han intentado realizar la conversión desde un lenguaje de programación a HDL (normalmente Verilog), que luego puede ser cargado en el FPGA con las herramientas del mismo. Ejemplos son el proyecto Panda, el proyecto Cythi, o MyPython, entre otros.

¿Por qué hay que simular un FPGA?

Cuando programamos un procesador, si cometemos algún error no suele haber problemas graves. Habitualmente incluso tendremos un entorno donde poder hacer Debug y poder tracear el programa, definir puntos de interrupción, y ver el flujo del programa.

Sin embargo, al programar un FPGA estamos configurando físicamente un sistema y, en caso de error, podríamos provocar un corto circuito y dañar parte o todo el FPGA.

Por ese motivo, y como norma general, siempre simularemos el diseño a probar en antes de cargarlo en el FPGA real.

Para la simulación se emplean, así mismo, lenguajes descriptivos, en combinación con algún software que permita simular y graficar la respuesta del FPGA. Un ejemplo de GTKWave.

Las suites comerciales, normalmente integran la herramienta de simulación dentro del propio entorno de programación.

¿Qué precio tiene un FPGA?

Lógicamente existe un gran rango de precios pero, en general, no son dispositivos baratos. Hablando del sector doméstico (las que vamos a comprarnos nosotros) están en el rango de 20 a 80€ euros aproximadamente.

Por ponerlo en contexto, es mucho más caro que un Arduino Nano (16Mhz) o un STM32 (160Mhz) que podemos comprar por 1.5€, un Node Mcu ESP8266 (160Mhz + WiFi) que podemos comprar por 3.5€. Incluso, son mucho más caros que una Orange Pi (Quad 800 Mhz + WiFi), que podemos encontrar por unos 20€.

¿Qué potencia tiene un FPGA?

Es difícil definir la potencia de cálculo de un FPGA, dado que es algo totalmente distinto a un procesador como el que podemos encontrar en un Arduino, un STM32, un ESP8266, o incluso un ordenador como Raspberry PI.

Las FPGA destacan en la realización de tareas en paralelo, y por un control extremadamente fino del tiempo y el sincronismo de las tareas.

En realidad, es mejor pensar en términos de un circuito integrado. Una vez programado, el FPGA constituye físicamente un circuito. En general, como hemos comentado, un FPGA es más lento que el ASIC equivalente.

La potencia de un FPGA viene dada por la cantidad de bloques disponibles y la velocidad de su electrónica. Además, intervienen otros factores como la constitución de cada uno de los bloques, y otros elementos como los bloques de RAM o PLLs.

Por seguir con la comparación, la velocidad de un procesador viene determinada por su velocidad de funcionamiento. Además hay que tener en cuenta que un procesador frecuentemente requiere entre 2 a 4 instrucciones para realizar una operación.

Por otro lado, aunque los FPGA normalmente incorporan un reloj para la elaboración de tareas síncronas, en algunas de las tareas la velocidad es independiente del reloj, y están determinado por la velocidad de los componentes electrónicos que lo forman.

A modo de ejemplo, en el bien conocido FPGA Lattice ICE40, una tarea simple como un contador puede ejecutarse a una frecuencia de 220Mhz (según el datasheet). En un único FPGA podemos hacer cientos de bloques de estos.

¿Qué es mejor Arduino, FPGA o Raspbery?

Pues… ¿Qué es mejor, una cuchara, un cuchillo o un tenedor? Son herramientas distintas, que destacan en cosas distintas. Ciertas tareas pueden realizarse con ambas, pero en algunas resulta mucho más adecuado y eficiente emplear una de ellas.

Afortunadamente, el campo científico y técnico no es como un partido de futbol o la política… no tenemos que elegir un bando. De hecho, podemos usarlas todas incluso simultáneamente. Así, existen dispositivos que combinan un procesador junto con un FPGA para proporcionarnos lo mejor de ambos mundos.

En cualquier caso, las FPGA son una herramienta muy potente y lo suficiente diferentes del resto para ser interesantes por sí mismos.

¿Puedo hacer un procesador con un FPGA?

Por supuesto que sí. Un FPGA puede adoptar cualquier circuito lógico electrónico, y los procesadores son circuitos electrónicos. La única limitación es que el FPGA tiene que ser lo suficientemente grande para alojar la electrónica del procesador (y los procesadores no son precisamente pequeños)

Hay proyectos de pequeños procesadores que pueden ser configurados en un FPGA. Ejemplos son MicroBlaze y PicoBlaze de Xlinx, Nios y Nios II de Altera, y los procesadores de código abierto LatticeMicro32 y LatticeMicro8.

Incluso existen proyectos para emular procesadores históricos en FPGA, como el procesador del Apollo 11 Guidance Computer.

Emular un procesador FPGA es un ejercicio interesante tanto por la complejidad, como por el aprendizaje. Además, es interesante si queremos probar nuestro propio procesador o nuestras ideas.

Sin embargo, en la mayoría de los casos, resulta más sencillo y económico combinar el FPGA con un procesador existente. Existen muy buenos procesadores (AVR, ESP8266, STM32).

¿Por qué están en auge los FPGA?

En primer lugar, porque con el tiempo las tecnologías bajan de precio. Hace no muchos años un autómata con una capacidad similar a un Arduino podía costar cientos e incluso miles de euros, y ahora podemos encontrarlo por pocos euros.

De forma similar, los FPGA han ido alcanzando popularidad en la industria. A medida que aumenta la producción han aparecido con mayores capacidades y funcionalidades. Incluso existen gamas destinadas a dispositivos embebidos o aplicaciones móviles. Todo esto propicia la bajada de precio de ciertos modelos de FPGA.

Por otro lado, el principal motivo del auge de la popularización de los FPGA en el ámbito doméstico/maker es el trabajo de ingeniería inversa realizado por Clifford Wolf en el FPGA Lattice iCE40 LP/HX 1K/4K/8K, que dio lugar al proyecto IceStorm.

El proyecto IceStorm es un toolkit (formado por IceStorm Tools + Archne-pnr + Yosys) que permite la creación del bitstream necesario para programar un FPGA iCE40 con herramientas open Source.

El trabajo de Clifford se realizó un IceStick, una placa de desarrollo con un FPGA iCE40, por su bajo coste y pequeñas características técnicas, que permitían el trabajo de ingeniería inversa.

Fue la primera vez que se podría programar un FPGA con herramientas Open Source. Esto permitió la generación de una creciente comunidad de colaboradores que han dado como frutos maravillas como IceStudio o Apio.

Tener en cuenta que el resto de FPGA requieren inversiones de cientos de euros para comprar el FPGA y hasta miles de euros en el software.

Digamos que, salvando distancias, el proyecto IceStorm y el Lattice ICE fue el inicio de una revolución en el campo de las FPGA similar a la que empezó Arduino con los procesadores AVR de Atmel, y que ha permitido poner al alcance de los usuarios domésticos.

¿Tienen futuro los FPGA o son una moda pasajera?

Pues aún sin tener una bola de cristal, lo más probable es que los FPGA sean dispositivos que tendrán utilidad, al menos, a medio y corto plazo. Como hemos dicho, se usan frecuentemente para facilitar el diseño y prototipo de ASIC. Además están ampliando su ámbito de aplicación, desde aplicaciones con cálculos pesados (sistemas de visión, IA, conducción autónoma) a versiones ligeras para dispositivos móviles.

Como ejemplo de su viabilidad, considerar que Intel ha invertido 16.700 millones de dólares en la compra de Altera. Estimaciones del mercado apuntan a una estimación de 9000-10000 millones de dólares para el 2020, frente a los 6000-7000 millones de dólares de 2014, y un crecimiento anual del 6-7% (muy por encima del 1-2% del crecimiento medio para el sector de los semiconductores).

Hablando del futuro (años) en el que los FPGA se abaraten y popularicen, podemos incluso imaginar sistemas híbridos FPGA y procesador (o incluso totalmente FPGA) donde el software puede reconfigurar el hardware, creando o deshaciendo procesadores, o memoria, en función de las necesidades.

La auténtica pregunta es ¿tienen futuro los FPGA Open Source y en el campo “doméstico” o son una moda pasajera?

La respuesta corta es, esperemos que sí. La larga es que, a día de hoy, únicamente tenemos un FPGA (el iCe40) disponible compatible con herramientas Open Source, y en realidad es FPGA bastante pequeño y poco potente.

Si la técnica sigue avanzando y la comunidad no es lo suficiente fuerte para generar un ecosistema que empuje de las FPGA hacia el Open Source, hay un cierto riesgo en que quede una burbuja pasajera.

La mejor forma es fomentar a la extensión de este tipo de dispositivos, y que se genere una comunidad fuerte que propicie la popularización de esta tecnología. Y si es posible, creando y mejorando las herramientas Open Source disponibles para las FPGAs. 

Previous Librería Arduino SimpleStepper
Next Torreta servo controlada por Arduino: Programación

¡Deja un comentario!...

avatar
1000
Sort by:   newest | oldest | most voted
talud08
Guest

Muchas gracias por tu artículo me ha aclarado unas cuantas ideas.
Creo que hay que apoyar a la comunidad para que las iniciativas Open Source salgan adelante.
Un saludo

wpDiscuz