Introducción:
Este es el proceso por el cual convertimos nuestro HDL en una descripción de bajo nivel que permitirá realizar nuestro hardware. En el caso de las FPGA esto es simplemente la configuración de las macroceladas y recursos de interconexión de la misma (entre otros).
ISE:
ISE es el entorno de desarrollo para FPGAs de Xilinx. Es software privativo, pero posee una versión gratuita. Lamentablemente no conocemos ningún Software Libre que permita desarrollar con FPGAs de Xilinx. Aunque si existe Software Libre que permite trabajar con FPGAs de la línea iCE40 de Lattice, la información relacionada con esas herramientas se encuentra en la página dedicada a las iCE40. Nota: Actualmente existen esfuerzos en progreso para soportar FPGAs de Xilinx en dichas herramientas. La línea 7 de Xilinx se encuentra correctamente soportada por la herramienta Vivado. El soporte para líneas anteriores se encuentra precisamente en ISE (son siglas, por lo que se pronuncia ai-es-i y no ais) ISE corre tanto en Windows como en Linux. El ISE incluye herramientas de línea de comando que nos permiten automatizar este proceso. Nota: no todos los dispositivos estan soportados. La serie Spartan original (no la II y 3) y la serie 4000 no estan soportadas. Tampoco soporta algunos dispositivos muy grandes. Estos últimos son soportados por la versión full del ISE. Instalación de los ISE WebPack modernos en Debian GNU/Linux: Ya desde la versión 8 Xilinx nos ofrece una versión verdaderamente nativa del ISE para Linux. Su instalación es muy simple, la única recomendación importante es que si tenemos algún problema para correr el instalador probemos cambiar /bin/sh. En sistemas Debian y sus derivados (como Ubuntu) es normal que /bin/sh sea un link a /bin/dash, este es un shell liviano, pero que no posee toda la funcionalidad del bash. En varias versiones del instalador de ISE (y también del Quartus II de ALTERA) notamos que el instalador es un script que sólo funciona si /bin/sh es bash. Si eso no se cumple en nuestro sistema es probable que no podamos correr el instalador. Para solucionarlo podemos hacer algo como esto:
usuario@ubuntu$ sudo sh -c "rm /bin/sh; ln -s /bin/bash /bin/sh" |
El resto de las recomendaciones para la versión 10.1 aplican a versiones
modernas de ISE.
Instalación de ISE WebPack 10.1 en Debian GNU/Linux Etch:
Al igual que en la versión 8.2 se trata de una aplicación nativa Linux que
puede instalarse sin problemas en Debian. No es necesario instalar los
Cable drivers para hacer uso del iMPACT (iMPACT Helper).
Debido a que fue instalado sobre una instalación anterior seguimos
manteniendo las instrucciones necesarias para versiones más viejas.
Instalación del ISE WebPack 8.2 en Debian GNU/Linux Sarge:
A diferencia de versiones anteriores esta versión está mucho mejor adaptada
a Linux. En lugar de utilizar la Wind/U los
programas usan directamente Qt.
Si bien también está pensado para instalar en Red Hat no hay problema alguno
en instalarlo en Debian. La instalación se llevó acabo en una máquina donde
ya estaba instalada la versión 7 por lo que mantenemos las instrucciones de
instalación para la versión 7 en caso de que sirvan de ayuda.
El único detalle de la instalación es que los módulos del kernel no funcionan
con Debian y por lo tanto el Impact no posee toda su funcionalidad. Nosotros
utilizamos JBit y por lo tanto esto no nos afecta. Cabe destacar que
para operaciones complicadas es posible generar un SFV con el Impact y luego
transferirlo con GNU jtag.
Instalación del ISE WebPack 7 en Debian GNU/Linux Sarge:
Estas son algunas recomendaciones y/o advertencias para su instalación. Hay
que tener en cuenta que el ISE para Linux no es más que el ISE para Windows
compilado usando una biblioteca comercial (bastante pobre por cierto) llamada
Wind/U. Por lo que es una especie de
parche y no una verdadera versión para Linux. Para colmo el programa fue
pensado únicamente para Red Hat.
- El paquete probado es el ISE WebPack 7.1i
- Hay que tener en cuenta que el paquete una vez instalado ocupa unos
1,2 GB y que se necesita aun más espacio durante la instalación.
También hay que tener en cuenta que el 7.1i son 379 MB y la actualización
otros 319 MB por lo que deberemos descargar unos 698 MB.
- Es necesario instalar libmotif. Esto es el paquete
libmotif3 que está
en la sección non-free.
- Es necesario instalar el paquete
libcurl2_7.9.5-1_i386.deb
de Woody.
- Para el correcto funcionamiento del Wind/U es necesario que el
portmap
este instalado. Este programa es una tradicional fuente de inseguridad.
Por lo que si estamos instalándolo sólo para esto recomendamos agregar
una línea que diga portmap: 127.0.0.1 al archivo
/etc/hosts.allow. Con esto estaremos restringiendo el uso del
portmap sólo a programas locales. Esto no es seguro, pero es mejor
que nada. Lamentablemente los programadores de Wind/U no encontraron
mejor manera de hacer funcionar su demonio de registry que en
mi opinión debería usar sockets en el filesystem local. Nota: Wind/U
no se conecta a 127.0.0.1 sino que a lo que sea el hostname por
esta razón no es posible iniciar el portmap con -i 127.0.0.1 que
sería un poquito más seguro.
- Por alguna razón desconocida las aplicaciones Wind/U son incapaces de
parsear correctamente la variable DISPLAY. Por lo que es necesario
alterarla de la siguiente manera: Si tenemos DISPLAY=":0.0"
cambiarlo por DISPLAY=":0". Esto lo podemos agregar al script
settings.sh del ISE.
Una opción interesante es usar el siguiente código:
export DISPLAY=`perl -e '$a=@ENV{"DISPLAY"}; $a=~s/\.(.*)//; print $a;'` |
- Hay que tener en cuenta que luego de que corramos cualquiera de las
aplicaciones del ISE esta iniciará el demonio del Wind/U que no
terminará al finalizar la aplicación. Si deseamos eliminarlo habrá que
matarlo explicitamente.
- Antes de correr cualquier aplicación del ISE es necesario correr el
script settings.sh que setea las variables de entorno necesarias.
- El ISE incluye módulos para el kernel de Red Hat y supone que el sistema
es un Red Hat. Esto es necesario sólo para grabar el bitstream usando
el impact. Hay alternativas mucho más livianas y automatizables por
lo que nuestra recomendación es evitar todo esto. Lamentablemente el
instalador del ISE no permite no instalar estas cosas por lo que
recomendamos instalarlo usando un usario común y no root. El
instalador nos va informar varios errores sobre el hecho de que no
puede alterar nuestro sistema.
- Para instalar la actualización a
7.1.3i
Es necesario descomprimir el .zip y ejecutar el comando setup. Pero
previamente tenemos que setear el entorno tal como si fueramos a
correr cualquier otra herramienta del ISE.
- Instrucciones detalladas que muestran cada uno de los diálogos que
aparecen durante la instalación se pueden encontrar el en site de
IeaRobotics.
Otras instrucciones en inglés más simplificadas se pueden encontrar
en el site de Wolfteck
No es extraño que el proceso sea un tanto complicado ya que en realidad se
trata de instalar un programa pensado y concebido para Windows en Linux.
Uso de las herramientas de línea de comandos:
Es probable que muchos piensen ¿Para qué si tengo el entorno gráfico
completo?, la respuesta es simple: esto nos ahorrará cantidades enormes
de tiempo y nos permitirá integrar la síntesis a nuestro flujo de diseño
sin estorbos.
Para simplificar el proceso que explicamos a continuación hemos desarrollado
un conjunto de herramientas llamadas Xil Tools.
A continuación se explica el procedimiento que realizan los Makefiles que
que nosotros usamos. Suponemos un proyecto llamado test
xst -intstyle ise -ifn test.xst -ofn test.syr
Esto llama al programa de síntesis (xst) indicándole que lea la
configuración desde el archivo test.xst y genere un reporte en
test.syr.
El archivo test.xst podría contener algo como esto:
set -tmpdir tmp
set -xsthdpdir ./xst
run
-ifn test.prj
-ifmt mixed
-ofn test
-ofmt NGC
-p xc2s100-5-pq208
-top cpu_test
-opt_mode Speed
-opt_level 2
-iuc NO
-uc test.xcf
-keep_hierarchy NO
-glob_opt AllClockNets
-rtlview Yes
-read_cores YES
-write_timing_constraints YES
-cross_clock_analysis NO
-hierarchy_separator /
-bus_delimiter <>
-case maintain
-slice_utilization_ratio 100
-verilog2001 YES
-fsm_extract YES
-fsm_encoding Auto
-fsm_style lut
-ram_extract Yes
-ram_style Auto
-rom_extract Yes
-rom_style Auto
-mux_extract YES
-mux_style Auto
-decoder_extract YES
-priority_extract YES
-shreg_extract YES
-shift_extract YES
-xor_collapse YES
-resource_sharing YES
-mult_style lut
-iobuf YES
-max_fanout 100
-bufg 4
-register_duplication YES
-equivalent_register_removal YES
-register_balancing No
-slice_packing YES
-optimize_primitives NO
-tristate2logic NO
-iob auto
-slice_utilization_ratio_maxmargin 5
|
No vamos a entrar en detalle de que es lo que significa cada opción, eso
lo podemos encontrar en los manuales del xst (doc/usenglish/books/docs/xst
de la instalación). Las opciones más relevantes son:
- set -tmpdir tmp indica que hemos creado un directorio llamado
tmp donde se guardarán los archivos intermedios.
- set -xsthdpdir ./xst indica que hemos creado un directorio llamado
xst donde se guardarán los archivos de caché del xst.
- -ifn test.prj indica que la lista de fuentes que integran
nuestro proyecto se encuentra en el archivo test.prj.
- -ofn test indica que se use test como nombre base para
los archivos generados.
- -p xc2s100-5-pq208 indica cual es nuestra FPGA en este
caso una Spartan II.
- -top cpu_test indica cual es la entidad top level a
sintetizar.
- -uc test.xcf indica que hemos creado un archivo de restricciones
(constraints) llamado test.xcf, si no lo hemos hecho hay que omitir esta línea.
ngdbuild test
Este paso es necesario para cambiar el formato generado por xst a uno
usable por el comando map.
map -o map.ncd test
Esto realiza un mapeo de lo sintetizado a los recursos disponibles en
nuestra FPGA
par -w -ol high map.ncd test.ncd
Se encarga de hacer el proceso de place & route de nuestro diseño. Es
durante este proceso que verdaderamente sabremos cuantos recursos hemos
usado.
Para generar el bitstream para nuestra placa (que posee una memoria
para bajarlo) usamos:
bitgen -g startupclk:Cclk -w test test.bit
Si deseamos obtener un reporte de los tiempos indicados por los
constraints podemos usar: trce test map.
Archivo .prj:
En este archivo le indicamos al xst que fuentes componen nuestro proyecto.
Por cada fuente debemos agregar:
vhdl work nombre.vhdl
Ejemplo para ISE:
Para ilustrar el uso del ISE usando la línea de comandos hemos creado un pequeño ejemplo que hace destellar un led de la placa S2Proto. El ejemplo puede adaptarse a otras FPGAs sin mucho esfuerzo (si alguien lo hace por favor contribuya los cambios para que los podamos incluir). El ejemplo asume que tenemos ISE instalado, disponemos de iMPACT Helper y de ResumenXil. Para descargar el ejemplo: Ejemplo para el ISE.
Resumen de síntesis:
La información entregada por las herramientas de síntesis es muy grande y en ocasiones sólo queremos saber los detalles más relevantes del resultado, tales como área insumida y máxima frecuencia de trabajo. Este script permite extraer dicha información y grabarla en un archivo de texto donde es posible llevar un histórico de nuestro proyecto. Un ejemplo de uso de este script se encuentra en Ejemplo para el ISE. Para descargar script: ResumenXil Versión Debian GNU/Linux: ResumenXil
Xil Tools:
Las Xil Tools son un conjunto de herramientas que nos permiten trabajar sin necesidad de correr ISE (o iCEcube2 en el caso de Lattice). Estas herramientas permiten generar archivos tipo Makefile que se encargan de realizar la síntesis de nuestro circuito. Por supuesto que es necesario instalar ISE/iCEcube2. Los dos componentes principales son:
- xil_project_wz.pl Es una herramienta gráfica que nos permite ahorrarnos
un monton de problemas relacionados con seleccionar la FPGA de nuestro kit y
demás. Esta herramienta basicamente sirve para generar archivos de proyecto
con extensión .xilprj. También la podemos usar para navegar los errores y
warnings generados por las herramientas de síntesis. Para entender un poco
mejor como funciona esta herramienta podemos ver el siguiente ejemplo: Ejemplo de botones capacitivos con xil_project_wz.pl (paso a paso).
- xil_project.pl Es una herramienta de línea de comandos que permite generar
un archivo Makefile a partir de un archivo .xilprj. Este último puede haber
sido creado usando xil_project_wz.pl o simplemente usando un editor de texto.
Para entender un poco mejor como funciona esta herramienta podemos ver el siguiente
ejemplo: Ejemplo de botones capacitivos con xil_project.pl.
Actualmente sólo soporta el ISE para Xilinx y el iCEcube2 para Lattice.
Las únicas placas actualmente soportadas son:
- Avnet Mini Spartan II evaluation board (xc2s150-5-pq208)
- Avnet Spartan 3 PCI Evaluation Kit (xc3s1500-fg456)
- Avnet Spartan 3A Evaluation Kit (xc3s400aft256-4)
- Avnet Virtex 4 Evaluation Board (xc4vlx25-ff668)
- Gaisler Research PCI-XC5V-LX110 (xc5vlx110-ff1153-2)
- Gaisler Research XC3S-1500 (xc3s1500-fg456-4)
- Gaisler Research Spartan 6 LX75 (xc6slx75-fgg484-2)
- iCEblink40-HX1K Evaluation Kit (iCE40HX1K-VQ100)
- iCEblink40-HX8K Evaluation Kit (fake) (iCE40HX8K-CB132)
- iCEstick Evaluation Kit (iCE40HX1K-TQ144)
- Kéfir I (1K) (iCE40HX1K-TQ144)
- Kéfir I (4K) (iCE40HX4K-TQ144)
- S2Proto Gamma (r1.2) [Sp. II 100-6] (xc2s100-pq208-6)
- S2Proto v2 (r1.34) [Spartan II 150] (xc2s150-pq208-5)
- S2Proto v2 (r1.34) [Spartan II 150] (xc2s150-pq208-5)
- S2Proto v2 (r1.34) [Spartan II 150-6] (xc2s150-pq208-6)
- S2Proto v3 (r1.45) [Spartan II 150-6] (xc2s150-pq208-6)
- S2Proto v4 (r1.48) [Spartan II 200] (xc2s200-pq208)
- S3Proto Mini (xc3s1600e-fg320-4)
- Xilinx Virtex 6 Evaluation Board (XC6VLX240T-1-FF1156)
- Xilinx Spartan 6 SP601 Evaluation Kit (xc6slx16-2-csg324)
No es muy complejo agregar nuevas placas.
El manual en formato HTML se puede navegar aquí.
Estas herramientas necesitan de otras herramientas que son parte de este proyecto:
- Para poder configurar la FPGA es necesario instalar iMPACT Helper
- Para poder utilizar la placa Avnet Spartan 3A Evaluation Kit es necesario instalar
ASTriAEKiPro, ver aquí
- Para poder navegar los errores de síntesis es necesario instalar SETEdit
Para sistemas operativos Debian GNU/Linux y derivados lo más simple es agregar el repositorio
de paquetes de este proyecto y luego instalar el paquete xiltools. El procedimiento
para agregar el repositorio se explica acá. Luego podemos
usar el gestor de paquetes que más nos guste. Un ejemplo desde la línea de comandos
sería:
usuario@ubuntu$ sudo apt-get install xiltools |
Para descargar los fuentes: Xil Tools 1.4.2
Versión Debian GNU/Linux: Xil Tools 1.4.2
|