Xilinx ISE, Xilinx EDK para XUP-V2Pro en Linux

300409
150610
310512

Herramientas
  • Linux Debian 5.0, Linux Fedora 13
  • Xilinx ISE 8.2i, Xilinx EDK 8.2i, probando el 10.1i
  • Tarjeta de desarrollo XUPV2P, probando Virtex 5
  • Bibliotecas libusb y usb-driver
  • minicom

La tarjeta de desarrollo XUPV2P (Virtex 2 Pro)

La tarjeta de desarrollo XUPV2P ...

  • Virtex-II Pro XC2VP30 FPGA with 30,816 Logic Cells, 136 18-bit multipliers, 2,448 Kb of block RAM, and two PowerPC Processors
  • DDR SDRAM DIMM that can accept up to 2Gbytes of RAM
  • 10/100 Ethernet port
  • USB2 port (for FPGA configuration only)
  • Compact Flash for FPGA configuration and data storage
  • XSGA Video port
  • Audio Codec
  • SATA for connecting multiple XUPV2P boards
  • PS/2 and RS-232 ports
  • User GPIO (4 DIP switches, 5 push buttons, 4 LEDs)
  • Audio: Line-in, Microphone-in, Line-out, AMP Out
  • High and low speed expansion connectors with a large collection of available expansion boards

La documentación de la tarjeta XUPV2P ...

 

Requerimeintos de linux

Apesar de que las herramientas de Xilinx son prácticamente autocontenidas, siempre será de utilidad contar con las herramientas básicas de desarrollo:

#apt-get install gcc
#apt-get install g++
#apt-get install vim vim-full vim-gtk vim-gui-common

Debido a que la mayoría de las herramientas de Xilinx fueron desarrolladas en C++, es necesario instalar las bibliotecas con clases desarrolladas y compiladas con versiones de g++ en versiones 3. La biblioteca que lleva a cabo el renombramiento de las clases se conoce como The GNU Standard C++ Library V3, en Debian se instala de la siguiente forma:

#apt-get install libstdc++5

para fedora:

#yum install libstdc++5

o de manera equivalente:

#yum install compat-libstdc++-33



Instalación del ISE 8.2i

La instalación del ISE se lleva a cabo al ejecutar el script de instalación contenidos en los DVD's:

$<DVD-ROM-ISE>/setup

Es posible que la configuración por defecto del HAL, no permita la ejecución del script desde la ruta creada de forma dinámica, en ese caso se podría detener el HAL y montar manualmente el DVD.

En caso de contar con las imágenes ISO, se deberán montar la imágen para acceder a los archivos. Para montar algún dispositivo o imágen se debe contar con privilegios de super-usuario:

#mount -o loop imagenISO-ISE.iso /mnt

Ahora la ruta de instalación será:

$/mnt/setup

En sistemas de escritorio personalizado un usuario podría hacer su instalación del ISE al invocar el script de instalación, la instalación creará un directorio en su home llamado Xilinx. Lo anterior no es recomendable para servidores multiusuario, ya que el software se instalaría para cada usuario. Será el administrador del sistema el encargado de la instalación y el otorgamiento de privilegios.


Seleccionamos solo los módulos que necesitamos:

Virtex2/Virtex2P/Spartan3/Spartan3E
Design Environment Tools
Cable Drivers
Standalone Programming tools

Para la instalación de los "Drivers Cables" (win drivers), es necesario contar permisos de superusuario, sin embargo, nosotros utilizaremos otros módulos para la programación del dispositivo.




Instalación del EDK 8.2i

La instalación del EDK es muy similar al del ISE:

$<DVD-ROM-EDK>/setup

En este caso se creará por defecto el directorio EDK el home del usuario.

Algunas herramientas del EDK, requieren de la biblioteca dinámica: libdb-4.1.so, la cual contiene módulos para el acceso a bases de datosde desde C++ y se encuntra en /usr/lib. Es posible que en una instalación típica de Debian no se instalen dichas bibliotecas. En ese caso instalamos la más reciente y creamos un enlace simbólico

#apt-get install libdb4.6++-dev
#ln -s /usr/lib/libdb-4.6.so /usr/lib/libdb-4.1.so

Para desmontar algún dispositivo o imágen se ejecuta el siguiente comando:

#umount /mnt 


Ejecución del ISE y EDK

Para lanzar tanto ISE como el EDK, será necesario crear variables de ambiente para la relación de sus aplicaciones. Existe un script para ello en ambas herramientas:

$Xilinx/settings.sh
$EDK/settings.sh

Una vez creadas las variables de ambiente, se lanza las aplicaciones, al invocar la herramienta adecuada, por ejemplo, para lanzar Xilinx Plataform Studio del EDK:

$EDK/bin/lin/xps

o simplemente:

$xps

En el caso del ISE ejecutamos:

$Xilinx/bin/lin/ise

 

Simulador del ISE

La suite de software de Xilinx incluye un simulador llamado ISE Simulator. El simulador permite la simulación funcional del circuito y cuenta con una línea de comando para recargar proyectos, inicializar variables, asignar tiempos, etc. Por ejemplo, para solicitar ayuda desde la línea de comandos:

%help


Un error muy común en
versiones anteriores al 11.2i del ISE es que al lanzar el simulador generaba el siguiente error:

"ERROR:Simulator:222 - Generated C++ compilation was unsuccessful"
 
Lo anterior es debido a que Xilinx integró en la instalación del ISE herramientas de GNU, como el compilador y el enlazador. En algunos casos las herramientas de Xilinx deben de enlazar módulos que están en bibliotecas (estáticas o dinámicas) del sistema. Para poder llevar a cabo el enlazado de módulos que están en bibliotecas externas  se deberá de hacer con el enlazador que está instalado en el sistema y no el que está contenido en la instalación del ISE. La manera más sencilla es que evitar los enlazadores del ISE, para ello simplemente le cambiamos el nombre:

$cd <ISE-HOME>/gnu/gcc/3.2.3/lin/i686-pc-linux-gnu/bin
$mv ld ld.old

$cd <ISE-HOME>/gnu/gcc/3.2.3/lin/bin
$mv ld ld.old


Definitivamente un simulador más profesional es el MODELSIM, sin embargo es software propietario, cuando lo compre, les digo cómo funciona en linux =-)


Xilinx JTAG en linux

El puerto de configuración Joint Test Action Group (JTAG) es utilizado por varias herremientas de Xilinx, tanto para configuarar y programar dispositivos (Impact) como para hacer depuración en tiempo de ejecución (Chipscope y XMD) de hardware programado en los dispositivos. El dispositivo Virtex 2 Pro (XC2VP30) de la tarjeta XUP-V2Pro, cuenta con un puerto JTAG tanto para la configración y depuración de hardware como para programación de los procesadores PowerPC 405 incrustados en el mismo. El acceso se puede llevar a cabo por medio del puerto paralelo (Parallel Cable III, PCIV y PCIV modes) o por el puerto USB.

Inicialmente para tener acceso al JTAG del dispositivo desde linux, por medio del puerto paralelo o el puerto USB, se utilizaba un módulo de kernel llamado Jungo. Para los kernels actuales (>2.6.18) se ha desarrollado la biblioteca libusb, la cual emula el módulo en el espacio de direcciones del usuario, permitiendo el acceso de las herramientas de Xilinx al JTAG de los dispositivos. Las limitaciones es la velocidad de operación del JTAG...:

Se pueden bajar las fuentes, configurar el Makefile, compilar e instalar:

$tar jxvf libusb-1.0.0.tar.bz2
$cd
libusb-1.0.0
$./configure
$make
#make install

En distribuciones de linux para desarrollares (Debian claro!) esta biblioteca es el caballito de batalla para el creación de drivers de sistema con acceso USB, por tal razón ya está incluida en sus repositorios.

#apt-get install libusb-dev

para fedora:

#yum install libusb-devel libusb-static libusb1-devel libusb1-devel-doc libusb1-static


Para acceder por medio del puerto USB, se utiliza la biblioteca usb-driver, la cual también puede trabajar con el puerto paralelo. Bastará con bajar las fuentes, compilar y crear una variable de ambiente para que las herramientas de Xilinx la puedan utilizar:

$tar zxvf usb-driver-HEAD.tar.gz
$cd usb-driver
$make
$export LD_PRELOAD=/path/to/libusb-driver.so
$impact

Para utilizar el dispositivo como un usuario ordinario, creamos el archivo en /etc/udev/rules.d/libusb-driver.rules, con la siguiente información:
ACTION=="add", BUS=="usb", ATTRS{idVendor}=="03fd", MODE="666"

Reiniciamos el demonio de dispositivos

#/etc/init.d/udev restart


Conectamos la tarjeta XUPV2Pro al sistema USB y comprobamos que exista la entrada:

$/sbin/lsusb
...
BUS 007 Device 003: ID 03fd:0008 Xilinx, Inc.
...

Una variación en los dígitos de identificación del vendor:product, indicará una descarga inadecuada del firmware, lo que generará problemas con las aplicaciones para configurar el FPGA, en específico el impact. Un error muy común es que las tarjetas de Xilinx no identifican el firmware de manera inicial, entonces se deberá hacer de manera explicita por medio de una línea de comando y una posterior edición de los archivos involucrados.


Problemas con la carga del firmware

Todo lo involucrado con el reconocimiento del dispositivo, la asignación de una ruta al dispositivo y la carga del firmware adecuado, lo lleva a cabo la aplicación udev, sucesor de hotplug. udev  funciona de la siguiente forma: al insertar un dispositivo al sistema por medio de un puerto USB, el kernel alerta al demonio udevd de que un nuevo dispositivo ha sido detectado en uno de los concentradores de puertos USB, en nuestro ejemplo anterior es el bus 007 y el dispositivo 003. udevd identifica al dispositivo asignandole un nodo de entrada, el cual consiste en número mayor (189) y un número menor (653) y un número de dispositivo. Además udevd le asigna una entrada en el directorio /dev. Podemos ver los números asignados si listamos:

$ls -al /dev/bus/usb/007
...
crw-rw-rw- 1 root root 189,653 2010-04-09 12:49 003
...


En este punto, udevd buscará si existe alguna acción o regla específica con el dispositivo y la llevará a cabo. Como ya se comentó, los archivos de reglas se encuantran en: /etc/udev/rules.d/. Es común encontrar reglas para cambiar el modo de acceso y cargar un firmware específico. La instalación del software de Xilinx tiene sus archivos de reglas y los archivos de firmware en:

<XILINX_HOME>/bin/lin/

o también en:

<
XILINX_HOME>/bin/lin/install_script/install_drivers/linux_drivers/pcusb/

Algunas versiones del ISE requiere que se copien los archivos de reglas y firmware en las rutas adecuadas y otras utilizan scripts para hacerlo y claro, que las rutas pueden cambiar para cada distribución de linux. Por ejemplo, para la versión 10.1i del ISE, solo es necesario ejecutar el script que se encuentra en  <XILINX_HOME>/10.1/ISE/bin/lin :

$source ./setup_pcusb

El cual es un script que compia el archivo de reglas y los archivos de firmware a las rutas preestablecidas.

Los archivos de reglas son archivos de texto sin formato que puede editarse, por ejemplo el archivo xusbdfw o xusbdfw.rules  se puede ver así:

SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666", BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusbdfwu.hex -D $TEMPNODE"

BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_xup.hex -D $TEMPNODE"

BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="/sbin/fxload -v -t fx2 -I /usr/share/xusb_emb.hex -D $TEMPNODE"

BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="/sbin/fxload -v -t fx2 -I


Puede notarse que se utiliza el comando fxload para la carga del firmware adecuado. Es posible que podamos cargar el firmware que necesitemos al ejecutar el comando con los parámetros adecuados.  Por ejemplo, tomando los valores anteriores:

#/sbin/fxload -v -t fx2 -I /usr/share/usb/xusbdfwu.hex \
-D /dev/bus/usb/007/003


Con la información anterior se puede editar los archivos de reglas para que se pueda detectar y configurar de manera automática la tarjeta de desarrollo.

 

Crear un sistema mínimo (en construcción)

Para crear un sistema mínimo en la XUPV2P: CPU, memoria RAM y sistema de buses;
se crean los archivos: system.mhs, system.mss, system.ucf...:

Curso intertrimestral:

Sesión 1: Introducción al EDK
Sesión 2:  sistema mínimo en xupv2p
Sesión 3: IP de catalogo
Sesión 4: Agregando mi IP

Propuesta de: Temas Selectos de Sistemas Digitales (para alumnos de electrónica y computación)
Desarrollo de sistemas empotrados basados en FPGAs, codiseño hardware/software




Creación del hardware:

$plangen -p xc2vp30ff896 -lang vhdl \
 /home/oscar/edk_seminario/lib system.mhs

$cd synthesis
$./synthesis.sh

$xflow -wd implementation -p
xc2vp30ff896-7 -implement \
 xflow.opt system.ngc

$ngdbuild -p
xc2vp30ff896-7 -nt timestamp -bm system.bmm

$map -o system_map.ncd -pr b system.ngd system.pcf

$par -w -ol high system_map.ncd system.ncd system.pcf

$trce -e 3 -xml system.twx system.ncd system.pcf

$cd implementation

$bitgen -w -f bitgen.ut system


Creación del software:

$libgen -mhs system.mhs -p xc2vp30ff896-7 \
        -lp
/home/oscar/edk_seminario/lib system.mss

$gmake


Configuración del dispositivo:



make y gmake

En algunas distribuciones el comando make también es nombrado como gmake. Y es simplemente para diferenciarlos de otros compiladores, pero de nuevo, la comunidad de Debian es medio radical en el uso de nombres y licencias y para ellos existe solo un nombre.

#ln -s /usr/bin/gmake /usr/bin/make



USB-RS232

Linux deberá de reconocer el adaptador de USB a RS232:

$/sbin/lsusb
...
BUS 009 Device 002: ID 4348:5523 WinChipHead USB->RS232 adapter...
...

Linux creará un dispositivo el cual deberá ser asociado con mknode a la nueva entrada.
El dispositivo puede ser nombrado como:

/dev/ttS*  o /dev/ttyUSB*



Minicom

Con esta aplicación podremos conectarnos por el puerto serie (DB9) a un switch, router o a la terminal RS232 de la tarjeta XUP.

#apt-get install minicom

Minicom está configurado por defecto para conectarse a un dispositivo /dev/ttS1 o tal vez a /dev/modem. En nuestro caso el dispositivo al que desamos acceder es /dev/ttyUSB0, entonces será necesario configurarlo:

#minicom -s

tomamos las opciones:  Serial port setup y cambiamos el Serial device. También se puede crear un enlace simbólico e iniciar el minicom:

#ln -s /dev/ttyUSB0 /dev/modem
#minicom

Para configuararlo: CTRL+A y después Z. La opción P permite cambiar la configuración de acceso, por ejemplo C: 9600-8-N-1.



GTKTerm

Otra terminal para el RS232 es gtkterm, la cual trabaja sobre las X utilizando las capas de GTK. Su configuración y funcionamiento son de forma muy similar al minicom, incluso se parece más a la hypertérminal de windogs.

#apt-get install gtkterm