Bueno, en esta ocasion voy a hacer un recuento de mi instalación de Fluxbuntu en una Pentium 4 de 1GB de RAM, no es que sea una máquina tan antigua, pero es la misma configuración que he usado en una viejita Armada V300, y en ambas va a la maravilla. De paso de instalar el ISE y el EDK instalé otros programas para desarollo en C++ y Java pero que también se requieren para usar las herramientas de Xilinx.
Primero instalé Fluxbuntu en ambas máquinas. A continuación listaré un registro de mis principales pasos:
I. AÑADIENDO REPOSITORIOS DE MULTIMEDIA PARA APT-GET
Luego de loguearme edité el archivo /etc/apt/sources.list
y añadí las siguientes líneas:
# Medibuntu – Ubuntu 7.10 “gutsy gibbon”
deb http://packages.medibuntu.org/ gutsy free non-free
deb-src http://packages.medibuntu.org/ gutsy free non-free
Luego de esto lo guardo y agrego su clave:
wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add - && sudo apt-get update
Luego realizo un:
apt-get update
y un apt-get upgrade
NOTA: Algo importante de Fluxbuntu es que no monta automáticamente las unidades de CD/DVD, esto es debido a que he usado la versión RC (release candidate), para corregir esto, debes loguearte con tu usuario y crear una carpeta .ivman
>>mkdir .ivman
El otro bug es que el menú de Fluxbox no se actualiza automáticamente después de instalar programas, así que debemos hacerlo con un comando:
>>sudo update-menus
Listo, esto son los 2 bugs más importantes.
II. INSTALANDO PAQUETES BÁSICOS
a. Instalando herramientas para Internet y Correo
sudo apt-get install firefox language-pack-es mozilla-firefox-locale-es-es flashplugin-nonfree evolution acroread acroread-plugins evince
b. Instalando editor de textos básico, terminal y EMACS
sudo apt-get install leafpad gedit gnome-terminal emacs
c. Instalar servidor de impresión CUPS (incluyendo impresora virtual CUPS PDF)
sudo apt-get install cupsys cupsys-bsd cupsys-common cupsys-client cupsys-driver-gutenprint gnome-cups-manager cups-pdf
d. Instalar GNU Classpat, Java 6 y Subversion
sudo apt-get install build-essential mingw32 mingw32-binutils mingw32-runtime sun-java6-jdk subversion
e. Instalar herramientas para desarrollar un compilador, JLex y Java CUP
sudo apt-get install jlex jflex cup
f. Instalar librerías y cabeceras para desarrollar programas con gtkmm y libglademm
sudo apt-get install libgtkmm-2.4-1c2a libgtkmm-2.4-dev libglademm-2.4-1c2a libglademm-2.4-dev
g. Instalar herramientas complementarias y codecs
sudo apt-get install w32codecs ffmpeg skype acroread openssh-server imagemagick gqview
h. Instalar LaTeX y editor de TeXMaker
sudo apt-get install tetex-base tetex-extra tetex-bin tex-common psutils latex-ucs ispell ispanish aspell aspell-es texmaker
i. Requerimientos para herramientas de Xilinx
sudo apt-get install libmotif3 portmap libusb-dev fxload
Bueno hasta aquí fue lo básico.
III. DEFINIENDO MI CLASSPATH PARA JAVA Y PARA USAR JLEX Y JAVA CUP
CLASSPATH=.:/home/abelardo/Java
export CLASSPATH=$CLASSPATH:/usr/share/java/cup.jar:/usr/share/java/JLex.jar:/usr/share/java/JFlex.jar
IV. INSTALANDO EL XILINX ISE 9.2 Y EL XILINX EDK 9.2
El siguiente paso es simple, iniciamos sesión en Fluxbuntu y ponemos el DVD del Xilinx ISE 9.2. Montamos el DVD y ejecutamos en el directorio padre de este el archivo “setup” (sin .exe) desde consola. Ambos programas deben ser instalados como usuario root.
Los pasos siguientes son iguales a instalar este programa en Windows ya que disponemos de un instalador gráfico.
El Xilinx EDK 9.2 se instala de la misma manera. En mi caso yo instalé ambos en /opt
Luego modifique mi archivo de .bashrc para poder acceder a las herramientas de síntesis e implementación desde línea de comandos.
export LANGUAGE=en_GB:en
export XILINX=/opt/Xilinx92i
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Xilinx92i/bin/lin
export PATH=$PATH:/opt/Xilinx92i/bin/lin:/opt/modeltech/bin:/opt/matlab7/bin:/opt/netbeans-6.0/bin
En mi caso $PATH tiene otros directorios añadidos dado que también instalaré allí Modelsim SE 6.2 para Linux. Matlab 7 R14 para Linux y Netbeans 6 (con el CD que me llego gratis
Ahora tenemos el problema de que no podemos usar el cable USB para programar dispositivos de Xilinx, para eso seguimos las instrucciones de
http://rmdir.de/~michael/xilinx/
Alli descargamos el código fuente para crearnos una librería libusb.so que nos permitirá emular el driver windrv6 que usa el Xilinx Impact para programar usando JTAG y USB las tarjetas de Xilinx. Siguiendo las instrucciones me creé un archivo libusb.so y lo puse en mi directorio /home/abelardo/flexlm/libusb.so
Añadi la siguiente línea a mi .bashrc
export LD_PRELOAD=/home/abelardo/flexlm/libusb.so
Ahora el problema es que las tarjetas de Xilinx necesitan que se les descargue un firmware mediante USB antes de Impact las pueda reconocer. Entonces copiamos el archivo:
[XILINX-PATH]/bin/lin/install_script/install_drivers/linux_drivers/pcusb/xusbdfwu.hex
a /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex
Luego cree un archivo en /etc/udev/rules.d/:
llamado: 52-xilinxusb.rules (puede ser cualquier nombre) y le puse el siguiente contenido:
ENV{UDEVD_EVENT}=="1", ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", MODE="0666", RUN+="/sbin/fxload -v -t fx2 -I /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex -D $env{DEVNAME}" ENV{UDEVD_EVENT}=="1", ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", MODE="0666", RUN+="/sbin/fxload -v -t fx2 -I /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex -D $env{DEVNAME}" ENV{UDEVD_EVENT}=="1", ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000b", MODE="0666", RUN+="/sbin/fxload -v -t fx2 -I /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex -D $env{DEVNAME}" ENV{UDEVD_EVENT}=="1", ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", MODE="0666", RUN+="/sbin/fxload -v -t fx2 -I /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex -D $env{DEVNAME}"
ENV{UDEVD_EVENT}=="1", ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", MODE="0666", RUN+="/sbin/fxload -v -t fx2 -I /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex -D $env{DEVNAME}"
ACTION=="add",BUS=="usb",SYSFS{idVendor}=="03fd",SYSFS{idProduct}=="0008",MODE="666"
Las primeras 5 líneas se encargan de cargar el firmware a las tarjetas de Xilinx, Lo malo es que al descargar el firmware, las tarjetas de Xilinx cambian su SYSFS o ID, de modo que solo el usuario root podrá acceder a su programación usando Impact. Por ello añadi la ultima línea donde uso el SYSFS o ID de la tarjeta XUPV2PRO después de que se le descarga el firmware que es 0008 y le doy permisos 0666 para que cualquier usuario pueda escribir en ella. Quizás no es la opción mas segura, debería crear un grupo llamado “Xilinx” y que sólo usuarios de este grupo pudieran escribir en el dispositivo USB con ID 0008, pero aparte de esto, este método que les menciono trabaja bien.
Falta solamente reiniciar udev:
>>sudo /etc/init.d/udev restart
Listo!
Para probar que todo está bien, conecten su tarjeta XUPV2PRO y despues de prenderla hagan un:
Para ver que si podemos escribir en ella:
>> ls -l /dev/bus/usb/002
crw-rw-r– 1 root root 189, 128 Mar 16 03:47 001
crw-rw-r– 1 root root 189, 129 Mar 16 08:47 002
crw-rw-r– 1 root root 189, 130 Mar 16 08:47 003
crw-rw-rw- 1 root root 189, 148 Mar 16 09:55 021
Observemos que el puerto 021 esta con permisos “w” o “write” para tanto usuario, grupo y los demás, que es lo que requerimos que todos puedan escribir en la tarjeta. El puerto usb21 será usado por Impact para programar la tarjeta.
Ahora cualquier usuario puede invocar Impact y descargar su bitstream. En este momento si alguien llama al Impact, este podrá detectar y tener acceso de configuración sobre la tarjeta (en mi caso la XUPV2PRO):

Hay un problema adicional con las herramientas de Xilinx y se da si queremos llamar al fpga_editor o al floorplanner desde línea de comandos:
>>fpga_editor
Wind/U X-toolkit Error: wuDisplay: Can’t open display
Para corregir esto debemos antes de llamarlos, cambiar nuestra variable DISPLAY
export DISPLAY=:0.
Esta práctica no es recomendable dado que las conexiones remotas SSH a nuestra máquina ya no podrán hacer X forwarding al host remoto, pero parece ser un error del Wind/X toolkit que usa Xilinx que usa expresiones no estándar para el DISPLAY.
Otro error que es bien molesto es al actualizar proyectos de EDK de versiones anteriores dice que libdb-4.1.so no fue encontrada, en este caso debemos hacer lo siguiente:
sudo ln -s /usr/lib/libdb-4.x.so /usr/lib/libdb-4.1.so
donde “x” es un numero que puede cambiar, debes mirar en /usr/lib para saber que libdb tienes.
V. CREANDO UN MAKEFILE Y SCRIPTS PARA REALIZAR EL FLUJO DE DISEÑO DE XILINX (INCLUIDA CONFIGURACIÓN DESDE LÍNEA DE COMANDOS)
Finalmente ya que nuestro .bashrc esta configurado para usar las herramientas de sintesis desde línea de comandos, podemos hacer el flujo de diseño sin GUI en línea de comandos, lo que será mucho más rápido.
Crearemos primero un directorio para nuestro proyecto, dentro de este directorio habrán 1 archivo Makefile y dos directorios: hdl y bitstreams (es arbritraria esta elección que hice)
En el directorio hdl debe ir todos nuestros archivos de código fuente VHDL, junto a un archivo script para el XST, que lo llame top.script y un archivo de lista de dependecias de nuestro código VHDL llamado top.prj
En el directorio bitstreams debe ir la bitstream que se enviará al FPGA (se genera después de hacer el “make” del proyecto), y un script de bash runimpact.sh para llamar a Impact y un archivo prog.cmd donde coloqué las opciones para llamar a Impact desde línea de comandos (modo batch).
Les adjunto el Makefile para poder correr el flujo de diseño de Xilinx sin usar la interface gráfica: (correrá mássss rapido)
# Simple makefile#
SHELL=/bin/bash
TOP=topSRCS=./hdl/top.vhd ./hdl/top.prj
# List all of your required cores here.
#CORES = tri_mode_eth_mac_v2_2.edn \
# rxfifo_8kx9_to_36.edn \
# rxfifo_8kx9_to_72.edn
# uncomment the following line to skip rebuilding IP cores
CORES =
#-------------------------------------------------------
# Probably dont need to change anything below this line.
#-------------------------------------------------------
# name of the global report file.
REPORT = synth.txt
# Smartguide support to improve routing speeds
ifneq ($(strip $(wildcard $(TOP)_par.ncd)),)
SMARTGUIDE_CP = cp $(TOP)_par.ncd smartguide.ncd
SMARTGUIDE = -smartguide smartguide.ncd
NUM_ITER =
else
SMARTGUIDE_CP =
SMARTGUIDE =
NUM_ITER = -n 1
endif
# Need to be able to recreate the core IP
.SUFFIXES : .edn .xco .ngc
# Invoke coregen to create edn or ngc files etc needed for ngdbuild.
# Alas coregen will recreate the xco file so we just copy the old
# xco and then copy it back after we are done.
# Also, copy the .vhd files to ../src
#
.xco.edn:
@echo ==================================================
@echo "=== Invoking coregen to rebuild $@"
@echo ==================================================
cp -p $< $<.BAK
coregen -b $<
mv $<.BAK $<
@if [ -r $*.vhd ]; then \
@echo "Copying $*.vhd to the src directory." ;\
cp $*.vhd ./hdl/src ;\
fi
.xco.ngc:
@echo ==================================================
@echo "=== Invoking coregen to rebuild $@"
@echo ==================================================
cp -p $< $<.BAK
coregen -b $<
mv $<.BAK $<
@if [ -r $*.v ]; then \
@echo "Copying $*.vhd to the src directory." ;\
cp $*.vhd ./hdl/src ;\
fi
all: $(TOP)_par.ncd $(TOP)_par.twr $(TOP)_par.bit
@echo Making all...
cores: $(CORES)
@echo "Made cores."
bitstream: $(TOP)_par.bit
@echo "Bitstream created."
# Generate Bit Stream
$(TOP)_par.bit: $(TOP)_par.ncd
@echo ==================================================
@echo "=== Generate bit stream file from ncd"
@echo ==================================================
bitgen -intstyle ise -g Binary:Yes -m -w $(TOP)_par.ncd
rm ./bitstreams/$(TOP)_par.bit
cp $(TOP)_par.bit ./bitstreams/
# Run timing analysis ( add -u for unconstrained paths)
$(TOP)_par.twr: $(TOP)_par.ncd
@echo ==================================================
@echo "=== Run Post Place and Route Timing (trce)"
@echo ==================================================
trce -v $(TOP)_par.ncd $(TOP).pcf | tee -a $REPORT
# Run PaR
$(TOP)_par.ncd: $(TOP).ncd
@echo ==================================================
@echo "=== Run Place and Route (PAR)"
@echo ==================================================
if par -intstyle ise $(NUM_ITER) -ol high -pl high -rl high -t 1 $(SMARTGUIDE) -w $(TOP).ncd $(TOP)_par.ncd ;\
then \
@echo "Place and Route passed." ;\
cat $(TOP)_par.par >> $REPORT ;\
else \
@echo "Place and Route failed - see $(TOP)_par.par for details." ;\
exit 1 ;\
fi
# Run map
$(TOP).ncd: $(TOP).ngd
@echo ==================================================
@echo "=== Run MAP"
@echo ==================================================
$(SMARTGUIDE_CP)
if map -intstyle ise -detail -u -ol high -cm speed $(SMARTGUIDE) -ignore_keep_hierarchy -pr b -k 4 -c 100 -tx off -timing $(TOP) ; \
then \
@echo "map passed." ; \
cat $(TOP).mrp >> $REPORT ;\
else \
@echo "map failed - see $(TOP).mrp for details." ;\
exit 1 ;\
fi
# Run ngdbuild (would also pull in core .ngo files)
$(TOP).ngd: $(TOP).ngc
@echo ==================================================
@echo "=== Run NGDBUILD"
@echo ==================================================
if ngdbuild -intstyle ise $(TOP) ; \
then \
@echo "ngdbuild passed." ; \
cat $(TOP).bld >> $REPORT ;\
else \
@echo "ngdbuild failed - see $(TOP).bld for details." ;\
exit 1 ;\
fi
# Run synthesis
$(TOP).ngc: $(SRCS) ./hdl/$(TOP).script
@echo ==================================================
@echo "=== Run Synthesis (XST)"
@echo ==================================================
if xst -intstyle ise -ifn ./hdl/$(TOP).script ; \
then \
@echo "Synthesis passed." ; \
cat $(TOP).srp >> $REPORT ;\
else \
@echo "Synthesis failed - see $(TOP).srp for details." ;\
exit 1 ;\
fi
#Generate Post-synthesis VHDL and SDF:
psv: $(TOP)_par.ncd
@echo ==================================================
@echo "=== Generate post-synthesis verilog and SDF"
@echo ==================================================
netgen -sim -ofmt vhdl nf2_top_par.ncd -pcf $(TOP).pcf
clean:
rm -rf *.bld *.lso *.mrp *.ncd *.ngm *.pad.* *.par *.twr *.bit *.drc *.bgn
rm -rf *.pcf *.xpi *.srp *vhdl.prj *pad.txt *.pad *pad.csv netlist.lst xst
rm -rf $(TOP).ngc *~ $(TOP)_par.v $(TOP)_par.sdf $(TOP)_par.bin
rm -rf *.msk *.unroutes *.xml
rm -rf $REPORT
really_clean:
@echo "Making really clean - will need to use coregen to rebuild the core ngc files."
make clean
rm -rf *.ngc *.ngo *.edn *.asy *flist.txt *readme.txt *.sym *.v *.veo *.log *.ngd *.nlf
NOTA: Si tenemos netlists .NGC generados mediante Coregen estos deben ser copiados al directorio tope del proyecto donde se encuentra nuestro Makefile.
El top.prj es un archivo que es una lista de los archivos VHDL que tiene nuestro proyecto pero tiene que ser en el orden de dependencia, de modo que en esta lista top.vhd que es el archivo tope y que depende de todos será el que se liste al final.
El archivo top.script es mi script para usar el XST desde línea de comandos y en mi caso lo he hecho así:
run
-ifn ./hdl/top.prj
-ifmt VHDL
-ofn top.ngc
-ent top
-ofmt NGC
-p xc2vp30-7-ff896
-opt_mode SPEED
-opt_level 1
-max_fanout 32
-keep_hierarchy no
-register_duplication YES
-equivalent_register_removal no
-hierarchy_separator /
-bus_delimiter <>
-mux_extract YES
-mux_style MUXF
-ram_extract YES
-ram_style Auto
-rom_extract YES
-rom_style Distributed
-decoder_extract YES
-priority_extract YES
-shreg_extract YES
-shift_extract YES
-xor_collapse YES
-resource_sharing YES
-iobuf YES
-register_balancing no
-slice_packing Yes
-glob_opt max_delay
-fsm_encoding Compact
Estas opciones definitivamente se pueden cambiar según nuestros requerimientos. Ejemplo: flujo de diseño modular o para reconfiguración dinámica parcial.
Al final de la compilación mediante “make” se me copia la bitstream generada y lista para descargarse al FPGA en el directorio “bitstreams”.

El script runimpact.sh dentro del directorio “bitstreams” lo listo a continuación:
#!/bin/bash
impact -batch prog.cmd
El archivo prog.cmd también está en este directorio y su contenido es:
setmode -bscan
setcable -p auto
identify
assignfile -p 3 -file top_par.bit
program -p 3
quit
VI. TRABAJANDO CON EMACS Y MODELSIM PARA EDICIÓN DE NUESTRO CÓDIGO VHDL
Si ejecutamos todo nuestro flujo de diseño veremos que la etapa de síntesis es la que consume más tiempo, asi que si la vamos a ejecutar sería mejor que estemos seguro que nuestro archivos VHDL hacen lo que esperamos, para eso usaremos el Modelsim para Linux.
Después de estos pasos instalé Matlab 7 R14 para Linux, Modelsim 6.2 para Linux y el Intel C++ Compiler 10.1.008. Los pasos para instalar estos programas están en Internet, (en San Google) y no son complicados.
Todos estos programas se encuentran en Emule, junto al Cadence para diseño de circuitos VLSI versión IC 5.033; lo malo de este último es que sólo es soportado hasta por el kernel del Ubuntu Dapper (de Edgy para arriba no funciona), así que si quieren usarlo necesitarán una máquina con Ubuntu Dapper y antes de ejecutarlo dar una variable de entorno:
alias icfb=’LD_ASSUME_KERNEL=2.6.15 icfb’
La razón de esto es un problema con las librerías de threads que usa el Cadence IC 5.033 que actualmente están obsoletas.
Una vez instalado el Modelsim y que ha sido añadido a nuestro PATH en el .bashrc tendremos listos para usar en línea de comandos el compilador VCOM y el simulador VSIM del Modelsim.
Para compilar nuestros archivos VHDL, nos vamos dentro del directorio “hdl” de nuestro proyecto y creamos primero una librerìa work donde compilaremos nuestro diseño:
>>vlib work
>>vmap work work
Para ver si trabaja bien, llamamos al compilador del Modelsim VCOM
>>vcom -93 -work work top.vhd
Model Technology ModelSim SE vcom 6.2 Compiler 2004.08 Aug 19 2007
– Loading package standard
– Loading package std_logic_1164
– Loading package std_logic_arith
– Loading package std_logic_unsigned
– Compiling entity top
– Compiling architecture behavioral of top
La directiva -93 es para especificar VHDL 93.
Ahora ya que esta creada la librería podemos editar nuestro código VHDL usando EMACS. Sinceramente es el mejor editor VHDL que existe, ya que EMACS dispone integrado un modo especial para VHDL que nos permite hacer autocompletado de código, insertar un componente o instancia desde otro archivo VHDL, generador de testbench, manejador de proyectos mediante “Speedbar”.
Es el mejor editor VHDL que existe y siendo GNU. Y como adicional, EMACS se integra con el Modelsim en forma automática, de modo que cuando en EMACS llamamos compilar, EMACS llamara al VCOM de Modelsim para compilar el código que estamos editando y saber si nos hemos equivocado (increíble no?).

Para simular nuestro código VHDL desde lìnea de comandos, necesitamos usar VSIM, pero en modo consola:
>>vsim -c work.[testbench_top] -do “run -all; exit;”
testbench_top es el nombre de nuestro archivo testbench_top.vhd que debe también haber sido compilado previamente con VCOM y dentro de nuestra librerìa WORK.