Capítulo 12: Proyecto Icestorm: Herramientas libres para sintetizar diseños en FPGAs - Obijuan/videoblog GitHub Wiki

Acceso al repositorio

Descripción

Por primera vez en la historia, disponemos de herramientas libres para cerrar el ciclo de trabajo con FPGAs usando sólo software libre. En este vídeo se muestra un ejemplo del uso de las herramientas del proyecto icestorm. Se muestra el proceso completo: desde el código Verilog hasta la generación del bitstream y su descarga en la Tarjeta icestick. Como ejemplo se usa un contador de 26 bits

Proyecto Icestorm

A finales de Mayo del 2015 ocurrió un hecho histórico: es la primera vez que se tienen herramientas libres para realizar el ciclo completo de trabajo con FPGA usando únicamente herramientas libres. Esto es super importante porque ya no dependemos de ningún fabricante y todo el conocimiento lo tenemos disponible. A partir de estas herramientas podemos crear cualquier interfaz, o cualquier aplicación que no haya sido prevista por el fabricante

El proyecto se denomina: proyecto icestorm, creado por Clifford Wolf. El objetivo fue hacer ingeniería inversa de las FPGAs de Lattice para descifrar el formato del bitstream y poder crear herramientas libres. Y lo más importante: documentarlo todo

De momento estas herramientas sólo nos permiten trabajar con las FPGAs de Lattice iCE40: los modelos HX1K-TQ144 y HX8K-CT256. Al ser un proyecto libre, la comunidad lo irá aumentando poco a poco. Ahora depende de nosotros.

Estas FPGAs pasan a formar parte del Patrimonio Tecnologico de la humanidad.

Ejemplo completo: un contador

Como ejemplo de funcionamiento de las herramientas, simularemos y sintentizaremos un contador de 26 bits en la tarjeta Icestick, que muestra el valor de los 5 bits más significativos por los leds.

El primer paso es tener diseñado del circuito digital (en este caso el contador) usando un lenguaje de descripción hardware. Las herramientas libres de icestorm utilizan Verilog. El código del contador es el siguiente:

module contador #(
        parameter N = 26  //-- Numero de bits del contador
  )(
        input wire clk,
        output wire [4:0] leds);

reg [N-1:0] cont;
reg rstn = 0;

//-- Inicializador
always @(posedge clk)
  rstn <= 1;

//-- Contador
always @(posedge clk)
  if (!rstn)
    cont <= 0;
  else
    cont <= cont + 1;

//-- Conectar los 5 bits más significativos a los leds
assign leds = cont[N-1: N-6];

endmodule

Se trata de un contador paramétrico, donde N indica el número de bits. Sólo con cambiar este parámetro, generamos un contador de distinto tamaño.

Para la simulación usamos las herramientas icarus verilog y gtkwave. Ejecutamos la simulación con el comando:

$ make sim

Se nos abre automáticamente gtkwave con el resultado de la simulación. Podemos ver cómo el contador se incrementa con cada flanco de subida de reloj. En la simulación, para que vaya más rápido, se ha usado un contador de 6 bits (El banco de pruebas intancia un contador de 6 bits).

Para realizar simulaciones es necesario crear un banco de pruebas. En este caso tenemos contador_tb.v:

`timescale 100 ns / 10 ns
`default_nettype none

module contador_tb;

localparam N = 6;  //-- Numero de bits del contador

reg clk = 0;

wire [4:0] leds;

//-- Clock generator
always
  # 0.5 clk <= ~clk;

  contador #(
             .N(N)
  )  CONT0 (
             .clk(clk),
             .leds(leds)
  );

initial begin

      //-- File where to store the simulation
      $dumpfile("contador_tb.vcd");
      $dumpvars(0, contador_tb);

      #200 $display("END of the simulation");
      $finish;
    end

endmodule

En este banco de pruebas se genera la señal de reloj, se instancia un contador de 6 bits, se almacenan los resultados de la simulación en el fichero contador_tb.vcd y se espera a que transcurran 200 periodos de reloj (Cada periodo se ha configurado para ser de 100ns)

Pero lo interesante viene ahora: Sintetizar el circuito. Vamos a generar un circuito contador real, con existencia físcia. Esto es lo que no se podía hacer con herramientas libres, hasta ahora

Para ello ejecutamos el comando:

$ make sint

¡Fijaros qué rápido se ha generado!. Nos ha aparecido un nuevo fichero: contador.bin, que es el bitstream con la información para configurar la FPGA.

Ahora ya sólo queda configurar la FPGA con el comando:

$ make prog

Tarda 3 segundos. ¡Ya tenemos nuestro contador!

Lo vamos a modificar, pasando de 26 a 28 bits para que vaya más lento. Como es un diseño paramétrico, sólo cambiamos el parámetro N. Grabamos. Hacemos make prog... y listo!

Para aprender más

Todavía hay poca información sobre las FPGAs libres. Para aprender más podéis recucurir a: