Logica programmabile - ROM, PLA, PAL e FPGA
In questa pagina 6
Le porte viste finora realizzano funzioni fisse. I dispositivi logici programmabili (PLD, Programmable Logic Devices) sono circuiti integrati con strutture logiche modificabili, configurate dal costruttore o dall'utente per svolgere funzioni diverse. La configurazione modifica l'hardware e realizza quella funzione logica nel dispositivo: non va confusa con la programmazione software di un microcontrollore, dove l'hardware non cambia.
Si vedono quattro famiglie: ROM, PLA, PAL e FPGA.
Come si programma
Irreversibile (una sola volta):
- fuse / anti-fuse: i collegamenti tra elementi logici sono eliminati (fuse) o creati (anti-fuse) in modo selettivo applicando tensioni elevate;
- mask programming: i collegamenti sono realizzati dal costruttore nell'ultima fase della fabbricazione.
Reversibile (riconfigurabile molte volte):
- interruttori collegati a memoria volatile (tipicamente SRAM): l'informazione di programmazione si perde senza alimentazione (Memorie ROM e RAM - SRAM, DRAM e organizzazione dei chipUna memoria è un insieme di celle (word da più bit) con circuiteria di controllo. Classificazioni: sola lettura (ROM) o lettura/scrittura; ad accesso casuale (RAM), seriale (SAM) o ibrido (Flash); volatile (SRAM, DRAM) o non volatile. Una RAM $2^k\times n$ ha $k$ bit di indirizzo (indipendenti da $n$), $n$ bit dati, read/write e chip select. SRAM: cella bistabile (latch), veloce, senza refresh; DRAM: condensatore, più densa, con refresh. Organizzazione: decoder di riga e colonna (coincident selection), uscite tri-state, array di chip (più chip per più parole, più bit per più linee dati).Memorie ROM e RAM - SRAM, DRAM e organizzazione dei chip →);
- interruttori controllati da MOSFET con tensione di soglia programmabile, a gate flottante (floating gate): in genere non volatili, mantengono la programmazione senza alimentazione.
Simbolo compatto. Una porta con molti ingressi (fan-in alto) si disegna con una linea sola; una x all'incrocio indica che quella linea è collegata alla porta, l'assenza della x indica che non lo è.
ROM (Read Only Memory)
In una ROM i dati sono memorizzati in modo permanente, anche senza alimentazione (memoria non volatile). Si può solo leggere: si fornisce l'indirizzo e si legge la parola. Una ROM con ingressi di indirizzo e uscite dati contiene parole da bit (sigla ).
Struttura. Un decoder -to- trasforma l'indirizzo in un segnale 1-hot (una sola linea attiva per parola, Decoder, encoder e priority encoderUn decoder $n$-to-$m$ ($m\le2^n$) converte un ingresso binario a $n$ bit in un'uscita 1-hot (un solo 1, nella posizione indicata): le sue uscite sono i mintermini degli ingressi, realizzati con $m$ AND; per decoder grandi si usa l'approccio gerarchico (costo in ingressi: 3-to-8 = 27, 6-to-64 = 182) e un enable. Ogni funzione = decoder + OR dei suoi mintermini. L'encoder fa l'operazione inversa (1-hot $\to$ binario) ma sbaglia con più ingressi a 1 o tutti a 0: il priority encoder risolve con una priorità e un'uscita V (valid).Decoder, encoder e priority encoder →); le uscite del decoder sono collegate a porte OR a ingressi con connessioni programmabili: se il collegamento tra la linea della parola e la OR del bit c'è, il bit di quella parola vale 1, altrimenti 0. Esempio (5 bit di indirizzo, 8 bit dati): se all'indirizzo sono collegate le OR dei bit , si legge 10010011.
Una ROM è dunque una tabella di verità fisica: realizza qualunque funzione combinatoria di variabili con uscite. Esempio: la ROM del sommatore completo, indirizzo , parola :
| indirizzo | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
|---|---|---|---|---|---|---|---|---|
| contenuto | 00 | 01 | 01 | 10 | 01 | 10 | 10 | 11 |
(il contenuto è il numero di 1 in ingresso scritto in binario: è la parità, la maggioranza, Sommatori binari - half adder, full adder e ripple carryHalf adder (2 ingressi): $S=X\oplus Y$, $C=XY$. Full adder (3 ingressi, con riporto in ingresso $Z$): $S=X\oplus Y\oplus Z$, $C=XY+XZ+YZ=G+PZ$ con $P=X\oplus Y$, $G=XY$; si realizza con due half adder e una OR. Il ripple carry adder a $n$ bit concatena $n$ full adder: il riporto "ondeggia" dal LSB al MSB, quindi il ritardo cresce linearmente con $n$. È un circuito iterativo (gerarchico e regolare). Il moltiplicatore a 2 bit usa 4 AND e 2 half adder.Sommatori binari - half adder, full adder e ripple carry →). Una ROM è una memoria combinatoria: non ha stato.
Tipi di ROM:
- ROM a maschera: connessioni fatte dal costruttore in fonderia;
- PROM (fuse/anti-fuse): programmabile dall'utente una sola volta;
- EPROM: gate flottante, cancellabile con raggi ultravioletti e riprogrammabile;
- EEPROM (E²PROM): gate flottante, cancellabile e riprogrammabile elettricamente;
- memoria Flash: evoluzione della EEPROM.
La scelta dipende da volumi, frequenza e numero di riprogrammazioni, prestazioni e costo.
PLA (Programmable Logic Array)
Un PLA è simile a una ROM, ma il decoder è sostituito da una matrice di porte AND programmabili: ciascuna genera un termine prodotto (anche con meno letterali delle variabili di ingresso, quindi in forma semplificata) a partire dagli ingressi, diretti o negati. I termini prodotto sono poi collegati in modo programmabile a porte OR, che sommano. Entrambe le matrici (AND e OR) sono programmabili. A differenza della ROM, il PLA non genera tutti i mintermini, solo un sottoinsieme programmabile, e i termini prodotto possono essere condivisi tra le uscite. Le uscite delle OR possono passare per una porta XOR programmabile, che permette di avere l'uscita diretta o negata.
Vantaggi: versatilità, utili per sistemi complessi, riconfigurabili, anche per sistemi sequenziali con feedback articolati e vari FF; di solito costano più dei PAL. I PLA commerciali contengono moltissime porte, altrimenti non sarebbero economici.
Programmazione di un circuito combinatorio. Servono: le connessioni tra ingressi (diretti o negati) e porte AND; le connessioni tra AND e OR; la forma diretta o negata di ogni uscita. Per ottenere un PLA piccolo si minimizza il numero di termini prodotto condividendoli tra le uscite; il numero di letterali in ciascun termine conta poco, perché tutte le variabili dirette e negate sono già disponibili.
Esempio. , . Termini prodotto: , , . Il termine è condiviso:
| termine | |||||
|---|---|---|---|---|---|
| 1 | 0 | – | x | ||
| 1 | – | 1 | x | x | |
| – | 1 | 0 | x |
(In ingresso: 1 = variabile diretta, 0 = negata, – = non collegata. In uscita: x = il termine entra nella OR.) Servono 3 AND. Tabella di verità ( fino a ): ; .
Per ottenere un PLA più piccolo a volte conviene realizzare la funzione negata (e lasciare che la XOR di uscita la riporti a quella cercata) o usare implicanti non primi che si condividono tra più uscite.
PAL (Programmable Array Logic)
Un PAL ha una matrice di AND programmabile e una matrice di OR fissa. È meno flessibile del PLA (dove entrambe le matrici sono programmabili) ma più semplice, più economico e più veloce; i PAL commerciali hanno almeno 8 ingressi e 8 uscite. Nei PAL i termini prodotto non si possono condividere tra più OR: ogni uscita ha le sue AND. Quindi si ottimizzano le funzioni a due livelli una uscita alla volta, mentre per i PLA si ottimizzano le uscite insieme.
Stesso esempio su PAL: usa le sue due AND (, ) e le sue due (, ): 4 AND in tutto invece di 3, perché va duplicato.
Vantaggi: compattezza, semplicità, velocità, basso prezzo per funzioni semplici e ripetute (aritmetiche), anche per sistemi sequenziali con pochi FF, tempi di propagazione brevi e vincoli stretti sul clock.
| AND | OR | condivisione dei prodotti | |
|---|---|---|---|
| ROM | fissa (decoder) | programmabile | tutti i mintermini disponibili |
| PLA | programmabile | programmabile | sì |
| PAL | programmabile | fissa | no |
La struttura tipica di una PAL è dunque: matrice programmabile di AND seguita da una matrice fissa di OR.
FPGA (Field Programmable Gate Array)
Gli FPGA sono, dopo le memorie Flash, i PLD più diffusi. Hanno in comune:
- blocchi logici programmabili (combinatori e sequenziali);
- interconnessioni (routing) programmabili;
- pin di I/O programmabili.
Possono contenere anche blocchi specializzati (memorie, blocchi aritmetici, microprocessori). Il loro vantaggio rispetto agli altri PLD è la disponibilità di blocchi logici configurabili e flip-flop e la facilità di riconfigurazione. Le informazioni sul circuito realizzato sono nella memoria di configurazione, volatile (SRAM) o non volatile (Flash, fuse/anti-fuse). Programmare un FPGA significa fissare i bit di configurazione dei blocchi logici, del routing e dei pin. Il mercato mondiale è dominato da aziende statunitensi. La descrizione VHDL di un circuito, sintetizzata, produce il file di configurazione (Introduzione al VHDL - entity, architecture, tipi e livelli di descrizioneVHDL è un linguaggio di descrizione dell'hardware (HDL), non di programmazione: le dichiarazioni sono concorrenti e descrivono blocchi di circuito; serve per documentare, simulare e sintetizzare. Un blocco ha una entity (nome e porte in/out) e almeno una architecture (cosa c'è dentro: structural con component e port map, dataflow con equazioni booleane, behavioral con comportamento). Tipi: std_logic (da 1164: '0','1','X','Z','U','-',...), std_logic_vector, bit, boolean, integer. Signal per i collegamenti interni, constant per i valori fissi.Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione →).
Look-Up Table
In molte famiglie il blocco logico contiene LUT (Look-Up Table): memorie che, tramite un multiplexer, realizzano la tabella di verità di una funzione di variabili (Multiplexer e funzioni logiche realizzate con decoder e multiplexerIl multiplexer (MUX) $2^n$-to-1 ha $2^n$ ingressi dati, $n$ ingressi di selezione e un'uscita che copia l'ingresso selezionato: $Y=\sum_i m_i(S),I_i$. Si realizza con decoder + AND di enable + OR (costo 22 per il 4-to-1) o direttamente (costo 18). Un MUX $2^n$-to-1 realizza qualunque funzione di $n$ variabili (ingressi dati = colonna della tabella di verità); con un MUX $2^{n-1}$-to-1 si usano le $n-1$ variabili come selezione e gli ingressi dati valgono $0$, $1$, $X$ o $\overline X$ (l'ultima variabile). I MUX a vettori selezionano gruppi di bit.Multiplexer e funzioni logiche realizzate con decoder e multiplexer →). I bit di configurazione fissano i valori agli ingressi dati del MUX.
- LUT a 2 ingressi (): 4 bit di configurazione, possono realizzare una qualsiasi delle funzioni booleane di e ; con i bit è una XOR.
- LUT a 3 ingressi: due LUT a 2 ingressi più un MUX 2-to-1 (selezione: ), funzioni.
Un FPGA contiene migliaia o milioni di LUT, e oltre a esse flip-flop, multiplexer e blocchi aritmetici. Con altri multiplexer configurabili (bit di configurazione) la stessa cella può dare un'uscita combinatoria (di ), un'uscita registrata (macchina di Moore: l'uscita dipende solo dallo stato nel FF) oppure un'uscita che dipende anche dagli ingressi (Mealy).
Errori comuni
- Confondere ROM (decoder fisso + OR programmabili) con PLA (AND programmabili): la ROM genera sempre tutti i mintermini.
- Dire che il PAL condivide i termini prodotto: è il PLA a farlo.
- Scambiare configurazione hardware e programmazione software.
- Dimenticare che le ROM sono combinatorie: leggere una parola non cambia stato.
- Confondere memoria di configurazione volatile (SRAM) e non volatile (Flash): la volatile va ricaricata a ogni accensione.
Versione ripasso
- PLD: struttura logica configurabile (hardware modificato); irreversibile (fuse/anti-fuse, mask) o riconfigurabile (SRAM volatile; gate flottante non volatile). Simbolo: x = collegamento.
- ROM : decoder + OR programmabili; tabella di verità fisica, non volatile, combinatoria. Tipi: mask, PROM (una volta), EPROM (UV), EEPROM, Flash. Full adder: , contenuto .
- PLA: AND e OR programmabili, termini prodotto condivisi, XOR di uscita (negazione). Es. , : 3 AND.
- PAL: AND programmabile, OR fissa, niente condivisione (stesso esempio: 4 AND); più semplice, economico, veloce.
- FPGA: blocchi logici (LUT + FF + MUX), routing e I/O programmabili, memoria di configurazione (SRAM o Flash); LUT = memoria + MUX: LUT2 realizza 16 funzioni, LUT3 = 2 LUT2 + MUX; uscita combinatoria, Moore o Mealy dai bit di configurazione (Multiplexer e funzioni logiche realizzate con decoder e multiplexerIl multiplexer (MUX) $2^n$-to-1 ha $2^n$ ingressi dati, $n$ ingressi di selezione e un'uscita che copia l'ingresso selezionato: $Y=\sum_i m_i(S),I_i$. Si realizza con decoder + AND di enable + OR (costo 22 per il 4-to-1) o direttamente (costo 18). Un MUX $2^n$-to-1 realizza qualunque funzione di $n$ variabili (ingressi dati = colonna della tabella di verità); con un MUX $2^{n-1}$-to-1 si usano le $n-1$ variabili come selezione e gli ingressi dati valgono $0$, $1$, $X$ o $\overline X$ (l'ultima variabile). I MUX a vettori selezionano gruppi di bit.Multiplexer e funzioni logiche realizzate con decoder e multiplexer →).
- Errori: ROM PLA; PAL che condivide; configurazione programmazione.