Llevamos ya un par de meses escribiendo artículos y tutoriales sobre VHDL y FPGAs y todavía no hemos subido un artículo sobre qué es una FPGA. Es imperdonable, así que hoy vamos a poner solución a esto con una pequeña (o no tan pequeña, depende de lo inspirado que esté) introducción a las FPGA.

Y de nuevo como la Wikipedia es la página que más sabe en el mundo sobre todo, vamos a plagiarla un poco para ver cuál es la definición de FPGA.

Una matriz de puertas programables o FPGA (del inglés field-programmable gate array), es un dispositivo programable que contiene bloques de lógica cuya interconexión y funcionalidad puede ser configurada en el momento, mediante un lenguaje de descripción especializado. La lógica programable puede reproducir desde funciones tan sencillas como las llevadas a cabo por una puerta lógica o un sistema combinacional hasta complejos sistemas en un chip.

Esta descripción se ajusta bastante a la realidad, aunque también tengo que decir que el segundo párrafo que sigue a este es bastante poco acertado, pero bueno, nadie es perfecto, ni siquiera la Wikipedia.

Para entender bien que es una FPGA os recomiendo que le echéis un vistazo a nuestro post sobre VHDL. En el hablamos de circuitos lógicos, es decir, que contienen puertas lógicas y registros.

Una FPGA es como bien se describe un dispositivo que contiene millones de «puertas y registros», y una memoria de configuración que define cómo estos elementos se comportan e interconectan. De esta manera podemos crear cualquier circuito complejo (o sencillo) utilizando estos recursos. Además al ser esta interconexión dependiente de una memoria, podemos cargar diferentes configuraciones.

He encontrado buscando por ahí esta imagen sobre la estructura interna de una FPGA que me ha parecido muy ilustrativa.

Como podéis ver la FPGA sigue una estructura regular de bloques CLB, cada uno conteniendo LUT (Look Up Table) que es donde se implementan los circuitos lógicos y FF, o sea, flip-flops, que son los registros.

Para conectar estos bloques hay toda una red de interconexión bastante compleja.

Como veis no hay puertas lógicas, por eso puse más arriba puertas entre comillas. Esto es porque la lógica se implementa en las LUT, que son una pequeña memoria que contienen la tabla de verdad del circuito., de esta manera es muy fácil llenarlas desde el fichero de configuración.

La estructura de las FPGA mas modernas es más compleja ya que contiene muchos más recursos de todo tipo, como procesadores o controladores de memoria, pero en general sigue esta estructura.

¿Para qué sirve una FPGA?

Una FPGA es simplemente una tecnología para poder implementar circuitos electrónicos. Por lo tanto sus aplicaciones son las mismas que cualquier otro chip. Dentro de una FPGA podemos meter microprocesadores, sistemas de procesado digital de señal, codificadores de video, tarjetas de red. Es la magia de la lógica reconfigurable, que puede convertirse en cada momento en lo que se necesite.

Si disfrutáis con Arduino podéis incluso poner un Arduino en una FPGA.

¿Cómo se programa una FPGA?

Si te preguntas como se programa una FPGA tengo que contestarte que seguramente entendamos de forma diferente a que te refieres con programar. Si eres novato lo más probable es que me preguntes cómo se crean diseños para en una FPGA. Es decir que si hay un lenguaje parecido a Java, C, o Python que permita crear esos circuitos. La respuesta es sí, existen los llamados lenguajes de descripción de hardware como Verilog o VHDL que permiten crear diseños que luego mediante herramientas de síntesis son convertidos al formato de la memoria que se descarga en la FPGA. Pero estos lenguajes no se parecen en nada a lenguajes de programación de software, son bastante más complejos

Si quieres aprender más sobre estos lenguajes hay un curso muy bueno en Udemy sobre VHDL y FPGA os lo recomiendo encarecidamente.

¿Qué fabricantes de FPGA hay?

En el mercado hay varios fabricantes de FPGA, entre los que destacan sobre todo Xilinx e Intel (antes Altera).

Yo personalmente siempre he trabajado con FPGA de Xilinx, pero las de Altera también son geniales. Tenéis en esta página tutoriales para trabajar con ambas y también nuestros videos de Youtube sobre VHDL y FPGA.

Aparte de estos dos gigantes existen otros fabricantes como Atmel o Lattice. Lattice esta de moda porque es posible sintetizar el circuito utilizando herramientas de código abierto como Yosys. Os dejo el enlace, pero aun a costa de generar polémica, yo no soy muy partidario de utilizar herramientas de código abierto basadas en ingeniería inversa como esta. Esto es debido a que en cualquier momento el fabricante puede decidir que estas herramientas dejen de funcionar, además de que funcionan en un número limitadísimo de FPGAs. Pero que sepáis que la opción existe.