Escrito por Xavi Crespo para Planeta Chatbot
Hace unos meses, la gente de Vigo Labs me pidió propuestas sobre temas interesante relacionados con chatbots para tratar en sus habituales quedadas. En ese momento yo me encontraba leyendo sobre dos temas diferentes pero igual de interesantes: el primero eran las redes comunicaciones de baja potencia como pueden ser Sigfox y LoRa; el segundo eran las FPGAs, algo que había vuelto a retomar tras ver todo el movimiento abierto que estaba naciendo entorno a ellas. Inmediatamente después de comentarles mi propuesta, esta fue su reacción:
- Eloy Coto: “Compro la charla de FPGAs. Tengo que ponerle fecha.”
- Xabi Crespo: “Yo he propuesto temas, no ponentes.”
- Eloy: “Jajaja, pues busco un ponente para las FPGAs, pero eres la única persona que conozco que sabe algo sobre el tema.”
Yo soy un novato en este campo, pero el hecho de dar una charla me exigía informarme más sobre el tema, por lo que accedí a ello, no sin antes poner dos requisitos. El primero, era que los contenidos fuesen de nivel introductorio, puesto que esperábamos que gran parte de los asistentes no hubiesen trabajado o incluso escuchado el término FPGA en su vida. El segundo era involucrar a alguien con más experiencia en el tema, en este caso, mi amigo Diego Hurtado.
Lo que pretendemos Diego y yo con este post conjunto, es dejar por escrito lo que hemos aprendido preparando los contenidos y exponer nuestras reflexiones. Esperamos que sirva también para dar a conocer más este dispositivo.
Las FPGAs son unos dispositivos nos permiten describir un circuito digital usando un lenguaje específico (los dos más comunes son VHDL y Verilog) y que tras cargarlo en el integrado, es creado físicamente en el chip. Su nombre es un acrónimo inglés que significa matriz de puertas reprogramable o Field Programmable Gate Array.
Internamente se componen principalmente de cables, puertas lógicas, biestables, y puertos de entrada y salida. Todo ello sin conectar, como una plantilla en blanco, hasta que se les carga un bitstream -un archivo generado a partir de la descripción del circuito-. Un símil que nos parece muy fácil de entender, es que las FPGAs son el equivalente a las impresoras 3D para los circuitos digitales. A diferencia eso sí de las impresoras, es posible reprogramar una FPGA tantas veces como se necesite, es decir, siguiendo con la analogía, el material imprimible nunca se acaba.
“Las FPGAs son el equivalente a las impresoras 3D para los circuitos digitales”
- Estructura interna de una FPGA (Fuente: FPGA wars)
¿Y por qué parece que últimamente las FPGAs han ganado peso en los medios de comunicación cuando se trata de un dispositivo que lleva existiendo desde los años 80? En nuestra opinión hay al menos dos motivos.
Por una parte, debido al progresivo estancamiento de la ley de Moore, las empresas ya no pueden delegar la mejora de la velocidad de sus algoritmos al continuo incremento de potencia de los procesadores. Es por ello que Microsoft está incluyendo una FPGA en todos sus servidores, consiguiendo multiplicar por 40 la velocidad de sus algoritmos de búsqueda. Se ha llegado a declarar que los resultados conseguidos por la empresa dirigida por Nadella, fueron el desencadenante de la adquisición de Altera por Intel, uno de los líderes del mercado de FPGAs junto a Xilinx, por nada menos que 16.000 M$. Según un representante de la compañía, la integración de FPGAs y CPUs en un único integrado podría incrementar la velocidad hasta un 50% con respecto a su uso en integrados separados.
Por último, pero no por ello menos importante, el año pasado y haciendo uso de la ingeniería inversa, Clifford Wolf (entre otros) desarrolló y liberó todas las herramientas necesarias para generar el bitstream de una Lattice iCE40. Nunca hasta ahora se había podido lograr esto sin depender de las herramientas privativas (y muchas veces prohibitivas en cuanto a coste) del fabricante. Esto ha significado que muchos aficionados se están introduciendo en un campo hasta ahora limitado principalmente a investigadores e industrias muy específicas.
En España tenemos la suerte de contar con un gran investigador, divulgador y maker como es Juan González, más conocido como Obijuan, que tras impulsar el movimiento Clone Wars que expandió el uso de las Impresoras 3D sobre todo entre makers, ahora ha comenzado FPGA Wars. ¡Los que queráis seguir aprendiendo sobre el tema, no dudéis en seguirle la pista!
Tabla de contenidos
Comparativa con procesadores de propósito general
Un procesador es un dispositivo complejo con un conjunto fijo de instrucciones. Cada una de ellas está asociada a un hardware conectado de forma fija, y el programador no puede usar más instrucciones que las definidas y configuradas por el fabricante. Por otra parte, la FPGA no tiene nada conectado de forma fija, sino que está compuesta por una red con conexiones que el usuario puede unir o romper, y que determinan el comportamiento lógico del dispositivo.
Cuando programamos un microprocesador, agrupamos una serie de instrucciones para su ejecución secuencial o en serie. Por otra parte, cuando describimos lógica digital para una FPGA, el circuito resultante contendrá múltiples señales que variarán al mismo tiempo, en una especie de ejecución paralela.
Otra forma de verlo es la siguiente: se suele decir que un procesador está limitado en tiempo o ciclos de reloj. Si queremos realizar más trabajo, esto se traduce en más ciclos de reloj, es decir, más tiempo. Sin embargo, una FPGA puede ejecutar múltiples tareas simultáneamente, pero en ese caso está limitada por espacio. Para realizar más trabajo, se necesitan más circuitos y por lo tanto más capacidad para albergarlos.
Cabe destacar que es posible incluir el diseño de un procesador en la lógica programable de una FPGA. Es lo que se suele llamar soft microprocessor, y es lo bastante común como para que muchos fabricantes incluyan estas descripciones de procesadores en sus entornos de desarrollo. De hecho, durante el diseño de muchos integrados o ASICs, incluyendo microprocesadores, se suele recurrir a FPGAs como paso previo a la fabricación final, reduciendo enormemente el coste.
Existen otras diferencias que merece la pena destacar. Frente a un microprocesador o microcontrolador, la mayoría de FPGAs necesitan más componentes externos para su funcionamiento. Este problema se hace más evidente si tenemos en cuenta que muchas tienen además una memoria de configuración volátil. Asimismo, suelen necesitar múltiples voltajes para funcionar y sus encapsulados cuentan con un número elevado de pines de entrada y salida, lo que complica el diseño.
El flujo de trabajo con las FPGAs
- Etapas del diseño para una FPGA (Fuente: FPGA wars)
A la hora de configurar una FPGA, el primer paso es el diseño del circuito, para lo que se necesitan conocimientos de electrónica digital. A diferencia de la programación software, es mucho más complicado empezar a picar código si no se tiene clara la arquitectura de la aplicación. Lo recomendable en este punto es hacer un diagrama del circuito completo para ser conscientes de las múltiples señales que van a coexistir y variar simultáneamente y de las consecuencias de cada una ellas.
Una vez claro lo que se pretende implementar, se procede a describir el circuito usando uno de los lenguajes ya citados: Verilog o VHDL. Otro hecho que nos da pistas sobre el cambio de paradigma es que no se llaman lenguajes de programación, sino lenguajes de descripción.
Debido a la complejidad de probar los circuitos digitales, lo habitual en este punto es usar bancos de prueba que simulan el comportamiento del hardware. Este tipo de herramientas permiten ver el estado de la señal en cada instante y verificar que las transiciones son las esperadas y los resultados los deseados.
La tercera etapa es la conocida como síntesis del circuito y es una de las claves del proceso. En ella se van a escoger los elementos a usar y su interconexión en función de los archivos de descripción. Por supuesto, para esta fase contamos con herramientas para facilitar y automatizar la tarea en la mayoría de las situaciones.
Todos los pasos anteriores son iguales para todas las FPGAs, independientemente del fabricante o la familia. Sin embargo, la última etapa, conocida como emplazado y enrutado, es específica para cada familia. En esta fase se genera el bitstream, que describe la configuración interna de la FPGA necesaria para originar lo que haya sido previamente descrito y sintetizado. Lo único que queda es cargarlo en la placa y validar el diseño.
Conclusiones
A nuestro parecer, estos dispositivos a medio camino entre el software y el hardware, resultan cuanto menos desafiantes para todo apasionado por la tecnología. Bien es cierto que la curva de aprendizaje es lenta, pero las recompensas son muy valiosas.
Además de aprender electrónica digital de una forma interactiva y barata (podemos crear infinitos circuitos sobre la misma FPGA), nos formaremos en un campo con mucha proyección de futuro. Como hemos contado más arriba, su flexibilidad y elevada potencia de cálculo las está convirtiendo en una pieza muy importante en el campo de la inteligencia artificial y el procesado de grandes cantidades de datos. También son una herramienta muy apropiada para aquellas aplicaciones que requieran controlar al máximo los consumos, ya que el hecho de diseñar circuitos específicos, nos permite optimizar al máximo la eficiencia.
Si queréis entender más a fondo el papel que pueden llegar a jugar las FPGAs en el futuro os recomendamos encarecidamente que leáis el artículo de Wired titulado Microsoft bets it’s future on a reprogrammable computer chip.
Para los que estéis interesados en introduciros en este mundillo, la comunidad de FPGA wars es vuestra mejor opción ahora mismo. Un placa Lattice iCEstick es seguramente la opción más barata ya que ronda unos 20€, aunque también están naciendo poco a poco placas libres como la ICEZUM Alhambra. Con respecto a las herramientas, si queréis comenzar con algo más intuitivo os recomendamos usar icestudio, un editor gráfico libre que es una maravilla. Si os queréis tirar a la piscina y usar archivos de texto, podéis usar Apio, que dispone incluso de un plugin para Atom.