Con questa articolo si vuole dare una breve descrizione dell'architettura interna di una FPGA. Cercare di capire quali sono i pregi e i difetti di questo strumento digitale anche attraverso alcuni esempi veramente banali, che secondo me, sono molto utili alla comprensione del problema. Oltre a questo verrà descritta la miniboard che ho a disposizione per eventuali prove.
Cos’è una FPGA
L'FPGA (Field Programmable Gate Array) è un circuito integrato che contiene un vasto numero di blocchi logici configurabili (Configurable Logic Blocks, CLB) al suo interno. Questi blocchi logici possono essere interconnessi tra di loro al fine di sintetizzare qualsivoglia circuito logico mediante linguaggi di descrizione dell’hardware (Hardware Description Language, HDL) come il VHDL o il Verilog o anche attraverso un approccio "schematic-entry", in pratica attraverso l'utilizzo di un CAD. Questi dispositivi possono essere programmati (e/o riprogrammati) sul campo un numero infinite (teoricamente) di volte.
Vengono utilizzati principalmente per lo sviluppo di rapidi prototipi, ad esempio per lo sviluppo di microprocessori. Alcune caratteristiche di queste FPGA:
- hanno un elevatissimo numero di CLB migliaia;
- è solitamente presente della RAM al suo interno;
- hanno alcuni blocchi destinatati all’I/O.
Come si può notare dalla figura 1, la struttura interna di una FPGA è costituita da dei blocchi I/O che permettono la gestione degli ingressi e delle uscite in formato esclusivamente digitale, e poi si può notare la fitta rete di interconnessioni tra le varie celle logiche. Molte celle logiche, al loro interno, possono contenere elementi di memoria quali potrebbero essere ad esempio dei semplici flip-flop.
Un problema che affligge questi SOPC (System On-a-Programmable-Chip) è rappresentato dai ritardi intrinseci dei segnali interni all’FPGA. Mi spiego meglio con un esempio: supponiamo di programmare l’FPGA in modo tale da fargli fare un semplice operatore logico AND; abbiamo quindi bisogno di almeno due segnali di ingresso e uno di uscita. Supponiamo che i due ingressi siamo il PIN1 e quello diametralmente opposto il PIN100 ad esempio. L’uscita la impostiamo sul PIN120. Una volta scritto il programma l’FPGA si configura nel modo mostrato in fig. 1.1
Guardando la figura 1.1 si nota fin da subito che il percorso che compie il segnale che entra nel PIN1 è molto più lungo del segnale che entra dal PIN100. Tenete presente che di CLB ce ne sono migliaia (possono arrivare tranquillamente a 60000 celle logiche e anche molte di più). Questo comporta ad avere un errore che cercherò di descrivervi con questo grafico.
Con riferimento alla figura 1.2 si osserva che se il Pin1 e il pin100 sono a livello logico basso (0) allora il Pin120 anche è basso, ma si osserva che tra gli istanti di tempo t1 e t2 dove sia il pin1 e il pin100 sono a livello logico alto il pin 120, cioè l’uscita, non è alta: questo è un errore! E’ causato dal fatto che il segnale Pin1 ha un ritardo, nel senso che impiega più tempo ad arrivare alla CLB, configurato come AND.
Ovviamente il programmatore, che è intelligente, non va a programmare la cella logica CLB rappresentata in fig. 1.1, ma va a programmare una cella logica che si trova in una posizione intermedia tra i due ingressi, in modo tale da minimizzare i tempi di propagazione interni dei due segnali di ingresso.
La piccola evaluation board Cyclone II
Ho a disposizione una piccola evaluation board con la quale mi diverto, a livello hobbistico, a costruire dei piccoli circuiti logici. La scheda è quella mostrata in fig. 2 equipaggiata con una FPGA Altera Cyclone II EP2C5T144C8N e con una piccola EEPROM (EPCS4) destinata al mantenimento del codice interno alla FPGA una volta tolta l’alimentazione della scheda.
Questa piccola scheda acquistabile su ebay al prezzo di circa 30€ (compreso del programmatore USB-Blaster) è molto ben strutturata. Infatti vedendo lo schematico [1] si nota che sono presenti due regolatori di tensione, uno per generare i 3.3 V (VCCIO1,VCCIO2,ecc.) necessari all’alimentazione dei diversi banchi di cui è costituita questa FPGA, e un altro regolatore al fine di avere 1.2 V (VCCINT) per l’alimentazione dei circuiti interni della FPGA. Tutto questo in accordo con le direttive imposte dalla casa costruttrice del chip Altera [2]. Inoltre è presente un piccolo Led che ci segnala la presenza dell’alimentazione.
Oltre a questi elementi, ci sono anche a nostra disposizione i due stadi per configurare questa FPGA. In particolare abbiamo due modi per configurarla
- JTAG: il programma rimane in memoria fintanto che l’FPGA è alimentata;
- AS (Active Serial): il programma viene passato all’intenro di una memoria EPCS4 e una volta che l’alimentazione ritorna l’EPCS4 programma in automatico l’FPGA.
Questi stadi sono mostrati qui di seguito
Infine abbiamo un clock a 50 MHz a nostra disposizione nel PIN17 della nostra FPGA.
Oltre a questi componenti sulla piccola schedina ci sono a disposizione 3 piccoli LED ed un tasto. Spendo due parole per questo tasto in quanto è semplicemente collegato tra massa e il PIN144 (l’ultimo) della mia scheda. Quindi questo tasto, quando è premuto, il PIN144, che andremo a configurarlo come ingresso, vedo un bit basso, mentre quando il tasto non è premuto, sempre il medesimo pin vede alta impedenza.
Ovviamente ho tutti i pin destinati all’I/O a mia disposizione a parte quelli già usati all’interno della scheda. Ora che abbiamo un quadro generale della scheda che ho a disposizione passiamo alla programmazione!