Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Microcontrollore e microprocessore
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.
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).
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:
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.
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
Le slice sono suddivise in due colonne (ogni colonna con due slice), con due catene di riporto indipendenti
ed una condivisa (shift).
È bene osservare che l’uscita del function generator non solo è l’uscita
della slice, ma è anche l’ingresso dell’elemento di memoria.
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:
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:
È 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:
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:
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.
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
• 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.
È 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
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.
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.
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.
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.
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
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):
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.
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.
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.
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:
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).
È 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.
Da specificare che tutte le comunicazioni all’interno del sistema (tra elementi) avvengono tramite
protocollo di comunicazione master-slave.
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.
Capiamo bene che è quindi possibile realizzare un sistema embedded piazzando un soft processor su FPGA.
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.
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) 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).
ADDRESS:
DATA:
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.
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.
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.
• 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).
- 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
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.
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
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).
Un’attenzione più accurata in merito alla crittografia va fatta se il bitstream deve essere mandato via rete
per esempio.
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).
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.
- 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