Sistemi Embedded
per il Mobile Multimedia
Tecnologie FPGA
Fabrizio Fazzino
Catania, 11/06/2007
Tecnologie FPGA
FPGA = “Field Programmable
Gate Array”
si potrebbe tradurre “matrice di porte
logiche programmabile sul campo”.
Si tratta di dispositivi digitali programmabili
dall'utilizzatore “sul campo”, ovvero “fuori
dalla fabbrica”.
Progettazione di un circuito
Un circuito elettronico digitale può essere
progettato in varie maniere, ad esempio
utilizzando un linguaggio di descrizione
dell'hardware (come VHDL, Verilog o
SystemC) oppure direttamente tramite un
programma di schematic entry con il
quale il progettista unisce direttamente tra
loro i componenti discreti utilizzando un
apposito programma di CAD.
Implementazione di un circuito
Ovviamente uno dei passi successivi alla
progettazione di un circuito riguarda la sua
implementazione fisica.
Questo solitamente è un passo che richiede
investimenti ingenti in quanto bisogna
ricorrere ad una apposita fabbrica (detta
fab o foundry) che implementi il circuito
su un chip di silicio.
Implementazione Standard Cell
L'implementazione fatta in una wafer fab da
un produttore di semiconduttori viene detta
Standard Cell o ASIC.
Standard cell si riferisce al fatto che quando
il designer si trova ad effettuare la sintesi
logica del circuito che ha progettato deve
utilizzare la libreria di componenti
standard che gli è stata fornita da chi
dovrà implementare il design. Questa
libreria contiene la descrizione di tutte le
porte logiche (AND, OR...) che il design su
silicio potrà utilizzare.
Tecnologie Standard Cell
Anche a parità di produttore esistono
librerie differenti in base alla tecnologia da
usare e alle caratteristiche richieste dal
design (bassi consumi, alte prestazioni
o un giusto compromesso tra le due).
Ad esempio ST nel corso degli anni ha fatto
riferimento alle tecnologie da 0.50, 0.35,
0.25, 0.18, 0.13um e 90nm come HCMOS 5,
6, 7, 8, 9 e 10, con le varianti relative ai
consumi e alla velocità.
Tecnologie ASIC
Il termine ASIC si riferisce invece al campo
di applicazione del prodotto:
ASIC = Application Specific Integrated
Circuit
Ci sono aziende che si occupano solo della
progettazione dei circuiti digitali (aziende
fabless), aziende che si occupano solo
dell'implementazione fisica (i principali sono
TSMC e UMC) ed aziende che si occupano
di entrambi gli aspetti (Intel, AMD, Texas
Instruments, STMicroelectronics).
Svantaggi degli ASIC
Le tecnologie Standard Cell permettono di
implementare un ASIC con un costo per
chip bassissimo, sull'ordine di grandezza del
dollaro.
Però hanno alcuni grossi svantaggi:
●il ciclo di progettazione e produzione è
abbastanza lungo;
●se si trova un bug dopo avere prodotto un
chip non è possibile correggerlo;
●ci sono dei costi iniziali (NRE) che per
tecnologie da 90nm possono raggiungere
un milione di dollari (1,000,000 US$).
Alternative FPGA
A causa degli svantaggi indicati prima, in
alcuni casi per l'implementazione ci si può
rivolgere alle tecnologie FPGA, che infatti:
hanno un ciclo di progettazione molto
veloce;
●utilizzano un approccio riprogrammabile e
quindi permettono la correzione di
eventuali bug;
●hanno un costo iniziale pressoché nullo.
●
Principio di funzionamento
Un dispositivo FPGA è un chip che contiene
un array di blocchi logici configurabili e dei
canali di routing.
Ogni singolo blocco logico contiene una
Lookup Table (LUT) a 4 ingressi ed un
Flip-Flop: l'unica uscita può quindi essere
l'uscita registrata o non registrata della
LUT:
Routing negli FPGA
Quindi tutto quello che manca per
realizzare un qualunque circuito digitale è
semplicemente l'interconnessione tra tutti
questi blocchi logici disponibili sul
dispositivo: questa interconnessione può
essere codificata sotto forma di una
sequenza di bit (bitstream) che viene
introdotta serialmente dopo il reset e va a
programmare gli switch presenti nel
dispositivo.
Switch negli FPGA
Infatti i 4 ingressi della LUT di ogni blocco
logico sono disposti sui 4 lati del blocco, ed i
segnali che uniscono tra loro i vari blocchi
confluiscono in alcuni switch la cui tabella
di routing statico può essere programmata
in binario:
Principali produttori di FPGA
I principali player del fiorente mercato degli
FPGA sono Xilinx e Altera, ma ci sono
molti altri produttori che realizzano
dispositivi specializzati in alcuni campi
specifici.
Famiglie di FPGA
Ogni produttore è in grado di offrire diverse
famiglie di prodotti con caratteristiche
completamente diverse sia dal punto di
vista delle prestazioni che dei costi.
Attualmente le famiglie di punta dei due
principali produttori sono Virtex-5 di Xilinx
e Stratix-III di Altera.
Invece le famiglie più economiche sono
Spartan-3 di Xilinx e Cyclone-III di Altera.
Principali utilizzi degli FPGA
Famiglie di prodotti differenti vengono
utilizzati per applicazioni diverse.
I prodotti di punta possono avere un costo
intorno ai 1000$ per pezzo, quindi vengono
utilizzati quasi esclusivamente per
realizzare prototipi di chip che poi
verranno implementati in serie come ASIC.
I dispositivi economici (50$-100$) possono
invece essere utilizzati anche per prodotti
riprogrammabili rivolti al mercato.
Limitazioni degli FPGA
A causa della tecnologia utilizzata i
dispositivi FPGA dispongono di alcuni
svantaggi rispetto alla controparte ASIC:
occupano più area (visto che la logica
presente non è ottimizzata per la
particolare applicazione) e dissipano più
potenza (circa 10 volte tanto), quindi non
possono essere utilizzati in dispositivi mobili
alimentati a batteria; inoltre anche le
frequenze di funzionamento sono
molto più basse (circa 10 volte, es. 50
Mhz contro 500 MHz).
Differenza tra classi di prodotti
La principale differenza tra i dispositivi
FPGA di fascia bassa e quelli di fascia alta è
data dalla quantità di blocchi logici
configurabili presenti sul dispositivo.
Ad esempio riguardo ai dispositivi Xilinx:
●i dispositivi della serie Spartan-3E
dispongono di un numero di LUT che va
da 2K a 30K;
●invece i dispositivi della serie Virtex-5
dispongono di un numero di LUT che va
da 20K a 200K.
Software EDA
In compenso il software utilizzato per il ciclo
di progettazione degli FPGA è molto più
economico della controparte ASIC (1000$
contro i 100'000$ per una licenza
Synopsys).
Esistono addirittura due tool gratuiti forniti
direttamente dai produttori di dispositivi:
●Xilinx ISE WebPack (per Linux e
Windows);
●Altera Quartus (solo per Windows).
ASIC vs. FPGA
In definitiva la progettazione ASIC e quella
FPGA coprono esigenze molto diverse:
ASIC ha costi iniziali molto elevati, sia per
le licenze che per le maschere (NRE) e
tempi di sviluppo molto lunghi; in compenso
ogni chip avrà costi di produzione e
consumi molto bassi;
FPGA ha costi iniziali quasi nulli e tempi di
progettazione ridotti, ma ogni singolo
dispositivo può costare centinaia di dollari e
dissipare molta potenza.
Development Board
Verrà adesso mostrato un esempio di
progettazione digitale utilizzando la
tecnologia FPGA.
Poiché non è pensabile iniziare costruendo
tutta una scheda su circuito stampato
(PCB, Printed Circuit Board) si inizierà
selezionando una delle tante schede
presenti in commercio che integrano già un
chip FPGA: tali schede si chiamano
Development Board.
Spartan Starter Kit
La development board più diffusa è il
cosiddetto Spartan 3E-500 Starter Kit da
149$, che integra un FPGA da 10K LUT.
Questo dispositivo non è in grado di
implementare microprocessori molto
complessi ma può contenere un
microcontrollore ed alcune periferiche.
La scheda dispone inoltre di vari tipi di
memorie ed alcune interfacce.
Aspetto della board
Memorie presenti sulla board
Intel StrataFlash 128 Mbit (memoria
Flash con interfaccia byte-wide da 16
MByte)
●STMicroelectronics SPI Flash 16 Mbit
(memoria Flash con interfaccia seriale da 2
MByte)
●Micron Technology 512 Mbit DDR
SDRAM (memoria DDR a 16 bit da 64
MByte)
●
Sulla board è inoltre presente una ulteriore
memoria Flash di Xilinx ma può essere
utilizzata solo per contenere il bitstream.
Altre interfacce on-board
La board include inoltre:
un display LCD con due righe da 16
caratteri ciascuna;
●una uscita VGA;
●due porte seriali RS-232;
●una porta PS/2 per mouse o tastiera;
●una porta FastEthernet 10/100 con
incluso un chip PHY (physical layer);
●quattro pulsanti ed una manopola.
●
Esempio “Hello World”
Come esempio di utilizzo della board verrà
progettato un piccolo blocco VHDL in grado
di scrivere sul display LCD presente sulla
board la frase desiderata (ad esempio
“Hello” o “Ciao”).
Per prima cosa bisogna prendere il manuale
della board all'indirizzo
http://www.xilinx.com/bvdocs/userguides/ug230.pdf
e studiare le specifiche del display LCD.
Interfaccia del display LCD
Intanto bisogna vedere l'interfaccia tra il
dispositivo FPGA e il display LCD:
Entità VHDL
Il blocco VHDL da implementare sull'FPGA si
dovrà interfacciare con i pin di top-level del
display LCD.
In base al manuale la descrizione dell'entità
sarà la seguente:
entity hello is
port (
clock: in std_logic; ­­ Clock di sistema
lcd_d : inout std_logic_vector(7 downto 4); ­­ 4­bit di dati in/out
lcd_rs : out std_logic; ­­ Register Select (0=config, 1=dati)
lcd_rw : out std_logic; ­­ Read/Write (1=read, 0=write)
lcd_e : out std_logic ­­ Enable (abilita tutti gli altri segnali)
);
end hello;
Protocollo di comunicazione
Come si vede l'interfaccia di comunicazione
tra l'FPGA e il display LCD dispone di un
bus dati di soli 4 bit, quando la
trasmissione del codice ASCII di ogni
carattere ne richiede il doppio.
Di conseguenza per scrivere un byte di dato
o di configurazione nella memoria del
display LCD il relativo byte va spezzato in
due nibble da scrivere separatamente,
prima il nibble alto (bit 7...4) e poi il nibble
basso (bit 3...0).
Sequenza di passi
1) all'inizio mando segnali validi tra i quali
sul bus dei dati LCD_D il nibble alto, ma con
LCD_E disabilitato
2) dopo 2 cicli attivo LCD_E portandolo a 1
3) dopo altri 12 cicli disabilito LCD_E
riportandolo a zero
4) dopo 1 altro ciclo posso rimuovere i
segnali validi dai bus (opzionale)
5) aspetto 50 cicli
6) ripeto i passi 1-4 per il nibble basso
7) aspetto 2'000 cicli
8) ripeto i passi 1-7 per un altro carattere o
byte di configurazione
Comando “Clear Display”
All'accensione del dispositivo ed ogni qual
volta si voglia cancellare il display della
board è necessario inviare all'LCD un
comando “Clear Display”.
Solo in questo caso al passo 7 non bisogna
aspettare 2'000 cicli ma bensi' 82'000 per
dare il tempo al display LCD di
sovrascrivere con spazi tutti i caratteri.
Architettura VHDL
Posso ora scrivere l'architettura VHDL del
mio blocco in modo da rispettare le
temporizzazioni previste dal manuale.
Per mantenere semplice l'esempio si
utilizzerà un semplice contatore ed i vari
segnali verranno assegnati sulla base del
contatore globale.
Da notare che a parte il clock il nostro
blocco non ha ingressi, se volessimo gestire
anche i pulsanti della board la logica
sarebbe senz'altro stata più complessa.
Comando “Clear Display” in
VHDL
case counter is
­­ LCD_D=0000­0001, LCD_RS=0, LCD_RW=0, LCD_E=0­1­0
when 2000 =>
lcd_d <= "0000"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '0';
when 2002 =>
lcd_d <= "0000"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '1';
when 2014 =>
lcd_d <= "0000"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '0';
when 2100 =>
lcd_d <= "0001"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '0';
when 2102 =>
lcd_d <= "0001"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '1';
when 2114 =>
lcd_d <= "0001"; lcd_rs <= '0'; lcd_rw <= '0'; lcd_e <= '0';
Comando “Write Data” in VHDL
­­ LCD_D=DDDD­DDDD, LCD_RS=1, LCD_RW=0, LCD_E=0­1­0
when 85000 =>
lcd_d <= ASCII_CMAIUSC(7 downto 4);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '0';
when 85002 =>
lcd_d <= ASCII_CMAIUSC(7 downto 4);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '1';
when 85014 =>
lcd_d <= ASCII_CMAIUSC(7 downto 4);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '0';
when 85100 =>
lcd_d <= ASCII_CMAIUSC(3 downto 0);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '0';
when 85102 =>
lcd_d <= ASCII_CMAIUSC(3 downto 0);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '1';
when 85114 =>
lcd_d <= ASCII_CMAIUSC(3 downto 0);
lcd_rs <= '1'; lcd_rw <= '0'; lcd_e <= '0';
Comando “DD RAM Address”
Normalmente i caratteri vengono scritti in
sequenza: ma in ogni momento è possibile
selezionare in quale posizione andare a
scrivere specificando il corrispondente
indirizzo della Display Data RAM:
LCD_D=1AAA­AAAA
LCD_RS=0
LCD_RW=0
LCD_E=0­1­0
dove AAA-AAAA corrisponde in binario
all'indirizzo 0x40 se si vuole andare al
primo carattere della seconda riga.
File UCF
Prima di passare all'ambiente integrato di
sviluppo è necessario predisporre anche un
altro file, detto file UCF (User Constraint
File). Questo file tra le altre cose creerà il
mapping tra i nomi che noi abbiamo
assegnato ai pin di top-level del nostro
blocco ed i veri nomi dei piedini dell'FPGA.
Per fortuna poiché abbiamo acquistato una
board già pronta tutti gli altri constraint per
ogni piedino possono essere semplicemente
copiati dal manuale.
Esempio di file UCF
#
# File dei constraint dell'esempio 'hello' per lo Xilinx Spartan Starter Kit
#
# Utilizza il clock cablato di 50MHz
NET "clock" PERIOD = 20.0ns HIGH 50%;
NET "clock" LOC = "C9" | IOSTANDARD = LVTTL;
# Mapping delle porte dell'entita' ai pin effettivamente connessi all'LCD
NET "lcd_rs" LOC = "L18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_rw" LOC = "L17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_e" LOC = "M18" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_d<4>" LOC = "R15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_d<5>" LOC = "R16" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_d<6>" LOC = "P17" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
NET "lcd_d<7>" LOC = "M15" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 2;
Ambiente integrato ISE
Utilizzando solo i due file hello.vhd e
hello.ucf sarà possibile mappare il blocco
sullo Starter Kit e fare apparire la scritta sul
display.
Tutto quello che serve sono un cavo USB
(per connettere la board al proprio PC) e
l'ambiente integrato ISE di Xilinx, la cui
versione WebPack è liberamente scaricabile
dal sito www.xilinx.com (le dimensioni
attuali sono di 1.4 GByte).
ISE WebPack per Linux
L'unica differenza tra la versione Linux e
quella Windows è che nella prima
l'installazione del driver che serve alla
programmazione della board potrebbe
risultare problematico; comunque l'ex
studente Giacomo Fazio ha scritto una
esauriente guida all'installazione dei driver
Linux all'indirizzo
http://www.intilinux.com/howto/478/u
sare­le­board­xilinx­fpga­su­linux/
Creazione progetto ISE
In entrambe le versioni il progetto si crea da
File | New Project...
e assegnando un nome (es. “hello”) al
progetto; il top-level è di tipo HDL.
Selezione del dispositivo
Aggiunta dei file al progetto
Dopo avere selezionato il dispositivo in uso
sullo Spartan-3E 500 Starter Kit tra tutti i
dispositivi Xilinx disponibili (come mostrato
nella diapositiva precedente) bisogna
saltare la finestra “Create a New
Source” e passare direttamente alla
finestra di dialogo “Add Existing
Sources”, dove potremo aggiungere i
nostri due file e confermare.
Avvio del mapping
Conclusione del mapping
Dopo alcuni secondi il mapping, ovvero la
sequenza dei processi di sintesi,
implementazione e creazione del bitstream,
si concluderà con successo:
Come mostrato dal report
alla pagina successiva, il
nostro blocchetto occuperà
solo l'1% delle LUT
disponibili:
Programmazione della board
Ora non ci resta che programmare la board
utilizzando il tool offerto sempre da ISE,
chiamato iMPACT:
Catena di dispositivi JTAG
iMPACT ci presenterà la catena di dispositivi
presenti sulla board programmabili tramite
l'interfaccia JTAG:
Il dispositivo che ci interessa è xc3s500e
(codice di Spartan-3E 500), quindi
assegneremo a questo il nostro bitstream
hello.bit e poi con il tasto destro
selezioneremo “Program...”.
Se tutto va bene...
...sulla nostra board dovrebbe apparire...
Conclusioni
Questa presentazione è dunque servita a:
1) descrivere i campi di applicazione
delle tecnologie FPGA;
2) spiegare per sommi capi le modalità di
funzionamento;
3) mostrare un semplicissimo esempio
VHDL dalla specifica funzionale fino
all'esecuzione sulla board.
Possibili sviluppi
Per realizzare un programma interattivo
oltre all'output serve anche la gestione
dell'input.
Su questo argomento già nello scorso A.A.
sono state sviluppate diverse tesine,
compresi alcuni videogiochi (es. il “Gioco
delle Tre Carte”).