


Aggiornato al : dic 29, 2008
La tecnologia FPGA (Field programmable gate array) è senza dubbio molto interessante, in quanto si propone come un’alternativa (in certi casi) ai circuiti ASIC (Application Specific Integrated Circuit), cioè a quei circuiti integrati che normalmente siamo abituati a vedere e che sono stati prima progettati e poi realizzati in fabbrica. Questi ultimi hanno un costo per chip bassissimo (ordine di grandezza del dollaro), parametri ottimizzati (es. bassa potenza dissipata), ma presentano molti svantaggi, tra cui cicli di progettazione e di produzione lunghissimi, costi iniziali molto elevati e impossibilità di correggere eventuali bug dopo aver prodotto il chip.
Un dispositivo FPGA, invece, è un chip che contiene una matrice più o meno grande di blocchi logici (LUT) configurabili e di canali di routing e tutto questo è programmabile sul campo. Ciò significa che potremo decidere noi quali blocchi logici utilizzare e come collegarli tra loro, in modo da scegliere noi cosa vogliamo che il nostro circuito faccia: i blocchi sono lì a disposizione, sta a noi decidere quali e come impiegarli. Le caratteristiche di questa soluzione sono: cicli di produzione molto veloci, semplice correzione di eventuali bug (grazie alla possibilità di riprogrammare il tutto), costi iniziali quasi nulli, a fronte di caratteristiche meno ottimizzate rispetto alle soluzioni ASIC (ad esempio maggiore potenza dissipata, maggiore area occupata, ecc.).
Ecco perché l’FPGA si pone come alternativa ai circuiti ASIC in determinati casi e permette tra l’altro di sperimentare divertendosi e imparando, dato che i modelli più a basso costo sono destinati soprattutto al mercato amatoriale.
Diverse aziende, principalmente Xilinx e Altera, hanno cominciato (e continuano tuttora a pieno regime) a vendere board FPGA per lo sviluppo, con caratteristiche e prezzi diversi. Si va dai modelli a più basso costo (con un numero di LUT limitato e con prezzi anche inferiori ai 100 dollari) a quelli più costosi (con un numero elevato di LUT e con prezzi che di conseguenza salgono anche parecchio). Per l’uso amatoriale vanno benissimo anche i modelli più economici, in quanto il numero di LUT è più che sufficiente.
La board che al momento sto utilizzando per un progetto universitario fa parte di quelle più a basso costo ed è il modello Spartan 3E-500 Starter Kit di Xilinx, che si presta bene a lavorare anche su Linux, in quanto il loro software ISE è sviluppato anche per il sistema operativo del pinguino, oltre che per Windows. Mi sembra quindi che si tratti di un’ottima scelta per cominciare, vediamo come far funzionare tutto.
Installazione di ISE e del driver
Scaricare il software dal sito di Xilinx (la versione ISE Webpack 9.2i è gratuita, basta registrarsi). Il pacchetto è unico perché comprende i file da installare per entrambi i sistemi operativi e si installa facilmente: basta lanciare l’eseguibile di installazione.
Qualche accorgimento: se il computer è usato da una sola persona conviene lanciare l’installer da utente normale e non da root e installare il software nella propria home; se invece il computer è usato da più persone, conviene lanciare l’installer da root e magari installare il software nella directory /opt, creare un gruppo contenente le persone che dovranno usare il software e dare a tutto il gruppo i diritti sulla directory e le sue sottodirectory.
Scegliamo i componenti da installare (ci sono dei componenti per il supporto alle varie tipologie di board, selezioniamo solo quello che ci interessa), togliamo il segno di spunta alla richiesta di installare i driver del cavo di collegamento della board al computer (in quanto lo faremo poi a parte), invece selezioniamo la ricerca di eventuali update (che ci sono quasi sempre, nel mio caso c’era addirittura un Service Pack), ricordando che per installare questi ultimi bisogna rilanciare l’installer.
Dopo aver terminato l’installazione bisogna installare i driver del cavo, e qui arrivano le dolenti note. Xilinx dichiara che i driver del cavo su Linux funzionano su distribuzioni Red-Hat like, ma con kernel superiori a 2.6.16 ci sono problemi, inoltre che fare se uno ha una Debian o una Ubuntu? Su Internet ci sono dei siti con delle guide su come riuscire a far andare i driver di Xilinx su una Debian con un kernel tra quelli più recenti, ma sono spesso ingarbugliate e bisogna usare il modulo del kernel proprietario windrvr; inoltre non è assolutamente detto che funzionino e il rischio di combinare un disastro sulla propria distribuzione è decisamente alto, soprattutto per un utente alle prime armi. Mentre stavo per convincermi a provare queste procedure, ho trovato su un sito la descrizione di un driver sviluppato da terze parti che utilizza tecnologie più recenti, funziona bene sulle distribuzioni anche con gli ultimi kernel e richiede solo qualche semplice passaggio per l’installazione. Inoltre il sito in questione dichiara che il driver funziona bene con le seguenti accoppiate:
XILINX Platform Cable USB DLC9, DLC9LP and DLC9G
Integrated Platform Cable USB on Spartan 3E starter kit
Integrated Platform Cable USB on Spartan 3A starter kit
Integrated Platform Cable USB on XUP-V2Pro
XILINX Parallel Cable IV (in Parallel Cable III compatibility mode)
Enterpoint Prog2 Parallel Cable III clone
Trenz TE0149-01 Parallel Cable III clone
Digilent JTAG3 Parallel Cable III clone
Amontec JTAGkey-Tiny (experimental)
mentre dovrebbe funzionare (anche se non è stato testato) con le seguenti accoppiate:
Integrated Platform Cable USB on other development boards
other Parallel Cable III clones
other FTDI2232 based devices which use the chips standard JTAG pinout (experimental)
Le versioni del software supportate sono le seguenti:
ISE Webpack 9.2 SP1, SP2 and SP3
ISE Webpack 9.1 SP1, SP2 and SP3
ISE Webpack 8.2 SP3
ISE Webpack 8.1 SP3
ChipScope Pro 9.2.01i
ChipScope Pro 9.1.02i and 9.1.03i
ChipScope Pro 8.2.04i
EDK 9.2.01i
EDK 9.1.01i and 9.1.02i
EDK 8.2.02i
EDK 8.1.02i
Synplicity Identify Debugger
Il mio caso è quello del collegamento tramite cavo USB ed è quello che spiegherò adesso.
Tanto per cominciare bisogna avere installato sulla propria distribuzione il pacchetto “libusb development”, su una Debian o Ubuntu o simili basta farlo mediante il comando
apt-get install libusb-dev
A questo punto bisogna scaricare e compilare il driver, alternativamente è possibile scaricare qui il driver già compilato ma è meglio se lo compilate da voi. Vediamo come:
1) scaricate il driver del cavo all’indirizzo http://git.zerfleddert.de/cgi-bin/gitweb.cgi/usb-driver?a=snapshot;h=HEAD;sf=tgz o alternativamente potete scaricarlo mediante il comando
git clone git://git.zerfleddert.de/usb-driver
dopo ovviamente avere installato git.
2) Estraete il driver mediante
tar xzf usb-driver-HEAD.tar.gz
3) Entrate nella cartella del driver
cd usb-driver
3) Lanciate:
make (se avete un sistema a 32 bit)
make lib32 (se invece avete un sistema a 64 bit)
da cui otterrete il file libusb-driver.so
4) Copiate tale file in una cartella di sistema con il seguente comando
cp libusb-driver.so /usr/local/lib/ [da root]
5) A questo punto, dobbiamo creare la seguente variabile di ambiente mediante il comando
export LD_PRELOAD=/usr/local/lib/libusb-driver.so
Adesso il driver dovrebbe essere installato correttamente. Per verificare, collegare la board al pc mediante il cavo e accenderla. Subito dopo, digitare [da root]
lsusb
Tra i vari dispositivi, dovrebbe comparire anche il nostro cavo con a fianco un ID, che dovrebbe essere il seguente:
03fd:0008
A me ha funzionato subito, se è così si può passare alla sezione successiva, altrimenti vuol dire che il firmware non è installato correttamente, quindi il README del driver propone di seguire i seguenti passi (sostituisci a ISE_DIR la directory in cui hai installato ISE):
1)Se non hai il file /etc/udev/rules.d/xusbdfwu.rules, copialo dalla sottodirectory ISE_DIR/bin/lin/xusbdfwu.rules alla directory /etc/udev/rules.d/
2)installa il pacchetto “fxload” nella tua distrubuzione se non è già presente
3)copia i file ISE_DIR/bin/lin/xusb*.hex nella directory /usr/share/
4)riavvia udev mediante /etc/init.d/udev restart e ricollega la board al pc mediante il cavo; riprovando a lanciare lsusb dovresti ottenere per il cavo l’id corretto
Avvio di ISE
Una cosa da fare prima di avviare ISE è creare (da root) il file /etc/udev/rules.d/libusb-driver.rules e inserire dentro il seguente codice, in modo che anche l’utente normale possa usare IMPACT (il “programmatore” di ISE):
ACTION=="add", BUS=="usb", SYSFS{idVendor}=="03fd", MODE="666"
Lanciate il comando /etc/init.d/udev restart
Prima di usare ISE, bisogna impostare delle variabili d’ambiente. Quindi andate nella cartella dove avete installato ISE e digitate
source settings.sh (per una shell bash)
A questo punto possiamo avviare ISE mediante il comando
ise
Tuttavia, quando chiudiamo la sessione le variabili d’ambiente spariscono, quindi bisogna settarle di volta in volta. Bisogna anche settare di volta in volta anche la variabile LD_PRELOAD che avevamo settato precedentemente per il cavo. Inoltre, siccome ISE ha l’abitudine di salvare le variabili d’ambiente nella directory corrente da cui viene lanciato, sarebbe meglio fare in modo che questa directory sia proprio quella di ISE. Pertanto ho creato il seguente script, che si occupa di fare tutto ciò:
#!/bin/sh
#set ISE directory, put here yours
XILINX_DIR=/home/l3golas/Xilinx92i
#switch to XILINX directory
cd ${XILINX_DIR}
#load environment variables and cable driver
source settings.sh
export LD_PRELOAD=/usr/local/lib/libusb-driver.so
#launch ISE!!!
ise
Inseriamo il suddetto codice in un file ise_launcher.sh, modifichiamo ovviamente la directory XILINX_DIR sostituendola con la propria e rendiamo il file eseguibile mediante il comando
chmod +x ise_launcher.sh
Creiamo un collegamento sul desktop a questo file in modo che, da questo momento in poi, potremo avviare ISE semplicemente da esso. E’ tutto.
Altri link da cui mi sono ispirato e su cui cercare ulteriori informazioni, ad esempio su altri tipi di cavo, sono i seguenti:
http://www.rmdir.de/~michael/xilinx/
https://wiki.kip.uni-heidelberg.de/KIPwiki/index.php/EDV:Xilinx-USB-Treiber
http://stefan.endrullis.de/en/xilinx_ise_8.2_ubuntu.html
Articolo scritto da L3golas.











dicembre 17th, 2007 at 09:40
ciao, grazie per la guida!!!
Rispondi
dicembre 30th, 2007 at 11:26
Ciao,
anche io, sono impegnato, con questa evaluation board.
Mi piacerebbe poter scambiare qualche
opinione; potrei avere la tua mail?
Gluca
Rispondi
febbraio 1st, 2009 at 04:12
Sure love google, very fine website.
Will read up and hopefully have something to post.
Cya later.
StiltsChickTracey
Rispondi