FPGA Libre
EnglishEspañolS.F. Summary
Hosted by:
Get Free FPGA development tools at SourceForge.net. Fast, secure and Free Open Source software downloads

FPGAs iCE40

La línea iCE40 de Lattice merece una mención especial debido a que son las primeras FPGAs del mercado para las cuales existe un flujo de desarrollo completamente basado en software libre. Al mismo tiempo se trata de dispositivos con cualidades interesantes.

¿Por qué las iCE40?:

Estas FPGAs fueron originalmente desarrolladas por la empresa Silicon Blue Technologies, que luego fue adquirida por Lattice (Anuncio).

Fueron originalmente pensadas como FPGAs de bajo consumo para implementar lo que se conoce como glue-logic. Por lo que su objetivo principal fue de proveer soluciones pequeñas, de bajo costo y bajo consumo.

Estas FPGAs poseen una estructura muy simple en comparación con las FPGAs actuales de Xilinx y ALTERA.

Las siguientes características hacen que las iCE40 sean interesantes:

  • Bajo costo, arrancan en U$S 1,53 (Digi-key, por unidad, agosto de 2016)
  • Disponible en encapsulados pequeños: desde 16 pines ocupando 1,4 x 1,48 mm
  • Disponible en encapsulados fáciles de soldar: TQFP de 100 y 144 pines (U$S 4,95/6,97 1280/3520 LUTs)
  • Soportan configuración desde memorias SPI (cuestan menos de U$S 0,4)
  • Soportan un modo de configuración OTP en el que no necesitan memoria externa (modo NVCM)

Si a esto le sumamos que existe un tool-chain basado en software libre las mismas cobran particular interés.


Algunos detalles:

Las celdas lógicas de la iCE40 están compuestas por una LUT de 4 entradas, un flip-flop y una lógica de acarreo. Esto es muy parecido a lo que se encontraba en FPGAs como la Spartan II. Sin embargo debemos tener en cuenta que opciones avanzadas, encontradas en FPGAs de Xilinx, no se encuentran disponibles. A modo de ejemplo: las LUTs no son aptas para implementar memoria distribuida ni registros de desplazamiento. Diseños que hacen uso de estas características se verán afectados de forma muy adversa.

Son de bajo consumo y su fabricante declara un consumo mínimo (en stand-by) de 21 µW.

Poseen bloques de memoria embebidos (BRAMs). Aunque los mismos son pequeños (4 kib) y son "half dual-port". Esto es que, si bien soportan dos relojes, cada puerto sólo implementa lectura o escritura, pero no las dos cosas.

Los pines de I/O poseen dos flip-flops para poder implementar protocolos DDR. Soportan los estándares LVCMOS de 1,8; 2,5 y 3,3 V. También soportan LVDS (de 2,5 V y de baja tensión). Es posible seleccionar un pull-up en las entradas. También es posible manejar corriente, aunque no todos los pines soportan corrientes altas.

Dependiendo del encapsulado pueden tener hasta dos PLLs, aunque hay partes que no poseen ninguno. Los PLLs permiten una síntesis básica de frecuencias. Su documentación es escasa, fragmentada e incompleta, pero funcionan.

El mecanismo de configuración más frecuente es desde una memoria SPI. La grabación de un bitstream en dichas memorias se puede realizar muy rápido (6 segundos para una parte con 1k de elementos lógicos). Es posible configurar directamente la SRAM de la FPGA, pero esta opción no ofrece gran ventaja ya que la grabación de la memoria SPI es muy rápida. Finalmente soportan una configuración tipo OTP usando el protocolo SPI.

La interconexión de estas partes es más simple que la usada por FPGAs de los grandes fabricantes. Debido a esto nos encontraremos que se gastan bastantes LUTs sólo para realizar interconexión.


Kits de desarrollo:

Lattice ofrece al menos dos kits de desarrollo a precios muy convenientes: iCEstik y iCEblink.

Adicionalmente hay varios kits disponibles en internet.

El proyecto FPGA Libre diseñó una kit basado en la iCE40HX4K-TQ144, el mismo es open hardware y toda la información relacionada se puede encontrar acá: Kéfir I


Herramientas propietarias:

El iCEcube2 es la herramienta original para estas FPGAs. La síntesis es llevada a cabo por el Synplify Pro, que a pesar de sus ñañas es un herramienta de muy buena calidad. Los procesos de mapeo, place, route, análisis de tiempo y generación del bitstream son llevados a cabo por herramientas de Silicon Blue Technologies (SBT). La versión de 2017 para Linux es un download de alrededor de 379 MiB y ocupa aprox. 961 GiB.

Su uso requiere de una licencia gratuita entregada por Lattice. Por lo que necesitaremos crear un usuario y tramitarla. Es necesario tener la licencia antes de instalarlo.

La instalación para Linux consiste en descomprimir el tarball bajado y correr el binario extraido:

usuario@maquina$ tar xvf iCEcube2_2017_01.tgz
usuario@maquina$ ./iCEcube2setup_Jan_13_2017_1701

Luego aceptamos la licencia y elegimos un directorio de destino. Mi recomendación es instalarlo en /opt, pero con los permisos de un usuario, no como root (por ejemplo: /opt/iCEcube2.2017.01). Luego nos preguntará donde está el archivo de licencia e instalará los archivos.

Para correrlo basta con ejecutar el binario que instala en el directorio de destino, por ejemplo: /opt/iCEcube2.2017.01/iCEcube2.

Algunas cosas a tener en cuenta para la instalación de iCEcube2 (aportadas por Jesús Arroyo):

  • Al menos en mayo de 2017 la demora desde que nos registramos en Lattice hasta que podemos descargar el software es de 2 días.
  • La licencia que pedimos a Lattice es gratuita, pero tiene un tiempo limitado de uso y sólo sirve para una computadora en particular. Pasado ese tiempo debemos tramitar otra. La duración es de 1 año. Para identificar nuestra máquina el software usa lo que se denomina el host ID que no es más que la MAC address de la placa de red eth0 de nuestro sistema (podemos correr "/sbin/ifconfig -a | grep eth0" para averiguarlo, debemos tener en cuenta que Lattice usa "-" como separador en lugar de ":").
  • Antes de instalar el iCEcube2 es necesario que nos aseguremos que el shell por defecto de nuestro sistema es bash. Esto es necesario para la mayoría de las herramientas de síntesis propietarias para Linux. Para más información consultar la explicación para el ISE.
  • El binario de iCEcube2 es de 32 bits y depende de varias bibliotecas dinámicas no incluidas. En Ubuntu de 64 bits probablemente necesitemos instalar los siguientes paquetes: libc6-i386, zlib1g:i386, libxext6:i386, libpng12-0:i386, libsm6:i386, libxi6:i386, libxrender1:i386, libxrandr2:i386, libxfixes3:i386, libxcursor1:i386, libxinerama1:i386, libfreetype6:i386, libfontconfig1:i386, libglib2.0-0:i386, libstdc++6:i386, libnss-myhostname:i386 y libelf1:i386.
  • Paradójicamente la versión 2017.01 del iCEcube2 es más pequeña que la 2016.02 debido a que no incluye el sintetizador para sistemas de 32 bits (sólo para 64 bits). Por lo que los sistemas de 32 bits ya no están soportados.
  • En el caso en que el kernel renombre la interfaz eth0, y el servidor de licencias deje de encontrar esta interfaz, podemos evitarlo pasándole las siguientes opciones al kernel de Linux: "net.ifnames=0 biosdevname=0" (esto se puede hacer desde grub).

Este entorno soporta el desarrollo con VHDL y Verilog.

La configuración de los dispositivos se realiza utilizando el Diamond Programmer. No es necesario descargar todo el entorno del Lattice Diamond, simplemente las herramientas de configuración (menos de 60 MiB). Nota: hay un RPM para descargar que se puede convertir a DEB con alien.

Al menos para Linux es recomendable utilizar una herramienta alternativa al Diamond Programmer. Su funcionamiento es lento y poco confiable. La herramienta iceprog del proyecto IceStorm es muy simple de usar y muchísimo más rápida.


Herramientas libres:

El proyecto IceStorm encabezado por Clifford Wolf se encargó de realizar ingeniería inversa de la arquitectura iCE40, encontrando así la manera de configurarlas. De esta manera, y uniendo varias herramientas de software libre fue posible crear un flujo completo.

Estas son algunas de las herramientas involucradas:

  • Yosys (Yosys Open SYnthesis Suite): Es un sintetizador de Verilog. También impulsado por Clifford Wolf.
  • ABC: Es una herramienta de síntesis, usada por Yosys para la parte combinacional de nuestro diseño.
  • Arachne-pnr: Es una herramienta de place and route para iCE40. Creada por "Cotton Seed".
  • IceStorm: Se encarga de tomar la salida del P&R y generar un bitstream binario para configurar la FPGA. Incluye un analizador de tiempos y el software para configurar la FPGA (usando cables basados en chips de FTDI).

Estas herramientas permiten desarrollar utilizando Verilog.

Es importante destacar que las mismas se encuentra en desarrollo y que no todas las iCE40 están soportadas. Pero las herramientas mejoran día a día.

Paquetes compilados para AMD64 y Debian estable, con versiones de octubre de 2016, se pueden descargar siguiendo estas instrucciones.

El proyecto FPGAWars, impulsado por Juan Gonzalez-Gomez (aka Obijuan), Jesús Arroyo Torrens y Eladio Delgado, aporta varias cosas a este ecosistema:

  • APIO: es un entorno de desarrollo que incluye las herramientas de IceStorm y la herramienta de simulación Icarus Verilog. El mismo es la base para APIO IDE. Está basado en el proyecto Platformio.
  • APIO IDE: es una IDE para el desarrollo con iCE40. Incluyendo síntesis y simulación. Esta IDE se basa en Atom.
  • icestudio: es una herramienta experimental de desarrollo gráfico con iCE40.


Instalando las herramientas libres:

Para usuarios de sistemas operativos Windows y similares se recomienda consultar el sitio de APIO que incluye versiones enlazadas estáticamente de IceStorm, Yosys, Arachne-pnr etc.

Para usuarios de sistemas operativos basados en Debian GNU/Linux se puede utilizar el repositorio de FPGA Libre, el mismo posee paquetes Debian creados en octubre de 2016 enlazados con las bibliotecas dinámicas de Debian 8.6. El procedimiento es el siguiente:

  1. Agregamos el repositorio de FPGA Libre a nuestro sistema. Hay dos maneras muy simples de hacerlo, la primera es para sistemas con sudo configurado como para que el usuario pueda obtener permisos de root y la segunda es simplemente utilizando el usuario root:
    usuario@ubuntu$ curl -sSL http://fpgalibre.sf.net/debian/go | sudo sh

    root@debian# curl -sSL http://fpgalibre.sf.net/debian/go | sh

  2. Ahora podemos utilizar cualquier gestor de paquetes (apt, aptitude, synaptic, etc.) para instalar los paquetes.

A continuación se explica como instalar los distintos conjuntos de herramientas disponibles.

  • Instalación de las herramientas básicas:

    Las herramientas básicas son IceStorm, Yosys y Arachne-pnr. Los nombres de los paquetes son fpga-icestorm, yosys y arachne-pnr respectivamente. Un ejemplo de como instalarlas sería:

    usuario@ubuntu$ sudo apt-get install fpga-icestorm yosys arachne-pnr

  • Instalación de APIO:

    El paquete correspondiente a APIO se llama apio. El mismo recomienda instalar varias dependencias necesarias para desarrollar con APIO, por lo que basta instalar apio para tener las herramientas de síntesis y simulación instaladas. Un ejemplo de como instalarlo sería:

    usuario@ubuntu$ sudo apt-get install apio

    Esto instalará las herramientas básicas (IceStorm, Yosys y Arachne-pnr), los paquetes de APIO (examples, icestorm, iverilog, scons, system, etc.) y el Icarus Verilog.

  • Instalación de APIO IDE:

    El paquete correspondiente a APIO IDE se llama apio-ide. El mismo instalará APIO y Atom necesarios para desarrollar con APIO IDE, por lo que basta instalar apio-ide para tener las herramientas de síntesis y simulación instaladas. Un ejemplo de como instalarlo sería:

    usuario@ubuntu$ sudo apt-get install apio-ide

    Esto instalará las herramientas básicas (IceStorm, Yosys y Arachne-pnr), los paquetes de APIO (examples, icestorm, iverilog, scons, system, etc.), el Icarus Verilog, Atom y APIO IDE.

    En el caso particular de APIO IDE es necesario configurarlo luego de instalarlo:

    1. Luego de instalado corremos la aplicación atom desde nuestro usuario. Lo podemos hacer desde los menúes de nuestro escritorio, o simplemente corriendo:
      usuario@maquina$ atom

      La primera vez que corremos atom creará los archivos de configuración en ~/.atom/, por eso no se preocupen si tarda unos segundos.

    2. Salimos de atom sin hacer nada, simplemente lo cerramos. Ahora instalamos localmente APIO IDE corriendo:
      usuario@maquina$ atom_link_system_pkg apio-ide

      Eso es todo, ya tendremos atom configurado para funcionar como APIO IDE. La próxima vez que corramos atom aparecerá la barra de herramientas de APIO IDE.

  • Instalación de icestudio:

    El paquete correspondiente a icestudio se llama icestudio. El mismo instalará APIO por lo que basta instalar icestudio para tener las herramientas de síntesis y simulación instaladas. Un ejemplo de como instalarlo sería:

    usuario@ubuntu$ sudo apt-get install icestudio

    Esto instalará las herramientas básicas (IceStorm, Yosys y Arachne-pnr), los paquetes de APIO (examples, icestorm, iverilog, scons, system, etc.), el Icarus Verilog y icestudio.


webmaster.

Valid HTML 4.01! Valid CSS! GIMP Any browser! SourceForge.net Logo

Copyright © 2005-2017 proyecto FPGALibre.
Generated using CAL v0.2.0 and ARENA v0.1.0 on jue ago 17 08:46:09 -03 2017