08 abril 2018

La primera FPGA con soporte Open-Source - Parte 1

Antes de comenzar hablemos un poco de ¿Qué son las FPGA?

Las FPGA son las siglas en inglés de "Field Programmable Gate Array" o mejor en español: "Arreglo de compuertas programables en terreno". Aunque esto pueda sonar un poco de otro mundo, estos chips son literalmente eso: Un conjunto de bloques que realizan funciones lógicas que se pueden reprogramar (O mejor dicho reconfigurar) en el lugar donde se encuentre el chip.

Por ejemplo en la foto que pueden ver al inicio de la entrada de este blog pueden ver una FPGA controlando una matriz de LEDs. De seguro has visto muchas FGPAs controlando pantallas LED gigantescas ya que es uno de los casos de uso más comunes.



Imaginen que ustedes están haciendo un diseño electrónico para un nuevo producto. Hace 40 años la forma de hacerlo era comprar un montón de circuitos integrados que hacían funciones digitales y analógicas específicas por separado y comenzar a conectarlos entre sí con cables.

En la actualidad aún es posible hacerlo de la misma manera, pero posiblemente nos encontremos con que es un trabajo demasiado caro, lento y engorroso. 

Digamos que deseamos diseñar una solución desde cero, inevitablemente nos tendremos que enfrentar a elegir alguna de las siguientes opciones:
  1. Usar componentes discretos. En cuyo caso tendremos que armarnos de paciencia y mucho alambre de conexión si el circuito es enorme.
  2. Mandar a hacer algunos cuantos chips en silicio de "prueba". Que nos puede costar una pequeña fortuna.
  3. Utilizar chips de lógica programable como las FPGA.
Les llamamos chips de lógica programable porque a diferencia de un "chip" cuya función está bien definida desde el momento de su fabricación, las FPGA en realidad solo son una colección de bloques funcionales y de fábrica no se puede hacer nada con ellas.

La otra cosa que diferencia estos chips de un un microcontrolador o microprocesador radica en que las FPGA no se programan algorítmicamente, es decir, no siguen un conjunto de instrucciones para completar una tarea.

Entonces, si no hacen nada de fábrica... ¿Cómo es que las hacemos funcionar?


Lo que sucede dentro de la FPGA es que debemos combinar diferentes unidades lógicas (Compuertas, sumadores, memorias, etc.) que nos sirven para construir un circuito electrónico que desempeñe la función que deseamos.

Sin embargo, esto no lo hacemos conectando cables entre si, sino más bien definiendo las conexiones que estos componentes tienen dentro del mismo chip o su "configuración". Por lo anterior es que conocemos a los lenguajes en que configuramos estos dispositivos como "Lenguajes de Descripción de Hardware" o HDL por sus siglas en inglés.

En un lenguaje de descripción de hardware en lugar de decirle al chip "qué hacer" describimos "cómo conectar" los diferentes componentes individuales. Los dos lenguajes más populares son Verilog y VHDL (VHSIC High Description Language).

¡Ahora es más fácil de entender! ¡Tener una FPGA es como tener una caja enorme de componentes electrónicos que pueden conectarse entre sí describiendo sus conexiones con código!

Otra ventaja muy importante al desarrollar circuitos en FPGA es que el resultado puede funcionar extremadamente rápido. Ya que definimos "conexiones" entre los diferentes componentes en lugar de ejecutar de forma secuencial un algoritmo, esto permite que algunos diseños de naturaleza paralelizable se ejecuten más rápido de lo que lo harían en una CPU o una GPU. Esta es la razón por la que algunos las utilizan para tareas como el cálculo de hashes para la generación de criptomoneda.

Luego de esta larga introducción, vamos al tema de esta entrada: La primera FPGA con soporte Open Source.


Resulta que en la industria, las FPGA se utilizan como el paso previo a la manufactura de chips a la medida. Las grandes compañías diseñan sus chips en FPGAs, los prueban y una vez tienen un diseño listo lo envían a fabricar en silicón. Este proceso ahorra muchísimo tiempo, dinero y recursos.

Hasta hace muy poco tiempo las herramientas para configurar FPGAs eran en todo o en alguna de sus partes críticas privativas, es decir solo el fabricante tenía acceso a su funcionamiento.

¿Por que requerimos de varias herramientas?


Esencialmente esto es así porque configurar una FPGAs normalmente sigue un flujo de trabajo que requiere varios pasos que se explican en el siguiente diagrama:
  1. Diseño del circuito: Donde esencialmente hacemos lo de toda la vida y diseñamos la disposición y conexiones de nuestro circuito.
  2. Escritura de código HDL: Aquí utilizamos Verilog o VHDL para describir las conexiones de nuestro circuito.
  3. Simulación: Los pasos de la etapa de elaboración pueden llegar a ser bastante costosos en tiempo, aún siendo realizados por herramientas automáticas. Así que lo "sano" en FPGA es simular el diseño antes de comenzar con la etapa de elaboración.
  4. Síntesis: Aquí un software toma el código HDL de alto nivel y lo convierte a otro código HDL pero que ahora describe las conexiones en función de los elementos lógicos o analógicos disponibles para un modelo de FPGA en particular.
  5. El ruteado (Place and Route o PnR): que esencialmente toma el código de HDL, busca las funciones disponibles en la FPGA y considerando su disposición física, trata de realizar las conexiones en función de lograr ciertos objetivos que pueden incluir: Utilizar el mínimo de componentes lógicos, utilizar rutas de conexiones más cortas,  reducir tiempos de retardo en la propagación de señales, re-utilizar bloques existentes, etc.
  6. Generación del archivo de configuración (bitstream): Que esencialmente es un software que genera a partir del resultado del PnR el archivo de configuración específico o "bitstream" que se utilizará para indicar a la FPGA como se conectarán sus componentes internamente.
Hasta hace algunos años, ya existían varios proyectos Open-Source que tenían capacidad de lograr los pasos 1, 2 y 3, los pasos 3 y 4 eran logrados parcialmente por algunas herramientas Open-Source en base a las hojas técnicas del fabricante. Sin embargo la generación del Bit-Stream era la pieza faltante para tener un flujo de trabajo completamente Open-Source.

La razón de esto es que tanto el formato como las características de este archivo de configuración se han mantenido en secreto por prácticamente todos los fabricantes de FPGA, algunos de ellos inclusan aplican estrategias que evitan que el mismo diseño genere el mismo archivo de configuración cada vez que se ejecuta la herramienta. Así que hasta hace muy poco era prácticamente imposible tener un flujo de trabajo completamente Open-Source para trabajar con FPGAs.

Y esto fué así hasta que apareció IceStorm...

IceStorm es un proyecto OpenSource que sirve para generar archivos de configuración y cargar configuraciones a las FPGA ICE40 del fabricante Lattice y está basado en el trabajo de ingeniería inversa de dichos chips.

El trabajo de ingeniería inversa no es nada trivial, es esencialmente tratar de conocer los detalles internos del chip FPGA sin tener acceso a ninguna documentación del fabricante y esto es lo que ha logrado el equipo de Mathias Lasser y Clifford Wolf.

Gracias a su contribución, si quieren desarrollar un proceso de desarrollo para FGPA lo puede hacer con la familia de ICE40 de Lattice y utilizando las siguientes herramientas.

  1. Diseño: Lápiz y papel o la pizarra como solemos hacer en el Hackerspace.
  2. Escritura de HDL: Por el momento las herramientas soportan únicamente el lenguaje Verilog. Pero no dudamos que pronto alguien tenga soporte para VHDL. Para generar los archivos pueden utilizar cualquier editor que soporte coloreado de sintaxis como Kate.
  3. Simulación: Puede realizarse utilizando Icarus Verilog + GTKWave.
  4. Síntesis: Puede realizarse utilizando Yosys.
  5. Ruteado: Puede realizarse utilizando Arachne-pnr.
  6. Generación de Bitstream: IceStorm, que también provee de algunas utilidades para guardar el bitstream directamente en la FPGA a través de un convertidor USB-Serie.
Y gracias a todo lo anterior... ¡Ahora podemos utilizar FPGAs utilizando herramientas 100% Open-Source!


Concluyendo

En la segunda parte de esta entrada, hablaremos sobre cómo configurar nuestro entorno de desarrollo para poder sintetizar nuestro primer circuito en FPGA con las herramientas Open-Source.

¡Mantente pendiente y hasta la próxima!

No hay comentarios: