Sei sulla pagina 1di 29

1) Introduzione: sistemi elettronici

Microcontrollore e microprocessore

Un microcontrollore è un dispositivo elettronico integrato su un singolo chip, genericamente utilizzato per


sistemi embedded, ovvero sistemi integrati completamente custom per cui non è prevista una possibilità di
configurazione da parte dell’utente (sistemi special purpose).

Un microcontrollore viene impiegato in sistemi (o più parti di essi) che non richiedono grandi risorse di
calcolo; possiede tutto ciò che è utile al suo funzionamento al suo interno, non necessita perciò di alcuna
risorsa esterna.

Queste ultime due caratteristiche sono proprio le differenze tra microprocessore e microcontrollore.

Funzionamento tipico di un microcontrollore: Fetch, Decode, Execute, e cosa fondamentale è che nei
microcontrollori non ci può essere alcun parallelismo.

Altro aspetto è la ridotta velocità di lavoro nell’elaborazione di un volume di dati piuttosto consistente.

Punti sicuramente a favore sono:

1. Bassa dissipazione di potenza;


2. Prezzo inferiore rispetto a microprocessori custom che potrebbero svolgere lo stesso compito.
Tuttavia, il prezzo inferiore rispetto ad un microprocessore custom paga in termini di efficienza: il
microcontrollore ha più probabilità di errore rispetto al microprocessore custom.

Un microprocessore è invece sicuramente più incline ad elaborare volumi più consistenti di dati, ma
chiaramente per fare ciò impiega risorse esterne (temporizzazione, memoria, periferiche I/O…).

È sicuramente più efficiente, può prediligere (se l’applicazione lo premette) un’esecuzione di tipo pipeline,
e sicuramente un certo guadagno in termini di velocità rispetto ad un microcontrollore.

NB: Nel funzionamento parallelo dei cicli fetch, decode, execute non c’è mai una sovrapposizione non
coerente.

Esempio:

Quindi per un microprocessore è possibile sia un ciclo di processazione parallelo che sequenziale.

La coerenza nel parallelismo introdotto dalla pipelined execution sta nel fatto che una nuova istruzione
viene prelevata quando la precedente è stata già prelevata.
PROCESSORI ASIC (Application specific integrate circuits)

Questi non sono circuiti integrati standard, vengono piuttosto progettati per applicazioni d’uso specifiche.

I processori ASICs sono processori special purpose, il che li rende piuttosto efficienti e veloci rispetto ai
processori general purpose. Chiaramente questa efficienza legata alla velocità è rispecchiata da un costo
più elevato per questa tipologia di processori, costo che cresce al rimpicciolire della circuiteria (in termini di
nm).

FPGA (Field Programmable Gate Array)

Nascono negli anni ’80 da Xilinx ed Altera (con sistemi di sviluppo molto simili), quest’ultima viene
incorporata da Intel nel 2015, tutt’oggi Xilinx ed Altera si dividono principalmente il mercato. Esistono
diverse tipologie di FPGAs: una forte distribuzione tra le varie tipologie (caratterizzante di fatti) è sulla
riconfigurabilità del FPGA.

Di fatto distinguiamo tra dispositivi FPGA OTP (One time programming) che non consentono una
riconfigurazione: Atifuse; e dispositivi FPGA basati su una tecnologia SRAM, riconfigurabili ad ogni
accensione vista la volatilità della memoria impiegata.

Altro tipo di tecnologia FPGA è basata sulla memoria FLASH, anche questa riconfigurabile ma sicuramente
meno efficace di una RAM.

NOTA:

• Tecnologie SRAM -> riprogrammabili e volatili;


• Tecnologie Antifuse -> non riprogrammabili e non volatili;
• Tecnologie FLASH -> una via di mezzo.

Esistono altre tipologie di FPGA, in base al tipo di memoria di cui fanno uso: E2PROM, ROM, EPROM, PROM,
tuttavia queste sono ormai in disuso.
2) FPGA (Field Programmable Gate Array)
Composizione di un FPGA

1) CLB: Configurable logic Blocks: Sono di fatto il cuore dell’FPGA, vengono configurati per
svolgere determinate funzioni Hardware, dalle più semplici operazioni (combinatorio)
booleane, alle più complesse;
2) I/O Blocks: Blocchi configurabili, tramite la cui configurazione si definisce sia la direzione della
comunicazione, sia il tipo di comunicazione (IN o OUT);
3) Block RAMs: Blocchi di memoria RAM posti sul chip stesso, quindi viene proprio sfruttata dalle
strutture di quest’ultimi che lo richiedono;
4) Routing sources: Tra tutti i CLB sono poste una serie di linee, sia in verticale che in orizzontale,
queste sono le interconnessioni o altresì instradazioni. È dunque possibile mettere in
comunicazione i vari CLBs attraverso le instradazioni, ed è su queste ultime che sono presenti
dei Programmable Switch Matrix Blocks, questi blocchi sono composti da mosfet in
configurazione struttura di memoria; quindi, questa configurazione consente di arginare il
problema di alimentazione.

Limiti dell’FPGA con tecnologia RAM Based ed altre tipologie di FPGA possibili

Sicuramente il limite dell’FPGA con blocchi RAM deriva dal tipo di memoria stessa: la volatilità. Ciò significa
che se il chip viene disalimentato, alla successiva alimentazione dovrà essere riconfigurato, e chiaramente
la riconfigurazione richiede del tempo.

Alternative alle tecnologie RAM Based sono le FPGA Flash e le Antifuse.

La tecnologia flash impiega i flash transistor (ovvero transistor a floating gate), quindi se il circuito viene
disalimentato il contenuto della cella flash non viene perso. Altresì è anche possibile riconfigurare la cella
flash.

Altra tecnologia alternativa quanto a non volatilità, ma ricordiamo anche non riconfigurabilità, è la
tecnologia Antifuse, per altro molto utilizzata in ambito aerodinamico (per impedire che agenti esterni
causino il cambiamento di stato di qualche cella di memoria, compromettendo di fatto il corretto
funzionamento del dispositivo che le impiega).

• Design flow
È estremamente
importante, non
che indispensabile
creare un
testbench che
riesca, testando, a
verificare
l’affidabilità
dell’architettura.
• Simulation flow
1. Behavioural simulation: detta anche RTL simulation, è una simulazione del tutto astratta
(senza alcun significato fisico, con l’intento di verificare che il codice HDL rispetti
perlomeno l’intento logico per cui è stato scritto;
2. Functional simulation (post sintesi): verifica la funzionalità dopo che il codice è stato
sintetizzato: ulteriori informazioni relative agli oggetti che l’ambiente di sviluppo intende
utilizzare (in una prima fase) per realizzare ciò che il codice descrive. In particolare, il
sintetizzatore produce una netlist, ovvero una lista di primitive configurate in modo
appropriato. Quindi in questo tipo di simulazione il codice acquisisce un senso fisico;
tuttavia, non tiene ancora in considerazione il timing.
3. Timing simulation (post implementazione): è la simulazione più precisa, che tiene
conto dei ritardi del circuito fisico, per tale motivo richiede tempi di elaborazione
maggiori.
• Sintesi: È una fase progettuale fondamentale:

VHDL → netlist

Durante la sintesi, il codice inizia ad assumere senso fisico (hardware), le funzioni logiche descritte
in HDL vengono sintetizzate in una netlist come un insieme di primitive. La netlist non solo fornisce
l’insieme di primitive, ma anche l’informazione sulla loro interconnessione.

La sintesi viene realizzata da un sintetizzatore (un software), che appunto traduce in netlist il codice
VHDL.

Questa fase è molto importante anche perché può rilevare problemi a cui prestare attenzione che
non possono essere rivelati in fase di analisi behavioral: bisogna sempre prestare una certa
attenzione sui messaggi di warning comunicati dal sintetizzatore.

- Constraint: vincoli che si desidera imporre al circuito, sia in merito temporale, sia fisico, da
imporre eventualmente in fase di sintesi.
• Implementazione: Il processo di implementazione viene svolto dai produttori stessi del chip e
consta in sostanza in tre fasi:
1. TRANSLATE: raggruppa più file di design in una singola netlist, ovvero in una raccolta di
oggetti per la realizzazione fisica del dispositivo;
2. MAP: raggruppa simboli logici della netlist in componenti fisici. Si stabilisce di fatto il
numero di risorse fisiche occorrenti (che in un FPGA non sono infinite chiaramente),
vengono quindi raggruppate le funzioni logiche nei blocchi a disposizione (SLICE ed I/O
BLOCKS);
3. PLACE AND ROUTE: piazzamento/configurazione finale dei componenti sul chip e relative
interconnessioni/instradazioni tra essi. Infine, estrazione dei report di timing (che quindi
tengono contro anche del route).
• Configurazione: una volta che il design è stato implementato occorre un file che l’FPGA riesca ad
interpretare, questo file è detto bit-stream (con estensione .bit). In alcuni casi potrebbe rendersi
necessario il supporto di una memoria PROM in cui viene caricato il bit-stream (anziché
direttamente sull’FPGA) e quindi quest’ultimo viene caricato sull’FPGA ad ogni alimentazione dello
stesso.
3) Virtex II (Xilinx)
La famiglia Virtex II è una piattaforma FPGA sviluppata per alte performance, per design da bassa ad alta
densità su IP-Core o moduli custom.

La Virtex II è caratterizzata per alte performance con bassi consumi di potenza, comprende 11 membri: da
4k a 8M di gates.

• Packaging
Vengono utilizzate due tipologie di interconnessione:
- Wire bond: classicamente a filo metallico;
- Flip chip: tecnologia che consente più interconnessioni rispetto alla wire bond; consiste nel
piazzare delle sfere (conduttrici) alle estremità del chip. Queste vengono poi fuse in forni
appositi realizzando la giunzione. Questo tipo di tecnologia è preferibile sia in termini di
numero di interconnessioni che è possibile realizzare, sia per la maggiore velocità di
trasmissione del segnale elettrico.
• Struttura
La logica interna programmabile prevede in sostanza quattro elementi basilari:
1) CLBs (Configuation Logic Blocks): forniscono gli elementi funzionali per la logica combinatoria e
sequenziale, includendo elementi di storage elementari;
2) Blocchi Select Rom, da 18k bits;
3) Blocchi moltiplicatori (18x18 bits);
4) DCM (Digital Clock Manager): blocchi che provvedono autonomamente alla calibrazione del
segnale di clock.

Una nuova generazione di risorse di routing programmabili è la Active Interconnect Tecnology, che
interconnette tutti gli elementi (1, 2, 3, 4) attraverso una Switch Matrix, ovvero una matrice di
interconnessioni programmabili. Questo semplifica di molto le interconnessioni tra i vari blocchi (di
diversa natura) del chip.

Tutti gli elementi programmabili, incluse le risorse di routing tra elementi, sono controllati dai
valori caricati in memoria durante la fase di configurazione (chiaramente tutto può essere
riconfigurato).

CLBs

Ogni CLB è composto da quattro slice


equivalenti e da due Buffer 3-state.

Ogni slice contiene:

• Due generatori di funzione (F e G);


• Due elementi di memoria (due
registri/due latch);
• Gates logico-aritmetiche;
• Gate OR;
• Multiplexer;
• Catene per la propagazione veloce
del riporto (fast carry chain → cuore
degli elementi ausiliari di calcolo).

Evidenziati sono i componenti ausiliari di calcolo


I CLBs sono organizzati in array e vengono impiegati per costruire un design combinatorio e sincronizzato.
Ogni CLB è collegato ad una Switch Matrix.

Le slice sono suddivise in due colonne (ogni colonna con due slice), con due catene di riporto indipendenti
ed una condivisa (shift).

Ogni slice presenta collegamenti bidirezionali:

- Da e verso Switch Matrix (per collegamenti con altri elementi);


- Da e verso slice vicine (quindi CLB diversi connessi), questi sono
collegamenti veloci.

Ogni slice è configurabile come:

• LUT a 4 input, quindi 16 possibili output;


• Shift Register a 16 bit;
• SRAM distribuita a 16 bit.

È bene osservare che l’uscita del function generator non solo è l’uscita
della slice, ma è anche l’ingresso dell’elemento di memoria.

1) Function generator configurato come LUT 4:1


I quattro bit in ingresso, sul bus asincrono (A1, A2,
A3, A4), vengono utilizzati come indice di lettura della
LUT 4:1 (ricordiamo infatti che la LUT è una tabella di
verità con tutte le possibili uscite che possono
produrre 4 ingressi combinati tramite qualsiasi
funzione booleana, indipendentemente dalla
complessità della stessa);
2) Registri
Gli elementi di memoria possono essere configurati
sia come Latch che come Flip-flop e possono avere
segnati di set e reset, sia sincroni che asincroni.
Dunque, in presenza di uno statement combinatorio
il sintetizzatore configurerà i function generator
come LUT 4:1.
3) Function generator configurato come memoria SRAM distribuita (16x15)
Anzitutto la memoria, function generator configurabile come tale, viene definita distribuita proprio
perché è possibile creare due memorie da 16 bit in ogni slice di ogni CLB, spargendo di fatto i vari
elementi di memoria sul chip.
a. Scrittura:
La scrittura è un’operazione sincrona, il che significa
che si avrà un’operazione di scrittura nella memoria
quando vi sarà un segnale, di abilitazione di fatto, dalla
linea di strob (prevalentemente dallo strob generator).
Il dato verrà scritto quindi in memoria attraverso
l’ingresso DI ed all’indirizzo specificato dal bus
sincrono WG[4:1].
b. Lettura:
La lettura è invece l’operazione non sincrona, quindi quando lo strob è basso si legge il dato
specificato dall’indirizzo presente sul bus asincrono A[4:1] e lo si manda in uscita sulla linea
D.
È evidente, perciò, che la linea D di uscita sia la linea su cui transita il dato che viene letto
dalla memoria. Tuttavia, questo potrebbe essere non vero, in molti casi infatti si mettono a
contatto il bus asincrono e quello sincrono, avendo di fatto un unico bus indirizzi. Ciò
significa che l’uscita D non è soltanto movimentata dalla lettura: quando lo strob è attivo è
come se avessimo contemporaneamente una lettura e una scrittura, Eventualmente
volendo non vedere transitare le scritture in uscita si può aggiungere un registro (FFD) sulla
linea D di uscita, con il segnale di clock che è lo stesso dello strob generator.
Così facendo, siccome il registro mantiene il dato precedente, consente di non vedere
variazioni di scrittura.
Quella appena descritta è una SRAM a 16 posizioni x 1 singola porta.
• 32 x 1S
Per realizzare una SRAM Distribuita 32 x 1S (singola porta) si
utilizzano due LUT (2 x 16) ed uno strob generator.
Il dato arriva a entrambi i blocchi e stessa cosa dicasi per il bus
sincrono ed asincrono (collegati, quindi ad un unico bus che
arriva ad entrambi):
In un primo luogo il discriminante tra i due blocchi da 16 è il 5°
bit del bus asincrono (5 bit perché stiamo realizzando una
memoria a 32 bit). Il quinto bit va in ingresso allo strob
generator, quindi in base a questo bit lo strob manderà solo ad
uno dei due blocchi il segnale di abilitazione, quindi un solo
blocco tra i due, in dipendenza dallo strob sarà abilitato in
scrittura.
Sempre il 5° bit è il segnale di selezione sul multiplexer F5MUX, che ha come
ingressi le due uscite prodotte dai due blocchi. In dipendenza dal 5° bit verrà
selezionata solo una delle due uscite prodotte dai singoli blocchi. Evidentemente
per scrivere e leggere 32 bit si interroga prima un blocco e poi l’altro, non ci può
essere contemporaneità (far scrivere o leggere entrambi).
• 16 x 1D (Double port)
In questo caso il dato in ingresso arriva comunque ad entrambi
i blocchi. In un blocco il bus asincrono e quello sincrono sono
separati, nel secondo blocco sono collegati e corrispondono al
bus sincrono del primo blocco. In più ad ogni blocco
corrisponde uno strob generator, comandato dagli stessi
segnali. Questo si traduce nel fatto che quando arriva un
impulso di strob il dato viene scritto su entrambi i blocchi:
avviene di fatto una copia di scrittura. In lettura invece, date le
singole uscite ed i bus asincroni differenti (non collegati), è
possibile leggere in due locazioni di memoria differenti. Ciò
significa che una SRAM distribuita in generale non ammette
una scrittura contemporanea, ma ammette lettura
contemporanea introducendo dunque un parallelismo in
lettura.
Osservazione: Le memorie più convenienti sono i blocchi SRAM, che sono blocchi nativi a doppia porta e più
precisamente: TRUE DUAL PORT.

Significa che sono consentite due operazioni in contemporanea (chiaramente perché agiscono su locazioni
di memoria differenti se c’è un sincronismo) che siano due letture, due scritture, o una lettura e una
scrittura.

Per questo motivo sicuramente le block SRAM sono più convenienti della memoria distribuita guardando
all’efficienza. D’altro canto, però le BRAM sono interi blocchi da 18k bit, se tutto il blocco non viene
utilizzato lo spreco non è da poco. In tal senso, quindi, è più adeguato l’utilizzo delle memorie distribuite, le
quali comunque presentano uno svantaggio: la memoria, essendo distribuita sull’intero chip risente di
problemi derivanti dalle instradazioni: ritardi e dissipazione. In più la soluzione a memoria distribuita viene
a costare in termini di LUT
(16 bit richiedono 2 LUT per una dual port, 32 ne richiedono 4 – perché ogni blocco è comunque da 16 – e
via dicendo).

Ricapitolando:

- Function generator come LUT: 1 operazione da svolgere;


- Function generator come memoria: 2 operazioni da svolgere.
4) Function generator configurati come shift-register
In questo caso il dato entra sempre in prima posizione, una
volta riempite tutte le posizioni si passa alla linea MC15
(d’uscita). Da notare che non vi è alcuna necessità, in linea
di principio di utilizzare i bus sincroni e asincroni; tuttavia,
in alcuni casi potrebbe essere necessario comporre uno
shift register che non abbia piena profondità consentita
(128 posizioni nel caso dell’intero CLB); in questi casi si
utilizza il bus asincrono, sul quale si passa l’indirizzo
dell’ultima cella scelta del registro, quindi il contenuto
della cella transiterà sull’uscita D del function generator in
questione piuttosto che scorrere fino all’ultima posizione lungo la line
MC15.
A questo punto, un CLB conta 4 slice, e quindi 8 function generator
(ognuno da 16 bit) da poter configurare come shift register ecco quindi
perché 128 posizioni shift disponibili.
NB: la linea MC15 in uscita dal function generator precedente va in
ingresso come dato al function generator successivo.
Questo tipo di tecnologia è molto conveniente perché all’interno di una
slice i registri sono un numero limitato (2) e di conseguenza di un numero
limitato per ogni CLB (8).
Altri elementi della slice

1) MUXCY: Il selettore di questo multiplexer è l’uscita


del function generator quando questo viene configurato
come LUT, di fatto è come un segnale di propagate (una
XOR). Sulla linea/ingresso 1 del multiplexer ci sarà sempre il
carry in, in uscita del multiplexer ci sarà il carry out che
dipenderà dall’uscita della LUT chiaramente;
2) XORG: Ha come ingressi il carry in e l’uscita della
LUT; perciò, in uscita da questa porta XOR vi sarà la somma.

Mettendo in relazione i due elementi è evidente che si tratta


di un full-adder (con multiplexer).

Il discorso appena fatto per una slice (2 MUXCY e 2 XORG) vale chiaramente per tutte le slice di ogni CLB.
Per una slice singola è possibile produrre somme fino ad 8 bit (visto che ogni slice possiede 2 function
generator).

La linea che collega i vari MUXCY, ovvero l’uscita di quello inferiore all’ingresso di quello superiore nel
nostro caso è la FAST CARRY CHAIN (catena veloce del riporto). Queste catene del riporto sono catene
veloci perché non possiedono punti di interconnessione programmabili (PIPs) (ciò significa che non ci sono
pass transistor su questa linea, quindi niente accoppiamenti capacitivi né dissipazione). Questo tipo di
struttura è prettamente Ripple Carry, perciò visto che sono presenti corsie veloci in questa struttura,
proprio da produzione, qualsiasi altro sommatore richiederebbe di uscire da quello che è per natura
costruttiva il percorso più veloce, peggiorando quindi le prestazioni.

Somme di prodotti

Con l’ausilio della porta ORCY c’è la possibilità concatenare più operazioni tra slice, generando così anche
operazioni piuttosto complesse.

Prendendo ad esempio due CLB (per un totale di 4 colonne da 2 slice), la porta ORCY è una per ogni colonna
di 2 slice. In questo caso il MUXCY della fast carry chain è configurato in maniera particolare: con l’ingresso
0 a GND sempre, mentre sull’ingresso 1 c’è sempre l’uscita del precedente. Di fatto all’uscita di ogni MUXCY
superiore vi è una AND a 16 ingressi. Per 2 CLB abbiamo 16 MUCY e 4 ORCY e quindi:

< AND16 + AND16 + AND16 + AND16 >

È una funzione logica molto complessa realizzata solamente con MUXCY e le porte ORCY, senza impegnare
le LUT per svolgere la funzione logica.
Buffer 3-state

Un buffer 3-state è in buona sostanza un buffer con un terzo stato rispetto agli stati 0 e 1, quindi è un
inverter con tre possibili stati:

L’out z sta per “alta impedenza” e non dipende


minimamente dall’ingresso, l’effetto è quello di un
circuito aperto.

Ogni CLB, in un’architettura Virtex II è dotata di due buffer


3-state direttamente collegati con la Switch Matrix (per
l’ingresso).

Un tipico scenario di utilizzo dei buffer 3-state sono le


linee o connessioni orizzontali perché: supponiamo che
due sorgenti condividano la stessa risorsa di comunicazione, allora c’è bisogno di un buffer 3-state per
evitare che le due non vadano in conflitto sulla risorsa di comunicazione che condividono. Di fatti,
collegando sorgenti su una stessa linea tramite buffer 3-state possiamo garantire che le sorgenti lavorino
separatamente sulla linea.

Blocchi di I/O e DDR (Double Data Rate)

Gli I/O blocks sono direttamente affacciati alle switch matrix e


sono blocchi alternativi, ovvero se vengono utilizzati come IN
non possono essere utilizzati come OUT.

Sono composti da tre coppie di registri:

1) Una per l’input;


2) Una per l’output;
3) Una per controllare il buffer 3-state in maniera alternata.

Si utilizzano coppie di registri perché per i blocchi I/O è


strutturato un DDR, Double Data Rate, ovvero il dispositivo
supporta un doppio trasferimento di dati per periodo di clock.

DDR Memory Interface

Per realizzare una DDR Memory Interface, servono i due flip-flop dei blocchi I/O ed il multiplexer DDR che
ne riceve le uscite.

Funzionamento:

I due registri ricevono lo stesso clock, ma


sono diversamente sensibili ai fronti di clock
perché su uno dei due il clock viene negato.
Viene impiegato un DCM (Digital Clock
manager) 0ˑ180 per invertire il clock, questo
perché una classica negazione tramite
inverter impiegherebbe delle LUT, con
conseguenti interconnessioni e quindi uso di
più risorse in definitiva.
NB: Il DCM realizza i segnali di clock a partire sa segnali esterni.

Tornando al DDR, è possibile sfruttare i registri DDR in due modalità:

1) Unire due flussi di dati: Come già detto, ai due registri arriva lo stesso segnale di clock, solo sfasato
di 180°, ma comunque entrambi i registri sono sensibili alla stessa tipologia di fronte (salita o
discesa). Quindi, ai due registri arriva il dato e le uscite dei due vanno in ingresso al multiplexer
DDR. Il selettore di quest’ultimo è proprio il segnale di clock; quindi, in un semiperiodo passerà il
dato di un registro e nell’altro semiperiodo il
dato del secondo (ricordiamo che quello che è
il fronte di discesa per il primo registro
rappresenta il fronte di salita per il secondo).
Dunque, così facendo si sono unite le
informazioni (miscelate per meglio dire) del
primo e del secondo registro in un periodo di
clock.
Tutto sommato si può vedere in un altro
modo, ossia il secondo registro agisce con un
colpo di clock in ritardo rispetto al primo).
2) Scindere un flusso in due flussi: In questo caso si vogliono due uscite separate, due uscite date da
sensibilità su diversi fronti dei flip-flop. In sostanza il flusso DDR viste mandato ad entrambi i flip-
flop, uno preleva i dati sul fronte di salita e l’altro evidentemente sui fronti di discesa, che poi
possono essere considerati fronti di salita considerando però il ritardo di un semiperiodo.
Proprio in considerazione di questo sfasamento si possono allineare gli eventi, visto che uno dei
due flussi è in anticipo rispetto all’altro di un semiperiodo (o in ritardo se ci si riferisce al flusso
uscente dal flip-flop sensibile ai fronti del clock negato). Nel dettaglio basta inserire un flip-flop (che
riceve il clock non negato) in serie al flip-flop che riceve il clock negato, allineando di fatto i flussi di
dati.
Supported I/O standard

Anche gli I/O sul chip possono essere elettricamente configurati e per configurabilità si intende in questo
caso la possibilità di scegliere i valori elettrici di settaggio sulla board. Quando però si parla di valori elettrici
bisogna prestare attenzione a quelli che sono i valori di soglia entro i quali una tensione può essere
considerata un livello logico alto o basso.

In particolare, ricordiamo i valori: VOH, VIH, VOL, VIL

Tecnologie che vengono sfruttate per la configurazione


degli I/O sono la LVCMOS o LVTTL (Low Voltage
Transistor Logic) per standard single ended (ovvero per
un solo PAD).

Un’altra tecnologia o modalità è la supported


Differental, (quindi in pratica quando due blocchi I/O vengono utilizzati come coppia differenziale, e di
conseguenza sono anche connessi alla stessa Switch Matrix), basata sulla differenza di potenziale tra i due
PAD.

Le coppie differenziali di I/O sono più veloci perché è chiaro che trattandosi di differenze di potenziale si
hanno escursioni più piccole.

I/O Options

Dal punto di vista elettrico la struttura I/O è


piuttosto complessa. In ogni caso, all’interno di
questo elemento circuitale si riconoscono due
cammini, input (verso il chip) ed output (verso
l’esterno, il PAD), per cui però si stabilirà in fase di
progettazione quale dei due effettivamente
lavorerà (come possiamo ricordare dai blocchi
I/O).

Questa circuiteria di ingresso-uscita è composta


da: due buffer, due diodi clamp, resistori
(opzionali, che si comportano da PUN e PDN ed un
weak keeper).

• IBUF: Buffer rivolto verso l’interno del chip, effetti capacitivi trascurabili;
• OBUF: Buffer rivolto verso l’esterno del chip, effetti capacitivi non trascurabili;
• Weak Keeper: sistema di mantenimento del potenziale del nodo (in realtà è un mantenimento
debole) in modo da poter inserire un valore logico coerente (il weak keeper è realizzato in logici
LVTTL o LVCMOS);
• Due resistori: (PUN e PDN).
Il weak keeper ed i resistori risultano utili nel momento in cui non viene definito un cammino da o
verso il PAD, questo perché se l’OBUF non impone qualcosa di contrario rispetto a quello che
indicano i resistori allora questi stabiliscono il livello logico del nodo (portano il nodo ad un certo
potenziale). D’altro canto, se l’OBUF imponesse un potenziale, quindi un livello logico, questo
prevarrebbe su quello imposto dai resistori, ecco per quale motivo, dunque, a ciò che sta a valle
dell’OBUF si dà l’aggettivo debole (“vince” sempre il driver).
In sintesi, i due resistori fungono da PUN e PDN nel momento in cui né l’input né l’output
producono qualcosa sul PAD e servono perché nel momento in cui non agiscono l’IN o l’OUT, il PAD
si troverebbe ad un livello di tensione sconosciuto o comunque non prevedibile; con i due resistori
sappiamo a priori che livello logico potrà presentarsi in tali condizioni sul PAD.
Non è detto tuttavia che ci sia bisogno sempre dei due resistori; quindi, per corrispondenza che ci
sia bisogno di un approccio a priori; perciò, in alternativa può essere utilizzato il weak keeper, che
tiene memoria dell’ultimo dato (di fatti è una struttura con elementi di memoria al suo interno, un
latch con una resistenza in serie).
• Diodi clamp: ESD protection (elettrostatic discharge)
Servono a proteggere il sistema di I/O dalle scariche elettrostatiche, può capitare che sul PAD si
disponga un potenziale più alto del necessario o più basso analogamente. Questo potenziale
potrebbe creare problemi perché ovviamente si trova su IBUF ed OBUF.
Se a titolo d’esempio pensiamo ai due buffer come a due CMOS, una tensione elevata sul gate
potrebbe causare il breakdown.
1) Situazione di overshot
Se si impone sul PAD un potenziale elevato (più grande di VCC ad esempio, quindi più grande del
potenziale associato al livello logico 1) il diodo superiore entra in conduzione e ciò significa che la
tensione di soglia del diodo limiterà il potenziale del nodo.
2) Situazione di undershot
Se supponiamo di imporre una tensione inferiore a GND (quindi negativa) in questo caso agirà il
clamp inferiore, che quindi analogamente limita il potenziale sul PAD alla tensione di soglia.

OBUF e IBUF: problemi di carico

È sempre possibile scegliere VCC, quindi lo standard, ed è possibile configurare la corrente transiente;
possiamo dire che i buffer vengano realizzati con una serie di inverter, realizzati con diversi transistor. In
particolare, abbiamo inverter più grandi verso l’esterno del chip e quindi nell’OBUF, per caricare e scaricare
velocemente le capacità all’esterno. Nell’IBU invece non c’è
questa necessità visto che è rivolto verso il chip e ciò significa che
gli effetti capacitivi non sono rilevanti

Clock distribution – schema

L’obiettivo è quello di fare arrivare il segnale di clock a tutte le risorse che lo richiedono in maniera
appropriata.

Bisogna considerare gli effetti capacitivi che ci sono sul die: le linee sul biossido di silicio a sua volta sul
substrato:

Ed in più bisogna anche considerare che gli effetti capacitivi aumentano con l’aumentare della lunghezza
della linea. Oltre a ciò, non vanno trascurati anche gli effetti resistivi e perciò per l’effetto rete RC
ricordiamo la formula dei ritardi di Elmore (per la quale anche assumendo la stessa resistenza dei ritardi
all’aumentare della capacità aumenta il ritardo).

Perciò il segnale di clock, che parte con una certa fase potrebbe arrivare ad una risorsa che lo richiede con
una fase che si discosta anche di poco dalla fase iniziale. La soluzione che viene adattata sul chip è quello di
seguire uno schema ad H per tutto il chip, di modo tale che la lunghezza delle linee sia la stessa e che quindi
su ogni linea si abbiano gli stessi effetti capacitivi: al vertice di ogni H vengono poi costruite delle H
innestate per raggiungere tutti gli elementi che richiedono il clock.
L’obiettivo è quello di far arrivare il clock a tutti gli elementi, con la stessa
fase, quindi con lo stesso eventuale ritardo.

Esempio: supponiamo di voler raggiungere 16 punti sul chip che richiedono il


clock, utilizzando lo schema ad H è facile rendersi conto che il percorso che il
clock segue è lo stesso per tutti e i 16 punti in termini di lunghezza della linea.

Per quanto invece riguarda gli ingressi del clock, si hanno dei clockPAD, ovvero degli I/O specifici; quindi, il
segnale si instrada su reti dedicate passando per un clock buffer che funge da indirizzamento alla
distribuzione. Visto che sono presenti, seppur in un numero limitato e ridotto rispetto ai tipici I/O, dei PAD
dedicati, è possibile distribuire diversi segnali di clock.

Digital Clock Management

Il DCM è l’elemento che si occupa della manipolazione del segnale di clock nel momento in cui questa è
richiesta; quindi, un DCM riceve in ingresso un segnale di clock (CLKIN) ed in uscita presenta diversi clock
derivanti dalla manipolazione del primo: divisi, invertiti, ecc… (CLK0, CLK90, CLK180…)

C’è un certo ritardo tra il clock in ingresso e quelli in uscita, ma non c’è ritardo tra i clock di uscita, l’unica
differenza tra loro è la fase.

Chiaramente il segnale di clock che interessa il chip è il clock in uscita dal DCM.

Mantiene il jitter (variazione di ampiezza, frequenza o fase di un segnale) a livelli accettabili.

Clock distribution – elementi

• BUFG: È un buffer IN-OUT, utilizzato appositamente per il clock;


• BUFGCE: È un buffer con clock enable che permette di attivare limitazioni in termini di potenza
dissipata. Supponiamo che un circuito debba smettere di lavorare, allora se il CE viene impostato
basso (non attivo) il circuito smette effettivamente di lavorare perché il BUFGCE non permette il
passaggio del clock. Diretta conseguenza è la diminuzione dell’attività di switching (del clock) e
quindi di potenza dissipata.
NB: Ogni volta che si è in presenza di un’attività di switching c’è dissipazione di potenza.
• BUFGMUX: Consente di scegliere, tramite un segnale di selezione, tra due clock differenti. Non è un
classico multiplexer perché sceglie tra i due ingressi tramite il segnale di selezione solo quando
sull’ingresso c’è una condizione di stabilità (NON IN TRANSIZIONE), ciò che viene definito come wait
for low. Si attende dunque che i clock (entrambi) siano in condizione di rilassamento, onde evitare
oscillazioni non volute che nulla hanno a che vedere con i due clock. Sicuramente per questo wait
for low si ha una perdita in termini di tempo, capiamo perciò che questo tipo di buffer è più lento.
4) Xilinx Serie 7 FPGA
La serie 7 è la serie attualmente di punta della Xilinx. Si divide in 3 famiglie:

1) Family Artix-7: È la più economica tra le famiglie della serie 7, assicura prestazioni ottimali ma poca
densità su chip (numero ridotto di risorse logiche su chip rispetto ad altre famiglie della serie 7);
2) Family Virtex 7: Famiglia ad alte performance della serie 7, che assicura alte prestazioni e densità
rilevante di risorse logiche sul chip;
3) Family Kintex 7: Famiglia media, sia in termini di prestazioni che di densità su chip, tra Artix 7 e
Virtex 7.

Componenti aggiuntivi rispetto alle serie precedenti:

• DSP Slice: nuovo componente (calcoli di Multiply e accumulation);


• Convertitore A/D: XADC (Analogic to digital converter), di cui tipicamente l’architettura
comprende:
o Doppi convertitori A/D (1MSPS) da 12 bit;
o Fino a 17 input analogici configurabili;
o Sensori per la temperatura e power supply.

Tornando alla serie 7, per quel che riguarda la configurazione delle LUT vale lo stesso principio della serie 2:
LUT come function generator, shift-register e memoria distribuita.

A questo punto è bene chiarire però nelle famiglie della serie 7 non tutte le slice sono dello stesso tipo. Di
fatti per la serie 7 vi sono due tipi di slice con diverse funzionalità possibili. C’è per tale motivo una
semplificazione di diverse aree del chip, per soddisfare le richieste di un progetto reale.

Virtex 7

-CLB

Ogni CLB dell’architettura è collegato ad una switch matrix, o meglio, ogni slice.

Una tra le principali differenze con le altre serie Xilinx sono le LUTs.

Per le LUTs della serie 7 si hanno bus di 6 bit di input, il che significa che in caso di configurazione come
function generator la LUT può produrre fino a 64 combinazioni differenti (26). In realtà però, non si tratta di
una sola LUT per le famiglie della serie 7, bensì due da 32 combinazioni possibili ciascuna, quindi due uscite
da 32 bit.

Da ciò capiamo bene che è possibile configurare per avere due uscite separate o per averne solo una.

NB: 2 LUTs da 32 bit, quindi ad ognuna delle due LUT va in ingresso lo stesso bus (indirizzo) da 5 bit

1) Singola uscita 06 (64 bit  6:1)


Alle due LUT va in ingresso lo stesso indirizzo di 5 bit, mentre il 6° bit funge da selettore per il
multiplexer. Di fatti sarà proprio il 6° bit a stabilire di quale LUT far transitare l’uscita (quindi agli
ingressi del multiplexer vi sono entrambe le uscite delle LUT 5:1) sulla linea 06.
2) Doppia uscita 05 e 06 (2 x 32 bit separati  2 x 5:1)
Si opera sulle due LUT separatamente bloccando il sesto bit, che funge sempre da selettore, sulla
linea 0. Perciò sulla linea 06 vi sarà l’uscita della LUT superiore e sulla linea 05 l’uscita della LUT
inferiore.

Tenendo conto di questa duplice modalità di utilizzo anche alcune delle LUT (perché ve ne sono due tipi)
possono essere configurate come function generator, shift-register e memoria distribuita.
Andando adesso, complessivamente, nel dettaglio del singolo CLB, all’interno di questo si hanno 2 slice, più
corpose rispetto alle slice dell’architettura Virtex II, e 2 catene di propagazione veloce del riporto (carry
chain):

• SLICEM (circa 1/3 delle slice del chip)


È la tipologia di slice più consistente, ovvero in cui le LUT possono essere impiegate nelle tre
modalità possibili di: function generator (5:1 o 6:1), memoria distribuita (64x4 = 256 bits) e shift-
register (32x4 = 128 bits). Ogni SLICEM contiene:
o 4 LUT 6:1 (in realtà sappiamo essere, per ogni LUT 6:1, 2 LUT 5:1);
o 2 linee dati, perché sappiamo che in ogni coppia di LUT 5:1 ogni LUT può lavorare
indipendentemente;
o MC31: porta di uscita, presente in ogni LUT, da cui fuoriesce l’ultimo dato (bit) nel
momento in cui la LUT è configurata come shift-register;
o 8 elementi di storage, configurati sia come FFD che come latch (quindi sia edge che level
triggered);
o Per ogni LUT 6:1 (2 x 5:1) è presente il multiplexer per la propagazione del riporto e la porta
XOR per la somma (sempre sullo schema di un full-adder con multiplexer).

Chiaramente in ogni slice sono presenti più multiplexer, oltre a quelli per la propagazione del
riporto, che fungono da elementi di comunicazione tra le interfacce della slice stessa.

• SLICEL (2/3 delle slice presenti sul chip)

Per la Slice L vengono eliminate due possibili configurazioni per le LUT: memoria distribuita e shift-
register. In breve alla LUT mancano, rispetto alla slice M, tutte le porte sincrone e quindi è evidente
che possa funzionare solo come function generator visto che sia memoria distribuita che shift-
register lavorano sul sincronismo.

Il fatto che siano presenti due tipologie di slice agevola la proporzione tra risorse e prestazioni, questo
infatti consente di semplificare aree che non richiedono tanta complessità messa a disposizione dalle slice
M.

-Distributed SPRAM e DPRAM

1) Single port RAM


Il funzionamento, sia rispetto alle SPRAM che alle DPRAM è
analogo al funzionamento della famiglia Virtex II, con la
differenza che bisogna tener presente che non si ha
effettivamente una LUT 6:1 ma 2 x 5:1 volendo. In qualsiasi
caso i bit in uscita da ogni 6:1 (2 x 5:1) sono sempre 64.
2) Dual port RAM
Per una dual port si utilizzano ovviamente 2 LUT 6:1, grazie
alle quali si introduce un parallelismo in fase di lettura.
Possiamo di fatto notare che gli indirizzi sincroni sono
uguali per le due LUT ma differiscono gli indirizzi asincroni
(quindi per la lettura si tratta, volendo, di effettuare due
letture contemporanee che vengono fuori dallo stesso
oggetto).

3) Distributed Quad-RAM
Vengono utilizzate 4 LUT (come 6:1 o 2 x 5:1)
in cui si effettuano di fatto 4 copie in
scrittura e 4 letture parallele di pro. Quindi vi
è un ingresso sincrono collegato a tutte e
quattro le LUT mentre l’indirizzo asincrono è
diverso per tutte e quattro le LUT.
Come detto in precedenza, sfruttando il fatto
di avere 2 x 5:1 LUT si può configurare anche
una quad port, ovvero in ingresso
ovviamente due dati per ogni blocco (sempre
4 in totale) e due uscite (complessivamente
sempre 64 bit = 32+32 (06,05)).

-Shift-Register

Il funzionamento è del tutto analogo allo shift-register configurabile in un’architettura Virtex II. Per ogni
LUT si hanno 32 posizioni di shift e la 32-esima va in uscita attraverso la porta MC31. È possibile inserire un
indirizzo asincrono nel caso si volesse l’uscita ad una specifica posizione, ed in questo caso l’uscita è sulla
linea 06. Perciò è possibile scorrere il registro fino alla posizione desiderata.

Il risparmio in termini di elementi di storage è ancora più significativo rispetto all’architettura Virtex II, in
questo caso infatti con una singola LUT si hanno a disposizione 32 posizioni che consentono di eseguire la
medesima operazione che richiederebbe altresì 32 flip-flop.

In una struttura shift-register dell’architettura Virtex 7 vengono inoltre gestite le posizioni sulla linea 06
attraverso dei multiplexer per determinare l’uscita complessiva.
-DSP48 Slice (DSP = Digital Signal Processing)

La DSP48 è l’elemento chiave dell’architettura Virtex 7, per il quale l’operazione chiave è la somma di
prodotti:

� 𝑎𝑎𝑖𝑖 ∗ 𝑏𝑏𝑖𝑖
𝑖𝑖

In questa slice ogni processo è configurabile, ovvero il modo con cui si devono svolgere le operazioni. Gli
elementi centrali di questa struttura sono:

- Il moltiplicatore è la zona in cui risiede il circuito che emula una ALU, ovvero che svolge operazioni
dirette bit a bit;
- Le DSP48 slice possono anche essere messe in cascata, l’importante è che le linee di connessione
sono linee “veloci” dello stesso tipo delle linee carry chain e senza punti di interruzione.

Questo tipo di struttura nasce per una ricerca di efficienza, velocità e bassi consumi.

NB: 48 si riferisce alla dimensione del bus di uscita.

Funzionamento ed altri elementi

Il moltiplicatore riceve due ingressi, il cui prodotto viene assemblato di volta in volta (e questa è la funzione
di base), questi personaggi intermedi vengono di volta in volta memorizzati in un registro (che di fatti si
trova sull’uscita del moltiplicatore; quindi, memorizza di volta in volta il prodotto intermedio).

Prima del moltiplicatore è inserito un pre-adder ad alte prestazioni (completamente custom, come tutte le
strutture all’interno di una DSP48).

Visto che si può agire configurando i percorsi all’interno della DSP, è anche presente un pattern detector
che consente di bloccare l’uscita in determinate situazioni.

Ed infine la parte circuitale ALU MODE, la quale lavora in una precisa modalità: SIMD (single instruction
multiple data), come se si avesse una separazione delle porzioni di unità di calcolo (ergo, si possono ance
avere più dati, sui quali si lavora separatamente magari, ma l’istruzione/operazione su quei dati è sempre la
stessa).

Per esempio, supponiamo di volere la somma di due numeri a 48 bit e di realizzarla con dei RCA-12 bit in
serie. Sappiamo bene che il problema in una struttura del genere è il rippling (propagazione del riporto).

Quindi piuttosto pensiamo al guadagno che si avrebbe se invece di avere un unico risultato di 48 bit in
uscita si avessero 4 risultati indipendenti da 12 bit, quindi staccando i RCA in modo che lavorino in
autonomia (uno di fianco all’altro ma scollegati).

Ebbene questa è proprio la modalità SIMD: SI è la somma, mentre i MD sono in questo caso i risultati
prodotti dai singoli RCA.

-clock distribution

Anche in questo caso, come per la Virtex II, esistono delle linee, secondo schemi studiati, per la
distribuzione del clock (l’importante è sempre che ci sia uno schema di distribuzione che consenta in
sostanza che il clock arrivi allo stesso modo a tutti gli elementi che lo richedono).
5) Vivado RTL e Sintesi
Quando viene scritto un codice HDL e viene sintetizzato, il sintetizzatore realizza ciò che si chiede attraverso
il codice tramite le primitive. Le primitive sono risorse che vengono impiegate in base alla richiesta ed è il
sintetizzatore che si occupa del match tra codice e primitive. Se non è presente una primitiva che svolge la
funzione specificata dal codice, allora il sintetizzatore metterà insieme più primitive per svolgere quella
funzione. Tutto ciò a rimarcare che il codice è la descrizione hardware e quindi il modo in cui viene scritto fa
molta differenza.

Alcuni esempi:

• LDCE: primitiva latch con clock enable;


• FDCE: primitiva FFD con clock enable e clear asincrono;
• FDPE: primitiva FFD con clock enable e preset asincrono;
• FDSE: primitiva FFD con clock enable e set sincrono;
• FDRE: primitiva FFD con clock enable e reset sincrono.

Esempi applicativi – codice e primitive:

1) Shift register:
Affinché venga sintetizzato uno shift-register come LUT configurata da tale occorre scrivere un
codice che descriva un registro SISO (Serial In Serial Out) perché la primitiva è una primitiva che
lavora bit a bit. Non scrivendo il codice che descriva opportunamente uno shift-register SISO il
sintetizzatore realizzerà la funzione associando primitive per emulare una funzione che in realtà è
insita nei componenti del chip, ergo: si sprecano risorse.
La primitiva in caso di shift-register correttamente descritto è: SRLC32E;
2) Adders (+) [descritti ad alto livello]
Sappiamo che la somma è insita negli elementi del chip (MUXCY, XORG): In più per la serie 7 vi sono
delle primitive di supporto per la propagazione del carry veloce: CARRY_4
3) Multipliers (*) [descritti ad alto livello]
Per sintetizzare moltiplicatori sono sempre presenti LUT e CARRY_4 (per la serie 7). C’è anche la
possibilità di sfruttare le DSP slice della famiglia 7, ed in questo caso deve essere presente un
attributo che comunichi al sintetizzatore di voler utilizzare una DSP slice. Quest’ultima soluzione
conviene però che venga usata dove effettivamente è indispensabile visto il costo ed il numero
limitato sul chip.
6) Sistemi Embedded
Un sistema embedded è un sistema concepito per un solo scopo, ed ha perciò un obiettivo stringente in
termini di costi e performance. Sono sistemi che interferiscono con il mondo esterno (tramite sensori – che
traducono grandezze fisiche in segnali elettrici – ed attivatori) e molti di questi sistemi vengono concepiti
per lavorare in tempo reale. Altra caratteristica distintiva è la coesistenza tra hardware e software:

Questi sistemi hanno subito nel tempo una evoluzione consistente sia in termini di struttura fisica che di
prestazioni, ad oggi tutto ciò che compone un sistema embedded risiede su un’unica architettura.

Esempio applicativo di un sistema embedded: Advanced Driver Assistance System (ADAS): i veicoli
attualmente in commercio sono dotati di assistenza alla guida, dedita al monitoraggio dell’ambiente
esterno al veicolo attraverso appositi sensori. In quest’ambito è strettamente necessario che le
informazioni sensoristiche vengano opportunamente processate.

Altri esempi possono essere l’ABS e il Cruise Control delle auto o un microcontrollore Arduino (che però
può fare solo una cosa alla volta, non può essere utilizzato per problemi più grandi).

EYEQ-1 (mobileye) system on chip

È un sistema basato su due processori ARM (famiglia di processori RISC a 32 o 64 bit caratterizzata da bassi
consumi, ovviamente sempre rapportati alle prestazioni, uno stabilisce cosa deve fare ogni elemento del
chip, l’altro svolge routine più semplici) ed un gruppo di engine, progettati in maniera custom.

I due processori ARM sono programmabili via software, mentre gli engine permettono di velocizzare alcuni
processi e sono per tale motivo anche indentificati come acceleratori. In particolare, serve qualcosa che
velocizzi i processi perché far operare completamente in indipendenza il solo software ci sarebbero dei
tempi non congrui allo scopo (automotive). Altro elemento presente sul chip è il DMA controller che
consente l’accesso in memoria esterna da parte degli engine, senza impegnare i processori.

NB: Engine = Acceleratori hardware, migliorano le prestazioni in settori specifici e generalmente


nell’elaborazione grafica. Si preferiscono ad un’aggiuntiva CPU perché quest’ultima gestisce più opzioni e
più comuni, mentre l’acceleratore hardware impiega tutte le risorse su uno specifico scopo.

I due processori ARM del sistema lavorano su due obiettivi


differenti, ognuno esegue un proprio codice (chiaramente
possono anche comunicare tra loro).

Il sistema descritto è proprio un sistema per l’elaborazione di


immagini provenienti da due telecamere.

Altri elementi importanti del sistema sono:

- La multilayer matrix, attraverso cui avvengono tutti i


passaggi e collegamenti;
- L’xSDRAM controller che si occupa del controllo dell’accesso
in memoria ed è collegato al processore proprio attraverso la
multilayer matrix.
La differenza tra l’xSDRAM controller ed il DMA controller è che quest’ultimo è indirizzato ad instaurare i
flussi in direzione memoria SENZA coinvolgere il processore ed oltretutto è di fondamentale importanza
nell’elaborazione dei frame provenienti dalle telecamere. Di fatti, è proprio a questo elemento che arrivano
i flussi di frame indirizzati da due locchi di ingresso (video stream), e successivamente proprio dal DMA
vengono inviati i flussi di frame agli acceleratori per l’elaborazione (il tutto sempre attraverso la multilayer
matrix).

Da specificare che tutte le comunicazioni all’interno del sistema (tra elementi) avvengono tramite
protocollo di comunicazione master-slave.

CPU in Xilinx FPGAs (due tipi di processori validi):

1) Soft processor IP core: sintetizzazione sui CLBs (codici VHDL, Verilog criptati) (MICROBLAZ messo a
disposizione dalla Xilinx ed è un soft processor RISC a 32 bit ottimizzato per essere sfruttato in
sistemi embedded). Questi software forniti consentono al progettista di apportare modifiche a
livello funzionale.
2) Hard processor IP: viene costruito nel processo di fabbricazione, non è modificabile da parte del
progettista e sono specifici per una specifica parte di un processo.
Per la Xilinx si ha la famiglia ZYNQ con hard processor incorporato sul chip.

SOFT PROCESSOR: MICROBLAZE

È un oggetto funzionale configurabile (possibile


configurazione anche degli stati pipeline).

Elementi caratteristici sono: due bus di interfaccia


(uno indirizzi ed uno dati), una ALU, Program
Counter, ecc… insomma elementi tipici di una
Processing Unit.

Sul soft processor è anche possibile eseguire un


sistema operativo (Linux OS in particolare).

Il protocollo di comunicazione tra i bus del soft


processor ed altri elementi dell’FPGA è il protocollo AXI.

Capiamo bene che è quindi possibile realizzare un sistema embedded piazzando un soft processor su FPGA.

HARD PROCESSORS: FAMIGLIA ZYNQ (Xilinx)

L’alternativa ad un soft-processor da includere su FPGA è un hard processor già interno al chip, previsto e
costruito sul chip in fase di fabbricazione. Questo è il caso della famiglia ZYNQ di Xilinx (che è un’estensione
della serie 7).

I SOC (system on chip) sono sistemi eterogenei in generale, ovvero sullo stesso DIE è presente una parte di
processing ed una parte logica programmabile.

SOC ZYNC

È dotato di due core Cortex-A9 e di tutti i supporti utili agli stessi (anche cache).

I due core possono colloquiare con l’esterno attraverso interfacce precostruite che è possibile configurare
attraverso apposite linee. In buona sostanza il processing system può colloquiare con la logica
programmabile ed in quest’ultima è possibile dunque strutturare gli engine, prevedere accessi diretti in
memoria, ecc…
Più in generale il ruolo della logica programmabile è quello di velocizzare le operazioni, sostituendosi alla
processing unit quando è richiesto e per diretta conseguenza alleggerire il carico di lavoro di quest’ultima.

Le comunicazioni all’interno del processing system, con supporti e periferiche attive avviene attraverso la
central interconnect, ovvero una sorta di matrice di scambio. Per la comunicazione con la logica
programmabile invece sono presenti porte GPIO (general purpose) e porte HPIO (high performance) che
consentono una comunicazione più rapida tra processing system e logica programmabile.

NB: le comunicazioni sono sempre secondo il protocollo AXI master-slave

Le porte general purpose sono connesse alla central interconnect mentre attraverso le porte high
performance è possibile la comunicazione con l’Application Processing Unit (che contiene i due processori
ARM) diretta oppure la comunicazione con la memoria esterna senza interpellare i processori (questo è un
secondo cammino possibile che si sviluppa sui circuiti di logica programmabile).

Protocollo AXI

AXI (Advanced Extendendible Interface) è un protocollo che fa parte di AMBA (Advanced Microcontroller
Bus Architecture), che è una tipologia di bus di comunicazione sviluppata per SOC, e ad oggi utilizzata anche
negli ASICs.

Del protocollo AXI sono tre i meccanismi ampiamente utilizzati nei sistemi embedded:

1) Memory Map/Full (Axi4): single address – multiple data (Burst);


2) Streaming (Axi4 stream): Data only (burst): nessuna informazione sull’indirizzo;
3) Lite (Axi4 lite): single address – single data (not burst).
Nello specifico:

1) AXI4 (FULL):
Prevede due interfacce: master e slave, tra cui viaggiano un
certo numero di segnali su diversi canali. In particolare, 5
canali:
• 2 canali per la scrittura (uno per i dati e uno per
l’indirizzo);
• 3 canali per la scrittura (uno per i dati, uno per
l’indirizzo ed uno apposito per il segnale write response, il
quale è utilizzato per la verifica di corretta scittura).

Dal fatto che sono presenti differenti canali è possibile


svolgere le attività contemporaneamente.

Tutti i canali AXI utilizzano un VALID/READY HANDSHAKE:


la sorgente asserisce e mantiene VALID quando il dato è
disponibile, la destinazione asserisce e mantiene READY quando è pronta a ricevere il dato. Perciò
VALID e READY sono due segnali di controllo e solo in presenza di VALID e READY
contemporaneamente può avvenire il trasferimento di un dato (chiaramente con più dati la stessa
operazione è ripetuta più volte). Nel momento in cui uno tra VALID e READY non viene asserito, il
trasferimento viene sospeso. Detto ciò, passando alla comunicazione tra le due interfacce, ogni
operazione inizia sempre dal master, che quindi governa il processo.

Esempio: trasferimento di dati sul canale READ Axi4:

Abbiamo dei valid-ready sia per l’indirizzo che per i dati. Le


operazioni iniziano sempre dal master:

ADDRESS:

- Il master manda l’indirizzo di lettura allo slave;


- Il master manda il VALID relativo all’indirizzo e riceve dallo
slave il READY.

DATA:

- Lo slave manda al master il dato letto insieme al VALID


relativo al dato letto e riceve READY dal master
- Lo slave manda inoltre il segnale RLAST al master che tiene
contro dell’ultima transizione eseguita

Ciclo di operazioni:

1) Il master manda l’indirizzo di lettura (da cui leggere, read address channel), l’indirizzo è valido
quando il VALID ed il READY (proveniente dallo slave) sono contemporaneamente alti;
2) Avviene la transizione del dato letto dallo slave (nel data channel) solo nel momento in cui
VALID e READY (proveniente dal master) sono contemporaneamente alti.

Stessa cosa vale per l’operazione di scrittura: il master comunica allo slave cosa fare e dove farlo e
lo slave restituisce al master il “risultato” dell’operazione (write response channel).
2) Axi4 LITE
Non è molto differente da Axi4(Full), l’unica differenza sta nel fatto ce il dato è uno soltanto (di 32
bit supportato su Xilinx). Perciò i meccanismi sono identici ma Axi4 Lite è No-burst; quindi, viene
trasferito un dato per volta.
Ad esempio, per attivare questa modalità si potrebbero inviare dei dati ad un registro e collegare il
registro all’interfaccia slave.
3) Axi4 STREAM
In questo caso non vi sono operazioni da poter fare e di conseguenza canali dedicati, c’è solo il
canale per il trasferimento di dati (streaming burst), in più, in questo caso la direzione è obbligata: il
master trasferisce dati allo slave, per cui comunque vale il discorso sui segnali VALID e READY
(VALID  Master, READY  Slave).
Questo protocollo è generalmente utilizzato per sequenze di immagini e video secondo quello che
viene detto raster order.
Sappiamo che i pixel di un’immagine ed un video sono di fatto organizzati in righe e colonne (come
una griglia). Il raster order prevede che, una volta trasferita una riga VALID <= 0, il master passa alla
riga successiva e VALID <= 1.
Vi sono per le immagini dei segnali/punti di riferimento per capire che dato stia viaggiando:
- EOL: end of line;
- SOF: start of frame (primo pixel).

Oltre all’applicazione per immagini e video il protocollo Axi4 Stream viene impiegato per le
operazioni di reti.

Esempio applicativo: sistema di accelerazione di calcolo:

Ricordiamo sempre che per il protocollo Axi, avere da un lato l’interfaccio master significa che dal
lato opposto (dove avviene o va il trasferimento) vi sarà un’interfaccia slave.

Viene realizzato un SOC eterogeneo, che fa quindi uso di un processing system e di un hardware
completamente dedicato (realizzato nella logica programmabile).

Quest’ultimo è dunque un sistema special purpose, che nella maggior parte dei casi viene utilizzato
per velocizzare i calcoli (introducendo parallelismi per esempi).
La comunicazione tra i vari elementi del SOC avviene nel caso in esame, tramite protocollo Axi4
Stream e protocolli Axi4 Lite.

Attraverso i dati presenti nei registri si configura il circuito special purpose per lavorare in un certo
modo ed i dati nei registri per la configurazione provengono dal processing system attraverso il
protocollo Axi4 Lite. Le porte del processing system (general purpose) vengono quindi configurate
per lavorare secondo il protocollo Axi4 Lite.

La memoria in questo caso è esterna al SOC ed è possibile accedervi anche tramite il DMA,
direttamente, sfruttando stavolta il protocollo Axi4 Full.

Le azioni che il DMA deve compiere vengono configurate attraverso la stessa interfaccia Axi4 Lite
utilizzata per configurare il circuito special purpose attraverso i registri. Il DMA, in particolare, può
colloquiare con la memoria esterna attraverso le porte high performance del processing system, ma
può colloquiare con la memoria e mettersi in comunicazione, senza passare per il processing
system, attraverso interfaccia Axi4 Stream. Per questo però sono presenti due porte Axi4 Stream,
una master e una slave. Questo perché sappiamo che il protocollo impone un’unica direzione
(Master  Slave) nel trasferimento di dati, ma ovviamente ci deve essere la possibilità sia di
prelevare che di inserire dati in memoria.

Differenza tra lo Special Purpose Circuit ed il pure software in un SOC

I circuiti special purpose sono dotati di un certo livello di parallelismo; perciò, assegnando un task al DMA lo
Special Purpose Circuit può lavorare tranquillamente alleggerendo il lavoro del processing system che
invece non può sfruttare il parallelismo. Di conseguenza il processing system è libero di procedere con
l’esecuzione del software o dei software se i core fanno cose diverse.

In conclusione: sistemi embedded  programmazione del software + progettazione hardware.


7) Actel – ProAsic 3
Le architetture ASIC in generale sono architetture basate su Antifuse e Flash ROM, ovvero sono architetture
progettate sì per un solo scopo ma non riconfigurabili (il bitstream viene caricato dall’interno, quindi la
memoria che lo contiene è all’interno del chip).

• Antifuse: I dispositivi antifuse sono dispositivi One Time programming e sono resistenti alla
ionizzazione, vengono di fatti, impiegati nel campo aerospaziale. Una tecnologia SRAM Based è
sensibile alla ionizzazione, basti pensare alla singola cella SRAM.
• Flash ROM Based: One time programming e quanto all’influenza dell’ambiente esterno è una via di
mezzo, c’è si il rischio che risenta di una ionizzazione ma con bassa probabilità.

In entrambi i casi si tratta di tecnologie basate su memoria non volatile incorporata nel chip, sono
tecnologie live at power-up (LAPU), ovvero operano non appena alimentate.

L’Actel ProAsic 3 è una tecnologia flash based, ovvero dotata di Flash ROM.

Visto che la memoria non volatile è all’interno del chip è una memora flash, il cui funzionamento è basato
su celle flash (floating gate transistor), si affiancano delle charge pumps (pompe di carica) che hanno lo
scopo di sollevare i potenziali rispetto a quello di alimentazione (per i floating gate transistor occorre un
potenziale maggiore).

Esempio esemplificativo delle pompe di carica tramite condensatori:

Altri elementi delle ProAsic 3 sono:

• Sistema di decrittazione: per un colloquio sicuro tra chi progetta ed il chip;


• Versatile: (equivalenti negli ASIC delle slice in FPGA) possono essere impiegati come:
o Generatori di funzione logica (equivalenti di una LUT a 3 ingressi);
o Strutture di memorizzazione (Latch e FFD) con clear o set;
o Enable FFD con clear o set.

Tutta questa tecnologia si


basa essenzialmente
sull’advanced flash switch:

Due transistori identici, uno


che effettivamente effettua lo
switch e l’altro che serve a
controllare lo stato del primo.

- CCC: clock conditioner circuit (stesso ruolo del DCM nel FPGA).
Architettura del versatile

Inverter, multiplexer, XNOR e molti flash switch. Tutti gli interruttori vengono configurati dal bitstream,
chiaramente lo è il versatile (tutto).

Inoltre, sfruttando un opportuno feedback, con i multiplexer è possibile creare latch, master-slave (dai
singoli latch in cascata) e quindi elementi edge triggered.

Routing sources

Chiaramente sono presenti in maniera differente rispetto alle switch matrix.

I versatile devono parlare tra loro (adiacenti) attraverso ultra-fast line. Mentre c’è un criterio diverso per
l’interazione dei versatile all’interno di sottomatrici di connessione: si hanno dei bus a lunghezza diversa
che consentono la comunicazione a distanza tra un certo numero di versatile (quindi all’interno di
sottomatrici). Il fatto di avere linee a lunghezza differente è un vantaggio (per le linee a lunghezza minore
delle sottomatrici) dal punto di vista delle perdite capacitive e resistive. Tuttavia, ci sono anche linee più
lunghe che attraversano più sottomatrici e blocchi RAM.

Distribuzione del clock

Piedini (PIN) riservati al/ai segnale/i di clock a cui è collegata una linea direttrice generale da cui si
diramano altre linee (“a spina”) che portano il clock in modo equilibrato su tutto il chip. Possono essere
presenti anche operazioni di multiplexaggio per scegliere ad esempio tra due segnali di clock.

È presente, anche in questo caso, un elemento per lo sfasamento del clock CCC (clock conditioner circuit),
da cui possono essere ricavati quattro sfasamenti del clock.

I/O blocks

Estremamente simile alle strutture I/O (bidirezionali) delle strutture FPGA.

Sicurezza

Al contrario delle FPGA che richiedono il caricamento del bit-stream dall’esterno, nelle Actel ProAsic 3 non
c’è nessun bitstream da caricare dall’esterno e quindi è ridotto il rischio che il contenuto progettuale possa
essere compromesso. Il bitstream è già all’interno del chip ed è criptato; perciò, per potervi accedere
bisogna conoscere la chiave di decrittazione (ovviamente se il bitstream viene criptato l’architettura
conosce – bene la chiave di decrittazione).

Bitstream  crittografia + chiave da mandare al chip  caricamento

Un’attenzione più accurata in merito alla crittografia va fatta se il bitstream deve essere mandato via rete
per esempio.

REVERSE ENGINEERING: Riuscire a risalire al codice HDL tramite il bitstream.


8) Finite State Machine
Le macchine a stati finiti vengono utilizzate per modellare dei sistemi e rappresentano un metodo efficiente
per creare controllo.

Design di una FSM

- Registro per contenere lo stato corrente;


- Combinatorio per determinare lo stato successivo
- Combinatorio per determinare le uscite

Macchina di Moore

Le uscite sono funzione dello stato corrente e le transizioni delle stesse sono sincrone al system clock (1)

Macchina di Mealy

Le uscite sono funzione sia dello stato corrente sia degli ingressi e le transizioni delle uscite sono sincrone
con il system clock

In VHDL tutto ciò si può tradurre in due process (ma anche uno solo, sostituendo il combinatorio in uscita
ad un registro): uno per il cambiamento di stato ed uno per il cambiamento delle uscite.

Blocchi RAM

I blocchi RAM presenti su chip devono essere configurati nel momento in cui si vuole impiegarli (e secondo
l’impiego ovviamente).

1) Single port RAM: 1 lettura o 1 scrittura sul fronte di clock;


2) Dual port RAM: 1 lettura da una porta e 1 scrittura sull’altra al fronte di clock, ma il dato in uscita è
sempre uno (vanno definite delle modalità);
3) True-Dual port RAM: si hanno stavolta due uscite e quindi è possibile leggere e scrivere, fare due
scritture o due letture al fronte di clock dalle due porte in contemporanea.

Se si deve solo leggere si può pensare alla configurazione Dual port o Single port ROM, ma anche se si
utilizza il blocco come una ROM bisogna sempre tenere presente che si hanno solo blocchi RAM sul chip.

Modalità (in riferimento a cosa accade quando si scrive) [operating mode]:

- Write first: il dato in input viene scritto alla locazione di memoria specificata dall’indirizzo e viene
anche mandato in uscita;
- Read first: il dato in input, in caso di scrittura sempre, viene scritto alla locazione di memoria
specificata dall’indirizzo ma in uscita va il dato che si trovava in quella posizione di memoria prima
della scrittura del nuovo dato;
- No change: il dato in uscita rimane invariato durante le operazioni di scrittura.

Collisioni

Siccome è supportata l’implementazione di una dual port RAM e le due porte operano sulla stessa memoria
bisogna prevedere delle collisioni di dati

• Clock asincroni: usando clock asincroni quando avviene un’operazione di scrittura da una porta ad
una locazione di memoria, l’altra porta non scrive e non legge a quella locazione per un periodo
specificato. Questo setup time è definito nel datasheet inerente alla memoria del dispositivo.
• Clock sincroni: clock sincroni generano diversi scenari di collisioni:
1. Write – Write: succede quando le due porte tentano di scrivere alla stessa locazione di
memoria ed il contenuto della memoria viene perciò corrotto.
2. Write – Read; succede quando una delle due porte scrive e l’altra legge alla stessa
locazione di memoria ed il dato in uscita dipende dall’operating mode della porta che
scrive:
 Se read first allora l’altra porta legge il contenuto precedente di quella locazione di
memoria;
 Se write first o no change allora il dato in uscita della read port non è valido

Potrebbero piacerti anche