Esta página es una introducción al proyecto y en ella se explican conceptos
básicos sobre las herramientas usadas, modificadas y/o creadas por el mismo.
En las otras páginas se omiten los detalles volcados en esta introducción
por lo que esta página sirve como aclaración para muchos aspectos encontrados
en otras páginas del proyecto.
¿Qué es una FPGA?:
Este proyecto está orientado a personas que ya conocen que es una FPGA por lo que sólo les diremos que se trata de circuitos electrónicos reconfigurables que permiten crear nuevos circuitos que se comportan como nosotros querramos. Una definición de la palabra FPGA se puede encontrar en la Wikipedia.
¿Cómo nace el proyecto?:
El proyecto FPGA Libre nació con la idea de poder compartir herramientas y cores desarrollados en la Unidad Técnica Instrumentación y Control perteneciente al centro Electrónica e Informática del INTI (Instituto Nacional de Tecnología Industrial). En el Primer Workshop Latinoamericano de Tecnología FPGA nos encontramos con mucha gente deseosa de compartir conocimientos sobre el apasionante tema de las FPGA y por eso decidimos crear este espacio como un lugar abierto para todos los que quieran unirse.
Objetivo:
El objetivo principal de este proyecto es el de facilitar el intercambio de los elementos necesarios para el desarrollo con FPGA. El intercambio de medios físicos (hardware) es complejo debido al costo de replicación y el intercambio de programas bajo licencias es un delito. Por estas razones es que el proyecto pone énfasis en software libre o gratuito y en cores que puedan ser redistribuidos sin restricciones. Partiendo de estas bases se enuncian los siguientes objetivos formales:
- Impulsar el desarrollo con dispositivos FPGA utilizando herramientas de
software libre u open source.
- Fomentar el intercambio y desarrollo de IP cores con licencias que
posean el mismo espíritu que las del software libre.
Entre las ventajas del uso de software libre podemos citar:
- La capacidad de aprender observando el código fuente de las aplicaciones
y los cores.
- La posibilidad de adaptar a gusto según las necesidades particulares de
cada interesado.
- La oportunidad de mejorar el código y brindar esas mejoras al resto de
la comunidad.
- Bajo costo. Los productos propietarios de este rubro suelen tener altos
costos de licencias, lo que limita y restringe su aplicación en forma masiva
en proyectos e instituciones de bajos recursos y en países en desarrollo.
¿Para qué dispositivos y plataformas?:
Nuestro proyecto no está ligado a ningún dispositivo o plataforma en particular. Pero al mismo tiempo los proyectos que lo componen se realizan con las herramientas que poseen sus integrantes. En la actualidad la plataforma usada es Debian GNU/Linux y los dispositivos son los de Xilinx. Pero como ya se dijo el proyecto es abierto. En los últimos meses hemos estado trabajando con FPGAs de Lattice, en particular las iCE40 que tienen algunas ventajas muy interesantes.
Componentes del ciclo de desarrollo de FPGALibre:
Las partes componentes que hacen posibles el ciclo de desarrollo con dispositivos FPGA actualmente utilizadas por los desarrolladores de FPGA Libre puede resumirse en los siguientes items:
- El código HDL
- Selección del HDL para realizar los diseños.
- Convenciones y reglas del código para desarrollo en grupo y mayor
reusabilidad.
- Interconectividad de cores.
- Extensiones y asistentes a lenguajes HDL.
- Librerías HDL.
- Cores IP.
- Edición del código
- Software de edición.
- Asistentes del software de edición.
- Simulación
- Herramienta de simulación.
- Banco de pruebas.
- Asistentes del banco de pruebas.
- Visualización de formas de onda.
- Asistentes para el proceso de simulación.
- Síntesis
- Transferencia a la FPGA
- Selección del dispositivo FPGA.
- Hardware para grabación en la FPGA o memoria.
- Software para grabación en la FPGA o memoria.
A continuación veremos cada una de estos items con más detalles
El código HDL:
Selección del HDL para realizar los diseños Existen varios HDLs que pueden utilizarse para realizar la descripción de un diseño. Los más utilizados y populares son Verilog, VHDL y SystemC. Debido a que el VHDL es de uso común en muchas instituciones universitarias y proyectos de gran importancia (por ejemplo el procesador León) creemos que es la mejor alternativa para los objetivos planteados. Por este motivo el lenguaje de preferencia para el proyecto FPGA Libre es el VHDL, sin embargo está abierto a cualquier contribución o avance futuro en otros lenguajes. El lenguaje VHDL está definido en el estándar IEEE 1076. Algunas herramientas propietarias muy utilizadas han implementado características que violan este estándar. Es importante destacar que en la actualidad existe un flujo de desarrollo basado completamente en software libre. El mismo sólo soporta Verilog como lenguaje.
El lenguaje de preferencia para el proyecto FPGA Libre es el VHDL estándar.
|
Convenciones y reglas del código para desarrollo en grupo y mayor reusabilidad
El lenguaje VHDL, al igual que muchos otros, ofrece cierta libertad en cuanto
al formateado del código, indentado, nombres de las variables, etc. Sin
embargo cuando se pretende fomentar el trabajo en grupo, permitir que otras
personas colaboren y aumentar la reusabilidad del código, es necesario definir
pautas que complementen la sintaxis del lenguaje. Para abordar este tema se
tomaron dos recomendaciones en cuanto a escritura de código VHDL:
Recomendaciones de la Agencia Espacial Europea y recomendaciones para
proyectos en OpenCores. En base estas dos recomendaciones, el proyecto
FPGA Libre define sus recomendaciones, también llamadas guidelines, para
escritura de código VHDL.
El proyecto FPGA Libre posee guidelines propias para la escritura de
código VHDL.
|
Para implementar el concepto se ha desarrollado un lint muy básico y
rústico para VHDL llamado bakalint. Para mayor claridad sobre el
concepto, se cita una definición de lint tomada de la web:
lint: "A Unix C language processor which carries out more thorough checks on the code than is usual with C compilers."
En este caso la definición de lint no se refiere a C sino a VHDL. Es decir
un verificador de código VHDL, que se fija en cosas que el compilador acepta
o ignora. El objetivo es tener una herramienta que ayuda a respetar los
guidelines para lograr uniformidad y coherencia entre códigos de distintos
autores.
El proyecto FPGA Libre ha desarrollado un lint llamado bakalint para
facilitar la aplicación de los guidelines para código VHDL.
|
Interconectividad de cores
Para aprovechar al máximo los desarrollos de cores IP y sacar mayor beneficio
de la modularidad que estos brindan, es necesario definir y establecer un
mecanismo de interconexión común. Siguiendo los objetivos del proyecto se
buscó una especificación abierta y libre para cubrir esta necesidad. Tomando
como referencia el proyecto OpenCores se selecciona la arquitectura de
interconexión Wishbone para IPs en SoCs. Además de sus características y
ventajas técnicas, esta especificación es de dominio público y permite su
libre utilización sin ningún tipo de contrato, acuerdo, royalty o pago.
El proyecto FPGA Libre utiliza la especificación Wishbone para la
interconexión de cores IP.
|
Para automatizar la generación de entidades de interconexión de cores con
la especificación Wishbone puede utilizarse la herramienta WISHBONE Builder
de OpenCores. El proyecto FPGA Libre ha realizado modificaciones y mejoras
a esta herramienta.
El proyecto FPGA Libre utiliza la herramienta WISHBONE Builder (modificada)
para generar las entidades de interconexión de cores Wishbone.
|
Extensiones y asistentes al lenguaje HDL
Comparado con lenguajes de programación como el C, el lenguaje VHDL
posee limitaciones que dificultan y demoran el desarrollo. Para solucionar
algunos de estos inconvenientes se desarrollan herramientas complementarias
para el lenguaje. Estas son las pequeñas herramientas desarrolladas hasta
ahora:
- vhdlspp - VHDL Simple Pre-Processor que permite fácilmente incluir
archivos. Similar a la sentencia #include del lenguaje C.
- hex2vhdl - Conversor de archivos en formato HEX a un array VHDL.
Utilizado por ejemplo para incluir el contenido de la memoria de programa de
un procesador dentro de un diseño.
- xtracth - Este es un script muy simple para extraer definiciones de
un package VHDL y colocarlas en un .h y/o un .inc.
Librerías VHDL
Existen varias librerías que facilitan y aceleran el desarrollo de cores.
Estas son algunas de las utilizadas hasta ahora:
- std_logic_1164 - manejo básico de bits, estandarizada por la IEEE
- numeric_std - manejo básico de enteros, estandarizada por la IEEE
- C - emulación de la librería de C estándar, ESNUG 2004
El proyecto FPGA Libre recomienda el uso de los tipos definidos en
std_logic_1164 y numeric_std y no los definidos por Synopsys.
|
cores IP
Existen gran cantidad de cores IP disponibles en la red, con licencias que
permiten su uso sin ningún tipo de restricciones.
Se descarta la utilización de cores IP que no sigan los principios del
software libre, por no brindar el código fuente, restringir su campo de
aplicación o solicitar el pago de royalties.
De todos los cores IP con estas licencias, este proyecto tiene preferencias
por aquellos escritos en VHDL, que compilen correctamente con GHDL y
posean interfase Wishbone.
Se prefieren aquellos cores escritos en VHDL, que compilen con GHDL y
posean interfase Wishbone.
|
Edición del código:
Software de edición No son muchos los editores libres que poseen facilidades avanzadas para la edición de código VHDL. Uno de estos editores es el SETEdit, un editor pensado para programadores, con soporte para gran cantidad de lenguajes de programación. Estas son algunas de las características que lo hacen una buena elección para el trabajo con VHDL:
- Resaltado de sintaxis para VHDL.
- Macros específicas con construcciones típicas de VHDL.
- Utilización de Exuberant C Tags ECTAGS con soporte específico para VHDL.
- Indentado coherente con los guidelines del proyecto.
Para más información consultar la sección SETEdit.
El proyecto FPGA Libre utiliza el software SETEdit para la edición de
código VHDL.
|
Asistentes del software de edición
Para potenciar las capacidades del software de edición, existen aplicaciones
externas que pueden ayudar en el trabajo de edición. Una de estas aplicaciones
es CTAGS o Exuberant CTAGS que ayuda en la tarea de búsqueda e inspección
dentro del código fuente. Al momento de escribir este documento la versión
oficial de Exuberant CTAGS soporta Verilog pero no VHDL. El proyecto FPGA Libre
ha agregado soporte para VHDL en CTAGS.
SETEdit puede utilizar Exuberant CTAGS para facilitar la navegación de código.
Para más información consultar la sección Exuberant CTAGS.
Para editar código VHDL, SETEdit se utiliza con una versión de CTAGS con
soporte para VHDL agregado por el proyecto FPGA Libre.
|
Otra herramienta útil es tpl2file que es una utilidad para extraer las
plantillas de ejemplos VHDL que vienen con el ISE WebPack y colocarlas en
archivos independientes dentro de una estructura de directorios.
Para más información consultar la sección tpl2file.
Simulación:
Herramienta de simulación Se han evaluado varias alternativas teniendo siempre como objetivo el desarrollo en lenguaje VHDL para su aplicación principal en dispositivos FPGA. Dándole siempre prioridad a las alternativas bajo licencias de software libre u open source, se han evaluado las siguientes herramientas: SAVANT, FreeHDL, Alliance y GHDL. Debido a su amplio uso y a la capacidad de compilar sin problemas proyectos tales como el procesador LEON y el DLX se ha seleccionado el GHDL como herramienta principal de simulación. GHDL utiliza la tecnología del GCC, el compilador de software libre más utilizado. Para más información consultar la sección GHDL.
El proyecto FPGA Libre utiliza el simulador GHDL.
|
Para los amantes del Verilog recomendamos visitar el sitio de Icarus Verilog.
Banco de pruebas
Para verificar el correcto desempeño de un core, es necesario aplicarle
estímulos y observar su comportamiento. Para realizar esto se puede utilizar
el mismo lenguaje VHDL. El código adicional que realiza esta tarea se llama
testbench.
El proyecto FPGA Libre utiliza bancos de pruebas también escritos en VHDL.
|
Asistentes del banco de pruebas
Muchas veces la escritura de testbenches sencillos donde un patrón de
entrada debe corresponderse con un patrón de salida puede resultar tediosa y
monótona. Sólo para estos casos se ha creado la herramienta llamada natebege,
que genera automáticamente un testbench, ingresándole los patrones de
entrada y salida.
natebege es una herramienta muy básica y simple para automatizar la
generación de bancos de prueba triviales.
|
Otras veces la información generada por el testbench es de gran volumen y
análisis complejo. En estos casos se hace necesario recurrir a otras
herramientas de software que procesen o analicen lo generado por el
testbench. Algunas de las opciones posibles son programas en lenguaje C o
scripts Perl, entre otros, que tomen la información generada por el
testbench y la procesen.
El proyecto FPGA Libre utiliza herramientas escritas en lenguaje C y/o Perl
para complementar los bancos de prueba.
|
Visualización de formas de onda
Los programas de simulación pueden generar archivos donde se vuelcan todas
las formas de onda de la simulación. Actualmente dentro del proyecto se
trabaja con los dos formatos soportados por el GHDL:
- Formato VCD: Verilog Change Dump o también Value Change Dump.
Este formato pensado originalmente para Verilog no soporta los tipos de
VHDL.
- Formato específico del GHDL: GHDL Waveform Format (GHW).
Los archivos en formato VCD pueden visualizarse con GTKWave y Dinotrace.
Los archivos en GHDL GHW sólo pueden visualizarse utilizando GTKWave.
Para más información consultar la sección GTKWave y la sección Dinotrace.
El proyecto FPGA Libre utiliza GTKWave como visor de forma de ondas.
|
Asistentes para el proceso de simulación
La generación de los archivos necesarios para la simulación es un proceso
sencillo que puede volverse complicado cuando se manejan varios archivos de
descripciones y varias herramientas de asistencia. Para automatizar este tipo
de tareas se utiliza el GNU Make.
Se recomienda la utilización de GNU Make para compilación y la generación de
todos los archivos asociados a un proyecto.
|
Síntesis:
Herramienta de síntesis Luego de pasar por el proceso de simulación, es necesario realizar la síntesis del diseño para su posterior grabación en la FPGA o en la memoria de configuración. Lamentablemente no conocemos herramientas de síntesis con licencias free software u open source para los fabricantes más populares. Los dos fabricantes más importantes de dispositivos FPGA brindan herramientas, cada uno para sus propios productos, de síntesis de uso gratuito. Por otro lado existen herramientas libres para las iCE40 de Lattice. Para más información consultar iCE40. En los comienzos de nuestro trabajo con FPGAs hemos utilizado dispositivos de la empresa ALTERA con el software MAX+PLUS y luego Quartus. Esto nos planteó dos problemas principales: La utilización de entornos Windows (no existía alternativa gratuita para sistemas operativos GNU/Linux) y la imposibilidad de automatizar el proceso de síntesis con línea de comandos sin utilizar la IDE propia del programa. Nota: Quartus II actualmente soluciona estos problemas. Por estos motivos, y viendo que otros grupos de trabajo con objetivos similares a los nuestros utilizaban los dispositivos de Xilinx, abandonamos el uso de los dispositivos de ALTERA. El proyecto FPGA Libre está abierto a cualquier tecnología y dispositivo FPGA, siempre que pueda lograrse su utilización bajo entornos de software libre, como es el caso de GNU/Linux. La herramienta de síntesis ISE WebPack de Xilinx es de uso gratuito (no libre), tiene una versión para sistemas GNU/Linux y permite su utilización con línea de comandos, lo que facilita la automatización del proceso con herramientas como GNU Make. Para más información consultar la sección ISE.
Hasta el momento se ha utilizado la herramienta de síntesis ISE WebPack para
los dispositivos de Xilinx.
|
Actualmente también utilizamos iCEcube2 con FPGAs iCE40 de Lattice.
|
Las únicas herramientas libres para desarrollo con FPGAs sólo soportan
las iCE40 y el lenguaje Verilog. Son la mejor opción para un flujo
verdaderamente libre.
|
Hardware y FPGA:
Selección del dispositivo FPGA Debido a la utilización del ISE WebPack la selección del dispositivo para nuestros trabajos se restringió a los dispositivos de Xilinx (Spartan II, Spartan 3/3A/3E, Spartan 6, Virtex 4/5/6). En la actualidad estamos incluyendo dispositivos iCE40 de Lattice.
Hardware de desarrollo Para desarrollar una aplicación, además del chip FPGA es necesaria una electrónica de soporte: Circuito impreso, circuitos de alimentación, memoria, conectores, etc. La forma más fácil de abordar este tema es comprando algún kit de desarrollo para FPGA (Plaqueta con FPGA). Nuestro primer kit de desarrollo comprado es una placa Memec Spartan II LC (hoy obsoleto). En la actualidad Digilent es un buen proveedor de kits de desarrollo. Pasadas las etapas iniciales de desarrollo, es necesario encarar el diseño, la construcción y ensamblaje de una placa con FPGA. Como parte del proceso de aprendizaje se planteó el diseño de una placa de similares características a la utilizada, realizada con herramientas EDA de software libre y con toda la documentación y los archivos de diseño de libre acceso. De allí nació la S2Proto. Más tarde pasamos a la tecnología BGA y desarrollamos la S3Proto-Mini. Actualmente hemos desarrollado una placa con FPGAs iCE40 del Lattice denominada Kéfir I.
Hardware para grabación de la configuración Los dispositivos FPGA pueden poseer varios mecanismos para su configuración. Uno de los mecanismos más usados es el estándar IEEE 1149.1 del JTAG (Joint Test Action Group). De esta forma un hardware de interfase para configuración JTAG será útil para más de un fabricante de FPGA y memorias de configuración. Originalmente nos basamos en varias notas de aplicación de Xilinx y en circuitos publicados en la web para desarrollar una interfase JTAG de muy bajo costo que se conecta al puerto paralelo. El circuito fue desarrollado con una herramienta EDA de software libre llamada KiCad. Todos los archivos de diseño y la documentación asociada están disponibles y son de libre uso. Para más información: DLC5 El problema con este cable es que las interfaces paralelo se volvieron poco frecuentes, y por lo tanto se necesitaba utilizar adaptadores. Por esta razón migramos a cables USB. Dentro de los cables USB los basados en el FTDI FT2232H ofrecen una amplia compatibilidad con el software disponible. Existen varios proyectos de hardware abierto basado en este chip, nosotros originalmente utilizamos el Opendous FT2232H JTAG, pero luego desarrollamos uno más flexible: MILK.
Se dispone de una interfase JTAG para puerto paralelo, y otra USB, que permiten
configurar los dispositivos FPGA y las memorias de configuración. Los archivos de
diseño de estos hardware están desarrollados con herramientas EDA de software
libre.
|
Software para grabación de la configuración
La transferencia de la configuración al hardware involucra dos tipos de
conocimientos. Por un lado el protocolo de transferencia, que en nuestro
caso es el JTAG, y por otro lado el conocimiento de las características
específicas del dispositivo a usar.
La herramienta iMPACT de Xilinx resuelve ambos aspectos pero tiene una
desventaja muy importante, su versión para GNU/Linux requiere del uso de una
distribución en particular (Red Hat Enterpise) y de módulos del kernel
propietarios. Sin embargo Michael Gernoth creó una ingeniosa biblioteca
dinámica que permite evitar instalar dichos módulos.
Utilizando la biblioteca antes mencionada y un grupo de scripts Perl
es posible transferir la configuración de forma simple y automatizada.
Estas herramientas se encuentran en el paquete iMPACT Helper.
Nota: el paquete soporta ambos cables previamente mencionados.
En el caso de las iCE40 la configuración se realiza utilizando el protocolo
SPI. Las herramientas de Lattice soportan cualquier cable USB basado en
el FT2232H.
|