Las FPGA eran dispositivos misteriosos y caros, pero hoy se consiguen placas bastante capaces por muy poco dinero. Con esa idea, Al Williams estrenó en Hackaday el 28 de septiembre The FPGA Chronicles, una serie que actualiza el FPGA Bootcamp que publicó años atrás en Hackaday.io. Gran parte de ese material sigue vigente, pero el hardware quedó viejo. La plataforma nueva es la económica Tang Nano 20K, con su FPGA GOWIN GW2AR-18, y quizás alguna excursión a otras FPGA.
Historia y motivación
Hubo un tiempo en que, si alguien quería un circuito integrado a medida, llegaba a una empresa de semiconductores con una carretilla llena de plata. En algún momento, alguien en una fábrica de chips se dio cuenta de que podía hacer un chip con muchos bloques sin conexión y, para cada cliente, diseñar solo el cableado entre ellos. Seguía haciendo falta una carretilla de plata, aunque más chica.
Después alguien pensó que se podía hacer lo mismo con conexiones configurables entre los bloques. Fusibles que se queman, o celdas de EEPROM o RAM que recuerdan qué bloque va con cuál. Es complicado, claro, pero así se pueden fabricar muchos de estos chips y vendérselos a gente que, en teoría, arma sus propios chips a medida sin ayuda del fabricante.
¿Cuándo hace falta una FPGA? Un ejercicio clásico en clases es el semáforo, porque sirve para mostrar máquinas de estado, que son importantes en algunos tipos de diseño. Fuera del aula, en cambio, no tiene mucho sentido. Hasta una CPU simple de 8 bits maneja un semáforo.
Otro caso es un cohete con cientos de sensores digitales, donde cualquiera de ellos debe disparar una alarma en pocos microsegundos. Un procesador tiene que leer las entradas por grupos, atender interrupciones o apoyarse en hardware extra. Una FPGA puede implementar el equivalente a una enorme compuerta OR que vigila todas las entradas sin pausa, y la lógica que corre en otra parte del chip no le quita tiempo de ejecución. ¿Se puede con un microcontrolador? Probablemente, pero no es fácil. Para ciertas clases de problemas, la FPGA es la mejor respuesta.
También se puede construir una CPU dentro de la FPGA, y algunas FPGA traen una CPU en el mismo encapsulado. Muchas veces ese es el punto justo. Lo que es fácil en software se hace en software y lo que es más fácil en hardware se hace en la FPGA.
¿Qué trae la Tang Nano 20K?
¿De qué tamaño tiene que ser una FPGA? Es difícil comparar entre fabricantes porque los bloques internos son distintos. Pasa algo parecido con la memoria de un PC, donde se habla de 1 GB contra 4 GB, pero el cuadro completo depende de la velocidad, el ancho de banda y los tiempos. Dos FPGA pueden tener una cantidad similar de bloques y los de una ser mucho más capaces que los de la otra. Aun así, la FPGA de la placa 20K rinde bien, aunque cueste compararla de forma directa con la de otros fabricantes.
Usa el GOWIN GW2AR-LV18QN88C8/I7, que contiene 20.736 tablas de consulta de cuatro entradas (LUT4) y 15.552 flip-flops. La frecuencia máxima depende mucho de la lógica y del ruteo, así que no existe una única "velocidad de reloj de la FPGA" que sirva de algo. Con diseños bien segmentados en etapas, el chip trabaja cómodo en el rango de los cientos de MHz bajos.
Donde el chip destaca es en memoria. La mayoría de las FPGA tienen RAM distribuida, que consume recursos del chip, y RAM en bloque, que son celdas de RAM dedicadas. El GOWIN tiene las dos opciones y además una SDRAM SDR de 8 MB y 32 bits dentro del mismo encapsulado. Hay que gastar algunos recursos de la FPGA para comunicarse con ella, aunque menos de lo que uno pensaría, y bastante menos de lo que costaría meter 8 MB de RAM en la propia lógica del chip.
Hay otros bloques de propósito específico, como 48 multiplicadores de 18×18 que se pueden configurar de varias formas. La placa Nano 20K suma un generador de reloj programable, una memoria flash QSPI de 64 Mbit y conexiones para audio, LCD, microSD y HDMI. Un microcontrolador a bordo permite programar el generador de reloj, grabar el chip por JTAG o entregar un puerto serie virtual hacia el computador.
El flujo de trabajo de una FPGA
Los pasos básicos son estos.
- Definir la lógica que se quiere con un lenguaje de descripción de hardware (la serie usa Verilog, aunque VHDL también es común).
- Definir un bloque superior (top) que se conecta con el mundo exterior.
- Fijar restricciones que, sobre todo, le dicen al dispositivo qué pines van a qué puertos del bloque superior.
- Correr la síntesis, que convierte el código HDL en primitivas.
- Correr el proceso de ubicación y ruteo (place and route), que asigna cada primitiva a recursos concretos del chip y produce un bitstream.
- Descargar ese bitstream a la RAM de la FPGA o a la flash de configuración, para que sobreviva a un corte de energía.
Todo eso se puede hacer con el IDE de GOWIN o con herramientas de código abierto que la serie revisará más adelante.
Por dentro
Uno podría pensar que lo cómodo es dibujar esquemáticos. Algunas herramientas de FPGA lo permiten, pero el IDE de GOWIN no. Sí puede dibujar esquemáticos para mostrar lo que uno pidió. Y en un diseño grande, dibujar esquemáticos se vuelve un suplicio. ¿Para qué dibujar un decodificador de 7 segmentos si se puede describir con un lenguaje parecido al de programación?
Dentro del chip no hay compuertas sueltas, sino tablas de consulta. Si uno especifica Z=A|(BC)|(A^D), la herramienta no busca una compuerta AND, una OR y una XOR. Construye una tabla y la programa para que produzca esa función. Por eso las LUT (Look Up Tables) son tan importantes.
El ejemplo más simple
Este es el diseño más sencillo posible.
module top(output led1, output led, input sw0, input sw1);
assign led=~(sw0|sw1);
assign led1=~(sw0&sw1);
endmoduleNada "ejecuta" estas líneas una tras otra. Le indican a la herramienta de diseño que conecte los dos interruptores a una compuerta lógica, invierta el resultado y lo lleve al LED. Una vez cargado en el chip, esto es cableado.
Los LED de la placa se encienden con nivel bajo, así que el diseño toma dos entradas (se supone que interruptores), calcula la OR y la AND y las manda a los LED. Los interruptores de la 20K tienen resistencias de pull-down, así que no hace falta configurar pull-up ni pull-down en la FPGA. La salida queda en uno lógico al presionar el interruptor.
¿Cómo se conectan los dispositivos al "código"? Con un archivo de restricciones, que se arma más fácil desde el editor "Floorplan". Ese editor genera un archivo que se puede modificar a mano si se prefiere trabajar así.
IO_LOC "led" 15;
IO_PORT "led" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "led1" 16;
IO_PORT "led1" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "sw1" 88;
IO_PORT "sw1" IO_TYPE=LVCMOS33 PULL_MODE=NONE BANK_VCCIO=3.3;
IO_LOC "sw0" 87;
IO_PORT "sw0" IO_TYPE=LVCMOS33 PULL_MODE=NONE BANK_VCCIO=3.3;Eso es todo. Los esquemáticos vienen en dos versiones. Una muestra lo que uno esperaría y la otra, cajas opacas de LUT. El artículo original incluye un video que recorre el diseño desde que se crea el proyecto hasta verlo funcionar en una protoboard.
La instalación en Linux
El proyecto final del Bootcamp 0.
Williams advierte que pasa por alto muchos detalles. El software de GOWIN corre en Linux, pero le costó bastante hacerlo andar. Como no usaba una distribución soportada, tuvo que resolver las dependencias por su cuenta, lo que no fue tan difícil.
El problema vino al ejecutar el programa. El primer tropiezo fue con libfreetype.so.6. Borró la copia privada del paquete y la enlazó a la del sistema, con lo que avanzó un poco más. Para que todo funcionara tuvo que definir (o ampliar) LD_LIBRARY_PATH con el directorio lib de GOWIN, de modo que el programa no tomara las bibliotecas del sistema.
El programador también necesitó ajustes para no chocar con otros controladores del sistema. En su caso, la solución fue crear el archivo /etc/udev/rules.d/99-tang-nano-20k.rules con esta línea.
SUBSYSTEM=="usb", DRIVER=="ftdi_sio", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTR{bInterfaceNumber}=="00", RUN+="/bin/sh -c 'echo $kernel > /sys/bus/usb/drivers/ftdi_sio/unbind'"Esos arreglos pueden o no servir en otro equipo, y con suerte no hará falta ninguno. Las herramientas de código abierto quizás son un poco más fáciles de manejar y la serie también las revisará. Algunas herramientas de GOWIN, eso sí, son buenas, y hay una opción para que el IDE use siempre el editor externo que uno elija.
Lo que viene en la serie
Para repasar lógica digital, el FPGA Bootcamp 0 original enseña diseño lógico con una herramienta gratuita en el navegador, sin necesidad de tener una FPGA. Las próximas entregas revisarán herramientas de código abierto, bloques IP, lógica sincrónica y el analizador lógico integrado del chip, entre otros temas.






