Capitolo IV Memorie e logiche programmabili Capitolo IV Memorie e logiche programmabili. 4.1) Introduzione. Un peso notevolissimo nel campo dell’integrazione a larga scala e’ ricoperto al giorno d’oggi dalle memorie, che rappresentano attualmente circa i due terzi della totalita’ dei circuiti integrati prodotti. Ancora oggi si assiste ad un continuo aumento del numero di bit disponibili sul singolo chip, che approssimativamente quadruplica ogni tre anni. Stranamente sulle memorie a semiconduttore non esiste quell’ampiezza di informazione che ci si potrebbe aspettare per componenti che rivestono una cosi’ grande importanza. Probabilmente tale situazione prende origine, a differenza dei circuiti SSI e MSI, da considerazioni di competitivita’ tra le industrie produttrici, che non hanno alcun interesse a divulgare informazioni troppo dettagliate sui loro prodotti. 4.2) Classificazione delle memorie. Le memorie a semiconduttore sono dispositivi elettronici costituiti da un insieme di celle elementari, ciascuna delle quali e’ in grado di immagazzinare un’informazione binaria. Questo insieme di celle elementari e’ dotato di apposite linee di comunicazione che permettono di accedere al singolo dato. Le memorie possono essere classificate sotto diversi punti di vista. Ad esempio esse possono venire identificate a livello di sistema a seconda del tipo di accesso che consentono. Si parla allora di memorie ad accesso sequenziale o di memorie ad accesso diretto (dette spesso in modo improprio ad accesso casuale). Nel primo caso i dati vengono accodati l’uno rispetto all’altro in fase di scrittura, mentre in fase di lettura l’organizzazione della memoria e’ tale che il primo dato leggibile sia quello che e’ stato scritto per primo (in questo caso si parla di memorie first in – first out o FIFO). Oppure puo’ avvenire che il primo dato leggibile sia l’ultimo scritto e in tal caso si parla di organizzazione a pila (o a stack). Vi possono essere poi ancora altre organizzazioni, ma, comunque sia, nelle memorie ad accesso sequenziale per recuperare un dato e’ necessario scorrere tutti i dati che in fase di lettura precedono quello voluto. Molto spesso tuttavia risulta necessario poter accedere direttamente ad un particolare dato; tale operazione e’ appunto possibile nelle memorie ad accesso diretto, nelle quali attraverso un indirizzo si puo’ direttamente individuare l’informazione desiderata. Nelle memorie ad accesso sequenziale l’indirizzo non e’ necessario, o meglio e’ implicito. E’ opportuno tuttavia notare che esistono metodi di accesso piu’ complessi di quelli citati. Ad esempio esistono le memorie ad accesso multiplo (il piu’ delle volte doppio), in cui esistono piu’ canali di accesso in modo da renderle disponibili a piu’ processi contemporaneamente, rendendo la memoria una risorsa condivisa. Rimanendo nell’ambito delle memorie ad accesso casuale una prima grande suddivisione e’ quella che divide le memorie in quelle di lettura e scrittura (RAM – random access memory) e in quelle a prevalente lettura (ROM – read only memory). Nelle prime un dato puo’ essere scritto e letto in qualsiasi cella, con un tempo di accesso che e’ praticamente lo stesso sia che l’operazione sia di scrittura che quando l’operazione e’ di lettura. Nelle seconde l’operazione normale e’ solo quella di lettura poiché quella di scrittura o non e’ permessa o richiede un tempo molto piu’ lungo che non quella di lettura. Un vantaggio delle ROM tuttavia risiede nel fatto che l’informazione si conserva anche quando l’alimentazione viene a mancare, a differenza delle RAM in cui l’informazione viene persa. Per tale motivo le ROM vengono anche chiamate memorie non volatili. Per la verita’ esistono anche RAM non volatili, ottenute con opportuni espedienti; ad esempio le ZRAM (zero power RAM) utilizzano batterie tampone per mantenere alimentati i dispositivi 151 Capitolo IV Memorie e logiche programmabili anche in fase di assenza dell’alimentazione primaria, o ancora le informazioni vengono duplicate su una memoria non volatile in modo da poterle ripristinare quando necessario oppure si sfruttano opportuni fenomeni quali l’isteresi ferroelettrica per ottenere una memorizzazione permanente. In ogni caso una suddivisione di massima delle memorie ad accesso diretto e’ riportata in tabella 4.1, nella quale, a titolo orientativo e’ riportata anche la tecnologia con cui ciascun tipo di memoria viene realizzato. TABELLA 4.1 ------- dinamiche MOS RAM ------- statiche MOS e bipolari ------- a maschera ------- PROM MOS bipolari ------- EPROM ------- EEPROM MOS MOS ROM • E’ opportuno tuttavia accennare ad alcune delle caratteristiche piu’ importanti dei vari tipi di ROM. • ROM a maschera. Sono memorie a sola lettura nelle quali i dati vengono immagazzinati mediante un opportuno processo di mascheratura durante la fabbricazione. L’utente all’atto dell’ordinazione deve specificare con un’opportuna codifica tutta l’informazione che deve venir scritta nella memoria. La struttura fisica del componente e’ particolarmente semplice e l’organizzazione di tale tipo di memoria e’ sempre a matrice. In commercio si possono trovare ROM a maschera con diversi gradi di parallelismo, di cui i piu’ comuni sono comunque 4 e 8. • PROM o ROM programmabili. Sono anch’esse memorie a sola lettura in cui tuttavia i dati vengono inseriti dall’utente finale. La scrittura di un dato avviene o per fusione di opportuni collegamenti o con la perforazione di una giunzione. Il dato, una volta scritto, non puo’ essere un alcun modo cancellato. Vantaggio sostanziale rispetto alle ROM a maschera e’ l’eliminazione dei tempi di attesa tra ordinazione e consegna della ROM, malgrado che il loro costo unitario sia superiore. E’ tuttavia necessario tenere presente che la produzione di ROM a maschera non e’ economicamente conveniente per quantitativi inferiori al migliaio di pezzi. • EPROM. Sono memorie a prevalente lettura, utilizzate quando siano necessarie memorie non volatili, ma in cui i dati memorizzati possano venire di volta in volta modificati. In questo casi i dati, scritti con mezzi elettrici, possono venire cancellati, rendendo la memoria nuovamente disponibile, con l’esposizione del chip a radiazione ultravioletta attraverso un’apposita finestra in vetro di quarzo. • EEPROM. Sono memorie molto simili alle EPROM, ma la cancellazione di un dato viene effettuata elettricamente, permettendo di mantenere il dispositivo nel sistema in cui e’ installato. Le operazioni di scrittura tuttavia sono normalmente molto piu’ lente che non quelle di lettura. Dal punto di vista dell’impiego e delle terminazione EPROM e EEPROM 152 Capitolo IV Memorie e logiche programmabili sono del tutto analoghe alle ROM e alle PROM. Per alcuni modelli addirittura esiste con queste ultime una completa compatibilita’ sia elettrica che meccanica (compatibilita’ pin to pin). 4.3) Struttura base di una memoria. Una memoria e’ essenzialmente costituita delle seguenti parti: una matrice di celle; un decodificatore di indirizzo un circuito di controllo di ingresso e di uscita. In memorie di piccole dimensioni, ad esempio in memorie da 16 celle, il circuito di indirizzamento puo’ essere realizzato con un semplice selettore (linear select), come illustrato in figura 4.1. M M 1 4 1 16 M 16 figura 4.1 E’ opportuno notare in questa struttura circuitale la complessita’ dovuta alla presenza dei 2n collegamenti elettrici necessari all’abilitazione delle singole celle. Tale complessita’ inoltre aumenta esponenzialmente al crescere del numero n di bit di indirizzo. Una valida alternativa e’ l’indirizzamento a matrice illustrato in figura 4.2 (coincident select). 153 Capitolo IV Memorie e logiche programmabili M1 1 Selettore di riga M4 4 1 4 Selettore di colonna figura 4.2 Si ottiene in tal modo una notevole semplificazione della rete dei collegamenti. Si puo’ ritenere pertanto che, tranne per memorie di minime dimensioni, la struttura di base sia quella di figura 4.3. indirizzo di riga D e c o d r i f d i i i g c a a t o r e Din cella di memoria linea di parola linea dei dati matrice di celle Circuito di controllo I/O Dout Decodificatore di colonna indirizzo di colonna figura 4.3 Il decodificatore di riga seleziona un’intera riga di celle. I dati immagazzinati nelle celle connesse con la riga selezionata sono trasferiti al circuito di controllo di ingresso e uscita. A questo punto il dato che interessa viene trasferito all’uscita selezionandolo con il decodificatore di colonna. 154 Capitolo IV Memorie e logiche programmabili Ogni dispositivo di memoria possiede almeno i seguenti segnali: Indirizzo (address) composto dai segnali da applicare ai decodificatori. All’utente non e’ normalmente possibile distinguere tra i bit di selezione di riga e di colonna. L’indirizzo deve pertanto essere considerato come un tutto unico. Lettura/scrittura (read/write). E’ presente ovviamente solo quando necessario e permette di scegliere tra un’operazione di scrittura o una di lettura in o da una determinata cella. Selezione di chip (chip select) che permette o no di abilitare la memoria in questione. Tale segnale si rende indispensabile quando si vogliano realizzare memorie di grandi dimensioni, superiori a quelle del singolo chip, oppure quando memorie accedono assieme ad altri dispositivi allo stesso bus per il trasferimento dei dati. Segnali di ingresso e di uscita (I/O). In certe realizzazioni le linee su cui viaggiano tali segnali possono coincidere. Alimentazione (supply). Alcune realizzazioni, quali EPROM e EEPROM possono richiedere piu’ di una tensione di alimentazione, tuttavia nella maggior parte dei casi e’ sufficiente un’unica tensione. La combinazione di tutti questi segnali organizza il dispositivo di memoria. Piu’ matrici del tipo descritto possono poi essere utilizzate per accedere ad informazioni di lunghezza superiore al bit. Si avranno ovviamente tante linee di I/O quanti sono i bit di informazione cui si vuol accedere contemporaneamente. Si parla in tal caso di parallelismo della memoria, intendendo con tale termine il numero di bit per parola, dove parola e’ l’insieme di bit cui si accede contemporaneamente con un unico indirizzo. Nelle memorie standard il grado di parallelismo e’ di solito una potenza di 2. 4.4) Struttura della cella di memoria RAM. Prima di descrivere i principi di funzionamento di una memoria RAM e’ opportuno accennare alle regole fondamentali cui bisogna attenersi nel progetto di una cella di memoria. 1) 2) 3) 4) Una cella di memoria deve occupare sul chip la minima superficie possibile. I processi di fabbricazione per la sua realizzazione devono essere i piu’ semplici possibile. Le operazioni di lettura e scrittura devono essere le piu’ rapide possibile. La potenza dissipata va minimizzata I primi due punti sono di carattere prevalentemente economico, mentre gli ultimi due riguardano le prestazioni del dispositivo. Le memorie RAM si suddividono poi in memorie bipolari e MOS, statiche e dinamiche. Le memorie bipolari sono piuttosto rare, di capacita’ ridotta, e vengono utilizzate solo in quelle applicazioni in cui sono richieste elevate velocita’ di accesso. La distinzione tra dispositivi statici e dinamici e’ gia’ stata illustrata in precedenza, tuttavia nel caso delle memorie tale distinzione si riflette anche in profonde modificazioni strutturali e di impiego. 4.4.1) Struttura di una cella RAM statica. Una possibile configurazione di una cella RAM statica e’ riportata in figura 4.4. Il cuore della cella e’ un semplice circuito bistabile che comunica con le linee dati attraverso buffer 3-state. Tali buffer, rispettivamente di lettura e di scrittura sono controllati da due porte AND al cui ingresso sono applicati i segnali di selezione di riga e di colonna e quello di read/wite (R/W). 155 Capitolo IV Memorie e logiche programmabili Quando sia X che Y sono a livello basso ambedue le uscite degli AND si trovano a livello basso e pertanto i quattro buffer 3-state risultano disabilitati. DATA write buffer read buffer connessione wired OR read buffer write buffer Y DATA R/W X figura 4.4 Quando invece X, Y e R/W passano allo stato alto risultano abilitati i write buffer permettendo un’operazione di scrittura nella cella; cambiando lo stato della linea R/W si disabilitano i write buffer mentre vengono abilitati i buffer di lettura. Il valore contenuto nella cella viene in tal caso trasferito alle linee dati. Realizzare una memoria RAM utilizzando la cella appena descritta risulta molto semplice. In figura 4.5 e’ riportato lo schema di interconnessione per una memoria da quattro celle (4 bit), per la quale sono necessarie solo quattro porte in piu’ rispetto a quelle necessarie alla realizzazione delle singolo celle. data out buffer data in buffer DATA IN DATA OUT DATA R/W DATA R/W D Y 0 X X D R/W D Y1 0 X D R/W 0 0 D Y 0 D R/W X D Y1 1 X1 D R/W X1 Y0 Y1 figura 4.5 Un’osservazione piu’ attenta della cella proposta fa tuttavia osservare che le esigenze di progetto enunciate all’inizio del presente paragrafo non sono sufficientemente rispettate. Infatti, un 156 Capitolo IV Memorie e logiche programmabili circuito costituito da otto porte (escludendo le connessioni “wired-or” che non occupano spazio significativo), da cinque linee di segnale e da almeno due linee di alimentazione non puo’ certo considerarsi efficiente in termini di superficie di silicio occupata. Un primo miglioramento si puo’ ottenere eliminando la necessita’ di una linea di R/W per ogni cella secondo quanto illustrato in figura 4.6. Le due porte AND a tre ingressi delle cella originaria si riducono ad un’unica porta AND a due ingressi che controlla sia il buffer di lettura che quello di scrittura. DATA write buffer read buffer connessione wired OR read buffer write buffer DATA X Y figura 4.6 La lettura viene eseguita connettendo le linee DATA e DATA alle linee di uscita della cella, mentre la scrittura si esegue forzando sulle medesime linee i valori voluti. La cella che cosi’ si ricava potrebbe gia’ essere accettabile, ma un ulteriore livello di semplificazione puo’ essere raggiunto eliminando la porta AND e riorganizzando la configurazione della memoria in modo tale che tutte le celle di una riga siano parzialmente accessibili, mentre solo la cella della colonna selezionata lo sia totalmente. La nuova configurazione circuitale e’ riportata in figura 4.7, mentre in figura 4.8 e’ riportato lo schema completo di una RAM da quattro bit. V dd X BIT (Y) Vss figura 4.7 157 BIT (Y) Capitolo IV Memorie e logiche programmabili La cella cosi’ ottenuta e’ realizzata con soli sei transistori e le linee di segnale si sono ridotte a tre. E’ questa la struttura tipo utilizzata nella maggior parte dei casi per realizzare memorie RAM statiche. D D D X D X X0 D D D D X X R.W=0 X1 BIT BIT BIT Y0 Data in R/W CS BIT Y1 Data bus Amplificatore differenziale + Data out Data bus DB DB figura 4.8 La costruzione di una memoria completa, che utilizzi la cella a sei transistori, introduce alcuni nuovi concetti e terminologie. Significativa e’ la sostituzione delle linee dati con le cosiddette “bit line” che alimentano tutte un bus dati comune. Le “bit line” sono isolate dal bus dati da interruttori MOS comandati dall’indirizzo di colonna. Il bus dati a sua volta e’ pilotato de una coppia di buffer 3-state durante la fase di scrittura, mentre in fase di lettura comunica con l’esterno tramite un amplificatore differenziale e un ulteriore buffer 3-state. Il controllo della RAM e’ poi modificato dalla presenza di un segnale di “chip select” (CS), che negli esempi fatti in precedenza non era presente. Tale segnale si rende necessario poiche’ le RAM sono disposte in un sistema di memoria in maniera matriciale come le celle che costituiscono la singola RAM e i vari chip condividono lo stesso bus dati per trasmettere le informazioni. Ovviamente ad un dato istante deve venire selezionato un unico chip, mentre gli altri devono essere completamente ininfluenti sia per quanto riguarda i dati in ingresso che quelli in uscita. Si supponga, a titolo di esempio, di voler modificare il contenuto della cella X0, Y1 da “0” a “1”.I segnali da applicare alla memoria saranno allora X0, Y1 e CS alti, mentre X1 e Y0 dovranno essere tenuti bassi. Con questa combinazione di valori vengono attivati i buffer di ingresso con DB a livello alto e DB a livello basso. Y1 chiude poi gli interruttori MOS della relativa colonna, mentre X0 chiude gli interruttori MOS della riga relativa, rendendo accessibile la cella X0, Y1. Le “bit line” a questo punto si trovano in una situazione di conflitto per effetto del dato memorizzato in precedenza nella cella. Tuttavia un opportuno dimensionamento delle parti componenti permette di far si’ che il nuovo dato prevalga, forzando la cella nella nuova situazione. Durante le operazioni descritte il segnale R/W, tenuto a livello basso, mantiene il buffer di uscita disattivato, in modo che durante il ciclo di scrittura il dato presente sul bus dati non venga trasferito in uscita. 158 Capitolo IV Memorie e logiche programmabili Si noti che gli interruttori MOS della cella X0, Y0 sono anch’essi chiusi e quindi il contenuto della cella viene trasferito sulle “bit line” della colonna Y0. Tuttavia il valore basso di X1 impedisce un’interazione con la cella X1, Y0, mentre il livello basso di Y0 impedisce il trasferimento del dato dalle “bit line” al bus dati. In modo del tutto analogo puo’ essere compiuta l’operazione di lettura. 4.4.2) Struttura di una cella RAM dinamica. Una cella RAM dinamica si puo’ considerare derivata da quella statica di figura 4.7, in cui tuttavia sono stati eliminati i transistori di carico. Il dato viene in questo caso memorizzato nelle capacita’ parassite di gate, come e’ illustrato in figura 4.9 ( a ). In questa situazione circuitale si tende pertanto a perdere l’informazione se non si interviene con un’operazione di riscrittura prima che la tensione ai capi della capacita’ sia scesa al di sotto di un determinato livello. Quest’operazione e’ detta rinfresco (refresh) del dato. linea dei dati (W) T 3 T1 linea dei dati (R) linea di parola (R) linea di parola T4 T2 T2 T3 T1 linea di parola T1 linea di parola (W) linea dei dati (D) linea dei dati linea dei dati (D) (a) Cella a 4 transistori (b) Cella a 3 transistori (c) Cella a 1 transistore figura 4.9 Nella cella a quattro transistori di figura 4.9 (a) tuttavia i transistori T1 e T2 lavorano in modo complementare e si e’ quindi in presenza di una ridondanza di informazione. Una cella ottenuta eliminando uno di questi transistori e’ la cella a tre transistori di figura 4.9 ( b ). In fase di lettura il dato e’ decodificato dallo stato del transistore T1, in conduzione o meno in base alla carica immagazzinata nelle capacita’ parassita gate-source. Pertanto quanto T3 passa a condurre T1 controlla il passaggio di corrente sulla linea dei dati ( R ) e funge quindi da convertitore tensione-corrente. Si puo’ tuttavia giungere ad una cella ancora piu’ semplice, realizzata con un unico transistore, come illustrato in figura 4.9 (c). L’operazione di lettura avviene in tal caso come segue: In un primo tempo la tensione della linea dei dati viene portata allo stato alto. Successivamente, quando T3 viene passa in conduzione, alzando il livello di tensione della linea di parola, un amplificatore a soglia (sense amplifier) legge uno “0” o un “1” in funzione della variazione di tensione che viene a verificarsi o meno sulla linea dei dati, come illustrato in figura 4.10. 159 Capitolo IV Memorie e logiche programmabili Tensione della linea dei dati lettura di un "1" T1 ON lettura di uno "0" attivazione del sense amplifier tempo figura 4.10 A queste operazioni segue evidentemente un refresh. Ogni linea dei dati e’ collegata a un “sense amplifier” che entra a far parte del circuito di controllo di figura 4.3. Per ottenere elevate sensibilita’ e per questioni di stabilita’ il “sense amplifier” e’ spesso realizzato in configurazione differenziale. 4.4.3) Struttura di una memoria RAM dinamica. A titolo di esempio in questo paragrafo verranno illustrati i principi secondo i quali funziona una semplice memoria RAM dinamica da 4 bit, il cui schema e’ riportato in figura 4.11. Le forma d’onda dei segnali che controllano questo circuito sono illustrate in figura 4.12. linee dei dati V V rif rif Precarica Precarica X 0 C X b C s C C C C C b s 1 V b s V rif Tristate sense amplifier C b refresh read s rif Tristate sense amplifier refresh read write read Y Y data bus uscita dati ingresso dati figura 4.11 Si osservi che un ciclo, sia esso di lettura che di scrittura, puo’ essere suddiviso in due periodi distinti, detti rispettivamente periodo attivo e periodo di precarica. Durante il periodo attivo vengono eseguite le operazioni richieste, mentre durante il periodo di precarica la memoria viene preparata per le operazioni successive. Durante quest’ultimo periodo, con riferimento alla figura 160 Capitolo IV Memorie e logiche programmabili 4.11, non si fa altro che connettere le linee dei dati, tramite i rispettivi interruttori MOS controllati dall’impulso di precarica, alla tensione di riferimento Vrif, di valore intermedio tra i livelli di tensione corrispondenti allo “0” e all’”1” logici. Alla fine del periodo di precarica la linea dei dati si trovera’ ad una tensione che in pratica coincide con Vrif, poiche’ l’amplificatore di refresh si trova nel suo stato ad alta impedenza. CICLO DI LETTURA - Ingresso WRITE basso indirizzi precarica READ refresh Uscita dati dato valido CICLO DI SCRITTURA - Ingresso READ basso WRITE Ingresso dati periodo attivo precarica figura 4.12 Appena terminato il periodo di precarica, le linee di indirizzo selezionate si portano a livello alto. La linea X fara’ condurre i MOS delle due celle situate sulla medesima riga, connettendo le corrispondenti capacita Cs alle linee dati. Di conseguenza le cariche della capacita’ Cs e della capacita’ Cb si ridistribuiscono in modo che sulla linea dei dati si abbia una tensione pari a: VR = (CS .VS + C b .Vrif ) (CS + C b ) Tale tensione vie confrontata dal “sense amplifier” con Vrif e quindi la rivelazione del dato memorizzato in ciascuna cella avviene senza difficolta’. Il dato della colonna selezionata passa poi sul bus dati e, tramite il “data bus buffer”, passa al terminale di uscita. Se a questo punto il ciclo terminasse, i dati presenti nelle celle lette risulterebbero fortemente degradati. La lettura cioe’ sarebbe di tipo distruttivo. Gli amplificatori di refresh ovviano a tele inconveniente, ripristinando i corretti valori di tensione nelle celle. E’ ovvio che tutte le celle accessibili della stessa linea devono venire rinfrescate contemporaneamente. Si noti che nel ciclo di lettura, durante il periodo attivo, l’indirizzamento termina prima di qualsiasi altro segnale, allo scopo di proteggere i dati memorizzati, che potrebbero deteriorarsi se 161 Capitolo IV Memorie e logiche programmabili piu’ segnali commutassero contemporaneamente prima che le celle vengano isolate dal resto del sistema. L’operazione di scrittura e’ relativamente piu’ semplice. Il segnale “write” abilita il buffer di ingresso e il relativo dato, attraverso l’amplificatore di refresh viene trasferito sulla linea dati selezionata. Si noti che ciascuna cella richiede solo due componenti, due linee di segnale e una linea di alimentazione (quella di massa). Inoltre in condizioni di riposo la cella non dissipa potenza. A fronte di questi vantaggi si ha un aumento del tempo di accesso, determinato dal periodo di precarica e dalla necessita’ di assicurare che ciascuna riga sia periodicamente indirizzata per assicurare il refresh dai dati. Oltre alla necessita’ di refresh e’ di considerevole importanza l’istante di inizio del funzionamento del “sense amplifier”. RAM dinamiche veloci richiedono che il “sense amplifier” inizi a funzionare il piu’ presto possibile; tuttavia anticipare troppo l’inizio del funzionamento riduce eccessivamente la distanza tra le tensioni corrispondenti ai due stati logici sulle linee dati e puo’ dar luogo a fenomeni di instabilita’. La relazione ricavata per VR vale, infatti, solo a regime. La miglior temporizzazione e’ funzione di diversi fattori, quali il rapporto tra la capacita’ delle linee dati e quelle delle celle di memoria., la sensibilita’ del “sense amplifier”, la generazione interna di rumori e altre condizioni. Le considerazioni sul rumore, molto importanti in quanto il “sense amplifier” deve operare su livelli di tensione abbastanza bassi, portano a particolari geometrie nella disposizione delle celle di memoria, che tendono ad ottimizzare la velocita’ di funzionamento e l’immunita’ al rumore. Non si ritiene tuttavia utile in questa sede approfondire l’argomento. 4.5) Esempio di utilizzazione di memorie ROM. Nel presente paragrafo verra' esaminato l'impiego di memorie ROM al fine di utilizzare un monitor televisivo come display alfanumerico. Il principio di funzionamento di tale sistema, capace di visualizzare 16 righe, ciascuna contenente un massimo di 64 caratteri, puo' essere visto con l'ausilio dello schema a blocchi di fig. 4.13. impulso di riga impulso di quadro reset Clock 2 load reset Contatore modulo 64 Clock 1 P6 Q 5 Shift register P 0 C A4 Generatore di caratteri C0 5 M0 M5 Memoria RAM da 64 x 16 parole da 6 bit Q 1 A0 M9 M D D0 6 Uscita video B B0 3 Contatore modulo 11 3 Contatore modulo 16 reset reset figura 4.13 Ogni carattere sia separato da quello successivo da due spazi, e ogni linea di caratteri sia separata dalla successiva da quattro spazi, come illustrato in fig. 4.14. 162 Capitolo IV Memorie e logiche programmabili In tal modo, supponendo che ciascun carattere sia realizzato con una matrice 5 x 7, l'effettivo spazio riservato ad ogni carattere, comprensivo dell'area di separazione tra caratteri e tra righe, risulta essere di 7 x 11. 7 11 figura 4.14 L'intera pagina alfanumerica visualizzata venga poi prelevata da una memoria RAM da 64 x 16 = 1024 parole da 6 bit, in ciascuna delle quali e' contenuto il codice del carattere da visualizzare. I bit di indirizzo di questa memoria saranno pertanto 10 (M0-M9) di cui i primi 6 (M0-M5) individuano la posizione sulla riga in cui visualizzare il carattere, gli ultimi quattro (M6-M9) una delle 16 righe costituenti la pagina. I 6 bit del dato (A0-A5), uscita della parola indirizzata, vengono inviati all'ingresso del generatore di caratteri. Il funzionamento puo' essere descritto nel modo seguente. L'impulso di quadro azzera: Il contatore modulo 64, necessario a indirizzare i 64 caratteri che formano ciascuna riga. Il contatore modulo 16 necessario ad indirizzare ciascuna riga della pagina. Il contatore modulo 11 utilizzato per la scansione delle sette righe che costituiscono ciascun carattere (ingressi R0, R1, R2 del generatore di caratteri) e le quattro righe che costituiscono la spaziatura verticale. L'impulso di riga e' inviato al contatore modulo 11 e al generatore di clock (clock1) che fornisce un treno di 64 impulsi all'ingresso del contatore modulo 64. Un secondo generatore di clock (clock2), sincronizzato con il clock1, permette di serializzare, utilizzando uno shift-register, l'uscita parallela (Q1,..,Q5) del generatore di caratteri. Q1-Q5 sono i cinque bit che formano una linea del carattere e vengono inviati ai primi cinque ingressi paralleli (P0, .., P4) dello shift-register, mentre gli ultimi due ingressi paralleli (P5 e P6) vengono mantenuti costantemente a zero in modo da realizzare la spaziatura orizzontale tra i diversi caratteri della stessa riga. Pertanto per ogni impulso fornito dal clock1 si hanno 7 impulsi di clock2. I sette bit presenti agli ingressi paralleli dello shift-register vengono caricati nel registro stesso con un opportuno ritardo in modo da evitare errori di caricamento per mezzo di un segnale di "load" ricavato dal clock1. Il contatore modulo 11 effettua il conteggio degli impulsi di riga e fornisce i tre bit di indirizzamento B0, B1 e B2 agli ingressi R0, R1 e R2 del generatore di caratteri, in modo da 163 Capitolo IV Memorie e logiche programmabili individuare in sequenza, durante i primi 7 impulsi di ciascun gruppo di 11 impulsi, le sette righe che costituiscono il carattere, mentre durante i successivi quattro impulsi e' necessario azzerare totalmente lo shift-register, in modo da realizzare la spaziatura verticale. E' necessario pertanto realizzare la semplice funzione logica illustrata in fig. 4.15. Stato del contatore B3 B 2 B 1 B 0 Reset 0 0000 0 1 0001 0 2 0010 0 3 0011 0 4 0100 0 5 0101 0 6 0110 0 7 0111 1 8 1000 1 9 1001 1 10 1010 1 Reset = B 3 + B 0 . B1 . B 2 figura 4.15 Il contatore modulo 16 totalizza i gruppi di 11 linee video, cioe' incrementa il suo stato ogni 11 impulsi di riga. Le sue uscite (D0, ..., D3) vengono inviate alla memoria RAM (M6-M9) in modo da indirizzare successivamente le 16 righe che costituiscono la pagina. Infine i sei bit di uscita del contatore modulo 64 (C0-C5 ) sono connessi ai primi sei bit di indirizzo della RAM, per individuare in successione la locazione che contiene il codice di ciascuno dei 64 caratteri che costituiscono la riga. 4.6) Le ROM a maschera. La realizzazione di una cella di memoria ROM non programmabile e’ molto semplice. Quando infatti si vuol ottenere in uscita una tensione bassa e’ sufficiente connettere tra la linea di bit e il potenziale di riferimento un MOS secondo quanto illustrato in figura 4.16. Quando la linea di riga viene portata a potenziale alto il MOS passa in conduzione portando a potenziale di massa la relativa linea di bit. In sede di fabbricazione pertanto devono essere selettivamente realizzati dei MOS in corrispondenza agli “0” logici che si vogliono ottenere in uscita, mentre quando si vuole ottenere un “1” logico le rispettive linee vanno lasciate sconnesse. 164 Capitolo IV Memorie e logiche programmabili bit y1 bit y o linea di riga linea di riga linea di riga figura 4.16 4.7) La cella di memoria EPROM ed EEPROM. La struttura di una cella EPROM o EEPROM de’ del tutto simile a quella di una ROM a maschera. La differenza sostanziale tuttavia risiede nel tipo di MOS utilizzato, che funziona come un elemento programmabile. In sostanza il MOS utilizzato ha la struttura illustrata in figura 4.17. gate 2 G gate 1 S n+ SiO2 p D n+ figura 4.17 Oltre il normale gate presente in tutti i transistori MOS viene realizzato, all’interno dello strato di biossido di silicio un secondo gate (indicato in figura con gate 1), che tuttavia e’ completamente isolato. Questa realizzazione permette di modificare selettivamente la tensione di soglia del dispositivo, portandola al di sopra delle normali tensioni di funzionamento (di solito comprese tra i 3 e i 5 volt). Quando infatti al gate 2 e al drain viene applicata una tensione positiva elevata (15 ÷ 25 V) l’elevato campo elettrico presente nella regione di svuotamento drain-substrato provoca una scarica a valanga. In tale condizione elettroni ad alta energia possono penetrare nello strato di ossido ed accumularsi sul gate 1. Questa carica, quando drain e gate 2 vengono riportati a potenziale zero, forza il potenziale del gate 1 a valori negativi e tale potenziale impedisce la formazione del canale alle normali tensioni di funzionamento. Le elevate proprieta’ dielettriche del biossido di silicio consentono di mantenere la carica intrappolata per periodi di tempo estremamente lunghi, che si stimano essere dell’ordine delle decine di anni. 165 Capitolo IV Memorie e logiche programmabili La carica intrappolata puo’ poi essere rimossa per effetto fotoelettrico con l’esposizione a luce ultravioletta, permettendo in tal modo la cancellazione del dato memorizzato e rendendo il dispositivo nuovamente atto ad essere utilizzato. I tempi di cancellazione sono tuttavia notevolmente lunghi e richiedono lo smontaggio delle EPROM dal circuito in cui sono montate. Questi inconvenienti possono essere superati ricorrendo alle EEPROM in cui sia la lettura che la scrittura avvengono con mezzi elettrici. La struttura del MOS e’ ancora quella a gate flottante, ma lo spessore tra gate 1 e substrato e’ molto sottile (dell’ordine di 100 c). In queste condizioni la carica intrappolata puo’ venire rimossa per effetto tunnel, quando tra gate 2 e substrato viene applicata una tensione dell’ordine dei 10 V, che comunque e’ ancora notevolmente superiore alle normali condizioni operative. In ambedue le tecnologie tuttavia il numero di riprogrammazioni non e’ illimitato. In particolare nelle EEPROM le caratteristiche dei transistori “floating gate” decadono con il numero di programmazioni effettuate a causa degli elettroni che comunque rimangono intrappolati nell’ossido. 4.8) Le ROM programmabili (PROM). La maggior parte dei costruttori di semiconduttori offrono, oltre ai dispositivi che sono gia’ stati descritti, anche ROM programmabili dall’utente finale (programmable ROM) dette PROM. Questi circuiti, come gia’ e’ stato accennato offrono un’elevata flessibilita’ e riducono i costi, soprattutto quando la quantita’ necessaria e’ modesta. Una PROM contiene una matrice di codifica in cui sono realizzate tutte le possibili connessioni, come e’ illustrato in figura 4.18. Xo X1 XM-1 Wo D e c o d i f i c a W1 Wµ codice di ingresso a M bit µ = 2M Yo Y1 YN-2 YN-1 codice di uscita a N bit figura 4.18 Le connessioni sono normalmente realizzate con una striscia di silicio policristallino il cui comportamento e’ simile a quello di un fusibile; quando cioe’ tale striscia viene percorsa da una corrente superiore a un certo valore la connessione si interrompe. L’utente puo’ quindi facilmente bruciare i fusibili di ogni elemento di memoria, realizzando la desiderata funzione ingresso-uscita. Un modo alternativo e sotto certi aspetti piu’ comodo di vedere una ROM di questo tipo e’ quello di immaginarla costituita da un due piani detti rispettivamente piano AND e piano OR, con riferimento a una relazione funzionale ingresso-uscita del tipo somma di prodotti. In altre parole una memoria a sola lettura programmabile sara' costituita da un piano AND fiso, che realizza tutti i termini minimi della variabili di ingresso, mentre il piano OR sara’ programmabile fondendo gli opportuni collegamenti. In figura 4.19 e’ rappresentata la struttura di una PROM da 4 variabili di ingresso e parallelismo 4 in uscita. 166 Capitolo IV Memorie e logiche programmabili Indirizzo X3 X2 X1 X0 Collegamenti del piano OR Collegamenti del piano AND Y 3 Y 2 Y 1 Y 0 Uscita figura 4.19 4.9) I dispositivi logici programmabili. Nell’ambito della realizzazione di circuiti logici digitali un progettista puo’ scegliere tra dispositivi discreti di tipo standard e dispositivi dedicati realizzati ad hoc per una specifica applicazione (si parla in tal caso di ASIC Application Specific Integrated Circuit). Esistono tuttavia dispositivi, i cosiddetti PLD (Programmable Logic Device) che si collocano a meta’ strada tra le due precedenti categorie e sono adatti per applicazioni specifiche essendo completamente personalizzabili dall’utente a seconda delle funzionalita’ richieste, ma conservano una struttura regolare e di volta in volta sempre uguale. Le stesse PROM possono esser fatte rientrare tra i PLD e sono state molto spesso usate come array logici configurabili. Il piu’ grosso inconveniente che esse presentano, al di la’ della loro limitata velocita’, risiede tuttavia nella eccessiva complessita’, che aumenta esponenzialmente con il numero degli ingressi, e nel limitato numero delle linee di uscita. Per superare queste limitazioni gia’ verso la meta’ degli anni ’70 sono state introdotte le prime vere logiche programmabili chiamate rispettivamente PAL (Programmable Array Logic) e la PLA (Programmable Logic Array), cui a breve termine hanno fatto seguito le GAL (Generic Logic Array). Per le prime due la struttura interna e’ simile a quella di una PROM, con i due piani AND e OR gia’ descritti, mentre nelle GAL vengono integrati anche flip-flop, porte XOR e altri dispositivi, con un’organizzazione in sottoinsiemi detti macrocelle configurabili, tra le quali si possono effettuare connessioni e realizzare anche loop di reazione. La disponibilita’ di sistemi di calcolo a basso costo e di software in grado di trasformare le equazioni booleane in “mappe di fusibili” ha favorito un ampio utilizzo di questi dispositivi. 167 Capitolo IV Memorie e logiche programmabili Non si vuole in questa trattazione, di necessita’ di tipo qualitativo e di primo approccio all’argomento, analizzare nel dettaglio i diversi tipi di dispositivo prodotti. Sara’ sufficiente dire che la densita’, cioe’ il numero di funzioni integrabile sul singolo chip, e’ andata via via aumentando; che accanto alle tecniche a “fusibile” sono state introdotte quelle ad “antifusibile” con le quali la programmazione crea un cortocircuito anziche’ un circuito aperto; che esistono dispositivi basati sia sulla tecnologia EPROM a ultravioletti che su quella EEPROM; che esistono dispositivi in cui la logica viene controllata attraverso opportuni bit caricati in apposite celle RAM statiche localizzate sul chip stesso e cosi’ via. 4.9.1) La logica a matrice programmabile (PAL). La logica a matrice programmabile e’ molto simile ad una PROM in quanto e’ costituita anch’essa da un piano AND e uno OR. Tuttavia a differenza di quest’ultima il piano OR e’ fisso mentre e’ programmabile quella AND. Le PAL sono utilmente impiegate per realizzare equazioni Booleane in luogo delle piu’ ingombranti e complesse PROM. Sono ovviamente disponibili solo collegamenti OR specifici, mentre tutti quelli AND sono realizzabili. La programmazione consiste nel bruciare le connessioni AND indesiderate. In figura 4.20 e’ riportata la struttura di una PAL da 16 parole per 4 bit. Le connessioni fusibili sono rappresentate con una X. Ingresso X3 X2 X1 X0 Collegamenti del piano OR Collegamenti del piano AND Y 3 Y 2 Uscita figura 4.20 168 Y 1 Y 0 Capitolo IV Memorie e logiche programmabili 4.9.2) Le matrici logiche programmabili (PLA). Tra i dispositivi programmabili di tipo AND-OR le PLA sono i piu’ flessibili in quanto in esse esistono tutti i possibili collegamenti sia sul piano AND che su quello OR, come mostrato in figura 4.21. La programmazione anche in questo caso consiste nel bruciare le connessioni indesiderate. Ingresso X3 X2 X1 X0 Collegamenti del piano OR Collegamenti del piano AND Y 3 Y 2 Y 1 Y 0 Uscita figura 4.21 La flessibilita’ e la convenienza di una PLA rispetto una PROM emerge chiaramente dal seguente esempio. Si supponga di dover lavorare con 16 ingressi e 8 uscite. In una PROM in tal caso si dovrebbero avere 216 = 65535 parole da 8 bit per un totale di 524288 bit e con questo sistema si potrebbero realizzare 8 funzioni logiche combinatorie da 16 variabili, esprimendo ciascuna funzione logica nella forma canonica somma di prodotti. Si consideri allora un sottoinsieme della ROM appena descritta. Si abbiano sempre 16 ingressi e 8 uscite, ma anziche’ 65535 parole se ne abbiano a disposizione ad esempio solamente 48. Ciascuna di queste parole prende il nome di prodotto parziale. Il termine diviene autoesplicativo considerando che il piano AND e’ completamente programmabile e ciascun prodotto non contiene tutte le variabili di ingresso. Si parla in questo caso di una PLA 16 x 48 x 8. Il piano AND e’ detto matrice di decodifica ed e’ formato da 48 AND con un numero massimo di ingressi pari a quello delle variabili di ingresso al dispositivo. Il piano OR, detto matrice di codifica, e’ anch’esso completamente programmabile e consiste di 8 gate OR le cui uscite sono le uscite del dispositivo. Gli ingressi possibili di ciascun OR sono in numero pari a quello dei prodotti parziali, ma quelli non necessari possono venire esclusi per fusione del relativo collegamento. 169 Capitolo IV Memorie e logiche programmabili In sostanza si vede che con una PLA non e’ piu’ necessario esprimere una funzione booleana in forma canonica, ma e' possibile implementarla in una qualsiasi forma semplificata, purche’ somma di prodotti. E’ evidente il risparmio circuitale che se ne puo’ ricavare. Da un altro punto di vista si puo’ affermare che mentre una PROM memorizza dati binari, una PLA memorizza funzioni booleane. Si considerino ad esempio le due seguenti funzioni. y1 = A 3 .A 0 + A 9 .A 4 .A1 + A11 .A10 .A 7 .A 3 + A13 + A15 .A14 y 2 = A 5 .A 4 .A 0 + A 9 .A 4 .A1 + A12 .A 6 Per realizzare queste due funzioni sono necessari solo sette prodotti parziali (e non otto in quanto il prodotto A 9 .A 4 .A e’ comune ad ambedue le funzioni. Facendo quindi riferimento ad una PLA 16 x 48 x 8 i rimanenti 41 prodotti parziali rimangono disponibili per le altre sei uscite da y3 a y8. La programmazione della PLA avviene creando una mappa dei fusibili (o delle connessioni desiderate quando la PLA viene programmata dal fabbricante con una maschera di metallizzazione). Per l’esempio che e’ stato preso in considerazione la mappa avra’ l’aspetto riportato in tabella 4.2. Nella zona ingresso un simbolo X sta ad indicare che vengono bruciati ambedue i collegamenti con la relativa variabile, uno “0” che rimane integro il collegamento con A i , un “1” quello con A i . Nella zona uscite uno “0” indica la bruciatura del collegamento con il relativo prodotto parziale. Prodotto Parziale TABELLA 4.2 INGRESSI USCITE 15 14 13 12 11 10 9 X X X X X X X 8 X 7 X 6 X 5 X 4 X 3 0 2 X 1 X 0 1 Y1 1 Y2 0 X X X X X X 0 X X X X 1 X X 0 X 1 1 A11 .A10 .A 7 .A 3 X X X X 1 0 X X 0 X X X 1 X X X 1 0 A13 X X 1 X X X X X X X X X X X X X 1 0 A15 .A14 0 1 X X X X X X X X X X X X X X 1 0 A 5 .A 4 .A 0 X X X X X X X X X X 1 0 X X X 1 0 1 A12 .A 6 X X X 1 X X X X X 1 X X X X X X 0 1 A 3 .A 0 A 9 .A 4 .A1 In sostanza una PLA puo’ gestire, a parita’ di complessita’, un maggior numero di ingressi ed e’ piu’ economica di una PROM. E’ evidente tuttavia che puo’ venire vantaggiosamente utilizzata solo se i prodotti parziali necessari sono una piccola frazione delle possibili combinazioni di ingresso. 4.9.3) I gate array programmabili (PGA) e i dispositivi ad elevata complessita’. Sotto tale dizione vengono annoverati tutta una serie di dispositivi ad elevata densita’ di integrazione. L’architettura e’ normalmente basata su una struttura regolare di blocchi di logica configurabile interconnettibili tramite opportune linee circondati da blocchi di circuiti che provvedono all’input e all’output. 170 Capitolo IV Memorie e logiche programmabili A rigore i gate array dovrebbero contenere solamente un gran numero di dispositivi logici elementari, la cui programmazione consiste semplicemente nello stabilire le volute interconnessioni. Esistono tuttavia elementi logici piu’ complessi, al cui interno si trovano anche dispositivi sequenziali, che piu’ propriamente dovrebbero essere chiamati dispositivi logici programmabili ad elevata complessita’; tuttavia non e’ ben chiaro dove possa essere fissato il confine tra i due tipi di dispositivo e pertanto nel seguito non se ne terra’ conto. La personalizzazione da parte dell’utente puo’ venire fatta in diversi modi: con una metallizzazione, con la tecnica a fusibile o a antifusibile, ma molto spesso avviene caricando in modo seriale o parallelo i dati di configurazione in una EPROM o una EEPROM o ancora prelevando tali dati dall’esterno e memorizzandoli in apposite celle di RAM appartenenti al dispositivo. Si parla in tal caso di dispositivi programmabili in campo (ad esempio di FPGA – Field Programmable Gate Array). Con l’ultima modalita’ di programmazione citata non vi e’ alcuna limitazione sul numero delle possibili riprogrammazioni e i dispositivi possono venire utilizzati in progetti in cui l’hardware cambi dinamicamente o quando sia necessario adattare l’hardware a diverse applicazioni. Una volta testato e consolidato il progetto si puo’ poi passare a versioni del dispositivo a maschere in cui le celle di RAM e la logica di connessione vengono rimpiazzate da metallizzazioni, conservando tuttavia la compatibilita’ con i componenti programmabili che sostituiscono. Gli elementi fondamentali dei dispositivi programmabili sono i blocchi di logica configurabile (Configurable Logic Block – CLB) e i blocchi di ingresso-uscita (Input Output Block – IOB). I primi costituiscono il supporto su cui verranno realizzate le funzioni logiche relative all’applicazione, i secondi le interfacce tra gli ingressi e le uscite del circuito integrato e le linee interne di segnale. Molto spesso sono poi disponibili anche altri elementi, quali buffer 3-state associati a ciascun CLB, decodificatori di indirizzi, oscillatori, ecc. La complessita’ e’ mediamente compresa tra 10.000 e 25.000 porte equivalenti, ma si puo’ giungere anche a 250.000 porte equivalenti. Senza alcuna pretesa di completezza la struttura di un blocco CLB potrebbe essere quella riportata nella figura 4.22, che rappresenta lo schema a blocchi di un dispositivo Xilinx (XC4000). C4 .... C1 4 N1 G4 G3 G2 G1 F4 F3 F2 F1 D in/H 2 SR/Ho Ec Bypass Controllo Funzione logica di S/R D YQ SD G4 .. G1 Funzione logica di H Ec RD 1 Fi , Gi , N1 Y Funzione logica di Controllo Bypass S/R D SD XQ F4 .. F1 Ec RD Clock 1 Multiplexer controllati dal programma di configurazione X figura 4.22 171 Capitolo IV Memorie e logiche programmabili All’ingresso si hanno due generatori di funzioni logiche (F e G) a quattro ingressi (F1 – F4 e G1 – G4), seguiti da un terzo (H), i cui ingressi possono essere le uscite dei precedenti, oppure possono provenire dall’esterno. Dato che il principio di funzionamento e’ quello delle tabelle di look-up, e’ possibile usare F e G come array di celle di memoria configurabili in 16x2, 32x1 o 16x1 bit. Si ha quindi disponibilita’ di RAM direttamente sul chip. Ogni CLB contiene poi due flip-flop di tipo D, che possono essere usati assieme ai due generatori di funzioni oppure indipendentemente. E’ possibile scegliere se rendere attivo il clock sul fronte di salita o su quello di discesa; si dispone inoltre di un ingresso di abilitazione per il clock (EC – clock enable) e di un ingresso di set (o di reset) asincrono. E’ interessante notare che la realizzazione del clock enable viene effettuata senza anteporre alcuna porta all’ingresso del clock in modo da evitare di introdurre ritardi indesiderati e da minimizzare il conseguente fenomeno del clock-skew, oltre che di possibili glitch. In funzione del segnale CE si fa passare l’ingresso esterno, oppure si fa ricircolare l’uscita, inibendo cosi’ il clock, come illustrato in figura 4.23. D D Q Q CE CLK figura 4.23 Per facilitare l’implementazione e per migliorare le prestazioni di sommatori, sottrattori, accumulatori, comparatori e contatori ogni cella contiene della logica aritmetica dedicata alla generazione veloce del riporto (Fast Carry Logic), che tuttavia nello schema semplificato di figura 4.22 non compare. I blocchi di ingresso e di uscita costituiscono poi l’interfaccia tra i terminali fisici del circuito integrato e la logica interna e sono configurabili dall’utente. Ogni IOB controlla un pin e puo’ essere configurato come ingresso, come uscita o come linea bidirezionale. I segnali possono uscire ed entrare direttamente dall’esterno oppure possono essere memorizzati in appositi flip-flop. In tutti i casi tuttavia i segnali vengono opportunamente amplificati con dei buffer. In figura 4.24 e’ riportato lo schema semplificato di un IOB. Pull-up Pull-down passivo Slew rate control CE Out D Q output buffer Output Clock PAD input buffer I1 I2 Input Clock Q D ritardo figura 4.24 172 Capitolo IV Memorie e logiche programmabili A maggior chiarimento delle possibili strutture dei blocchi di logica configurabile si possono citare gli elementi della serie FLEX 8000 dell’ALTERA, che hanno una struttura piu’ semplice di quelli citati, ma sostanzialmente presentano un’architettura analoga. L’elemento logico di base (Logic Element –LE) contiene un generatore di funzioni a quattro ingressi il cui principio di funzionamento e’ sempre quello delle tabelle di look-up, un flip-flop programmabile, una catena di riporto (carry) e quella che viene chiamata “cascade chain”, secondo la struttura illustrata in figura 4.25. Tabella di look-up carry in cascade in catena di Carry cascade chain D P Q LE out C logica di clear-preset selezione del clock clock carry out cascade out figura 4.25 Il generatore di funzioni permette di implementare qualsiasi funzione di quattro variabili. Il flip-flop programmabile puo’ venire configurato per funzionare come D, T, JK o SR. I segnali di controllo di clock, clear e preset possono essere sia segnali che provengono dall’esterno attraverso pin dedicati, sia segnali interni. Si noti inoltre che se si dovessero generare funzioni puramente combinatorie, il flip-flop puo’ essere scavalcato e l’uscita del generatore di funzioni puo’ venire riportata direttamente in uscita del blocco. L’architettura realizzata mette poi a disposizione due itinerari ad alta velocita’ per i dati, la catena di carry e la “cascade chain”, che permettono l’inteconnessione con le macrocelle adiacenti, purche’ appartenenti alla stessa riga, senza ricorrere alle risorse programmabili di connessione del dispositivo. La catena di carry fornisce una funzione di carry veloce (<1 nsec.) tra le macrocelle. Il segnale di carry-in dai bit di ordine piu’ basso viene utilizzato sia dalla LUT sia viene trasferito alla successiva porzione della catena di carry. Questa risorsa permette di implementare facilmente contatori e sommatori di qualsiasi lunghezza. La “cascade chain” permette di implementare funzioni combinatorie con un numero di ingressi anche molto elevato. LUT adiacenti possono essere utilizzate per calcolare in parallelo opportune porzioni della funzione; la “cascade chain” connette poi serialmente i valori intermedi utilizzando una logica AND o una logica OR (utilizzando il teorema di De Morgan) secondo lo schema illustrato in figura 4.26. 173 Capitolo IV Memorie e logiche programmabili AND cascade chain OR cascade chain LUT LUT LUT LUT LUT LUT figura 4.26 Ciascuna delle celle che sono state sommariamente descritte puo’ poi operare in uno di quattro modi fondamentali. In figura 4.27 sono illustrati per sommi capi questi quattro modi di funzionamento. Modo normale: tale modalita’ operativa viene utilizzata in applicazioni logiche di tipo generale e per realizzare funzioni logiche di un elevato numero di variabili, dove la “cascade chain” puo’ essere utilmente sfruttata. L’uscita della tabella di look-up (LUT) puo’ venire combinata con l’ingresso “cascade in” in modo da realizzare funzioni complesse. Modo aritmetico: In questo modo operativo sono disponibili due tabelle di look-up, ideali per realizzare sommatori, accumulatori e comparatori. Una delle due LUT realizza una funzione di tre variabili, l’altra sintetizza il bit di riporto (carry). Contatore bidirezionale: sono disponibili in tal caso segnali di abilitazione, di conteggio avanti/indietro sincrono, di caricamento di dati. Vengono usate due LUT da tre bit. La prima genera il dato di conteggio, la seconda un bit veloce di carry. Un multiplexer da due a una linea permette il caricamento sincrono del dato. E’ possibile anche il caricamento asincrono attraverso gli ingressi di clear e preset del flip-flop. Contatore azzerabile: questo modo di funzionamento e’ del tutto simile a quello del contatore bidirezionale con l’unica differenza che anziche’ una funzione di conteggio avanti/indietro viene implementato un azzeramento sincrono. 174 Capitolo IV Memorie e logiche programmabili MODO NORMALE CONTATORE BIDIREZIONALE cascade in carry in cascade in carry in LE out dato 1 dato 2 D Q LUT (4) LUT (3) LE out Q D 1 enable up/down 0 dato dato 3 dato 4 cascade out cascade out LUT (3) load carry out CONTATORE AZZERABILE MODO ARITMETICO carry in cascade in carry in LE out dato1 dato 2 D LUT Q D 1 enable clear (3) LUT (3) Q LE out 0 dato LUT cascade out LUT (3) cascade out (3) load carry out carry out figura 4.27 Gli elementi logici descritti vengono poi arrangiati in gruppi di otto, formando quelli che vengono chiamati “logic array block” (LAB), formando nell’insieme del componente una struttura a grana piu’ grossa che facilita un’efficiente interconnessione nelle strutture complesse di elevate prestazioni. Ciascun LAB (figura 4.28) dispone di quattro segnali di controllo che possono essere utilizzati in ciascuno degli otto elementi. Questi segnali, quali ad esempio il clock globale, il reset o il preset, che devono avere una bassa dispersione del ritardo per minimizzare i problemi di skew, possono essere ricavati da terminali di ingresso dedicati o attraverso i pin di I/O o ancora da qualsiasi segnale interno attraverso le linee di interconnessione tra i LAB. Interconnessione di riga 24 4 connessione tra riga e colonna 4 carry e cascade in dei LAB a sinistra interconnessione locale dei LAB interconnessione di colonna 2 4 32 canali 4 4 4 8 18 LE 1 LE 2 LE 3 segnali di controllo dei LAB 4 LE 4 4 LE 5 4 4 LE 6 LE 7 4 LE 8 8 2 carry e cascade out per i LAB a destra figura 4.28 175 Capitolo IV Memorie e logiche programmabili L’interconnessione tra LAB e dispositivi di I/O e’ assicurata da una serie di canali di comunicazione orizzontali e verticali che attraversano l’intero dispositivo. I LAB sono sistemati in una struttura a matrice e ogni riga di LAB ha una riga dedicata di interconnessioni che viene utilizzata per il colloquio bidirezionale dei LAB della stessa riga. Le interconnessioni di colonna servono al colloquio tra elementi di righe diverse, secondo quanto schematicamente illustrato in figura 4.29 canali di colonna (16) canali di riga ciascuna LE pilota un canale di riga LE1 LE2 reazioni locali ciascuna LE pilota fino a due canali di colonna figura 4.29 Infine ciascuna riga e ciascuna colonna e’ connessa ad un certo numero di elementi di I/O come riportato in figura 4.30. IOE IOE IOE IOE 1 IOE IOE 1 interconnessione di riga 8 IOE IOE 8 LAB A1 LAB A2 1 IOE IOE 1 8 IOE interconnessione locale del LAB IOE 8 LAB B1 LAB B2 interconnessione di colonna IOE IOE IOE IOE figura 4.30 La struttura logica di questi ultimi e’ riportata in figura 4.31. 176 Capitolo IV Memorie e logiche programmabili controlli di I/O alle interconnessioni di riga o di colonna dalle interconnessioni di riga o di colonna Q D inversione programmabile CLR controllo di slew rate figura 4.31 Ciascun pin di I/O puo’ venire utilizzato come ingresso, come uscita o in modo bidirezionale; e’ dotato di un registro che a sua volta puo’ essere utilizzato sia come elemento di ingresso che di uscita e permette l’aggiustamento delle entrate in modo da ottenere il miglior compromesso tra velocita’ operativa e rumore. E’ ovvio che le due architetture sommariamente descritte non sono le sole possibili. L’intento secondo il quale sono state presentate e’ semplicemente quello di dare un’idea della flessibilita’ e della complessita’ dei componenti VLSI disponibili al giorno d’oggi. Per maggiori approfondimenti si rimanda a testi specialistici sull’argomento. 4.10) I sistemi di sviluppo. Per gestire le potenti risorse dei dispositivi programmabili risulta indispensabile avvalersi di adeguati strumenti software. Normalmente tutte le case costruttrici forniscono sistemi di sviluppo completi per i loro componenti. Di solito si puo’ ritenere che la metodologia di progetto si sviluppi in tre passi, strettamente legati tra loro: ♦ Descrizione del progetto (tramite schema o descrizione testuale) ♦ Implementazione ♦ Verifica Il flusso operativo e’ riportato in figura 4.32 e, come si puo’ vedere, riguarda un procedimento iterativo durante il quale qualsiasi correzione e/o ottimizzazione fa ritornare in ogni caso alla fase di descrizione. 177 Capitolo IV Memorie e logiche programmabili simulazione funzionale Descrizione Verifica (Design verification) (Design entry) simulazione temporale schema o testo simulazione verifica sul circuito analisi temporale statica Implementazione (Design implementation) partizione, posizionamento e interconnessione figura 4.32 4.10.1) Descrizione delle funzionalita’ richieste (design entry). La descrizione grafica basata sullo schema circuitale e’ quella piu’ semplice e immediata. Oltre ai blocchi fondamentali presenti fisicamente nelle celle elementari della FPGA i sistemi di sviluppo offrono librerie di blocchi gia’ pronti corrispondenti a funzioni logiche piu’ o meno complesse, quali contatori, registri, multiplexer ecc. E’ inoltre possibile definire blocchi personalizzati basati su combinazioni di componenti presenti in libreria. L’approccio descritto e’ tuttavia conveniente solo per progetti relativamente semplici. Per sistemi piu’ complessi, descritti tramite equazioni booleane o macchine a stati logici, e’ piu’ conveniente fare riferimento alle descrizioni testuali come il VHDL (Very high speed integrated circuit Hardware Description Logic). In questo modo ci si svincola dalla struttura del dispositivo programmabile e si puo’ trasportare facilmente il progetto su PLD prodotti da altre case o comunque aventi differenti strutture interne. Esistono comunque dei punti di incontro tra i due metodi; e’ possibile infatti mescolarli all’interno dello stesso progetto, descrivendo alcuni blocchi per via grafica alcuni blocchi e altri tramite HDL. Molto spesso l’ambiente di sviluppo e’ in grado di gestire una struttura gerarchica, con livelli superiori descritti graficamente e livelli piu’ bassi, che definiscono la logica di ogni blocco, descritti nel modo piu’ opportuno. Comunque il risultato finale di questa fase del processo, qualsiasi sia il metodo utilizzato, e’ una “netlist”, cioe’ un elenco dei blocchi utilizzati e delle relative interconnessioni. 4.10.2) Verifica (design verification). La verifica di un progetto su PGA richiede una combinazione di test sul circuito stesso, simulazioni con e senza ritardi temporali, e stime dei tempi di propagazione sui vari percorsi del segnale, in modo da determinare situazioni critiche e limitanti per le prestazioni dell’intero sistema. Per comprendere meglio come vengano effettuate queste operazioni si consideri la figura 4.33. 178 Capitolo IV Memorie e logiche programmabili Design entry Functional simulation Implementation Static timing analysis Timing simulation figura 4.33 Simulazione funzionale. Una volta terminata la prima descrizione del circuito (Design Entry) si effettua una simulazione funzionale, cioe’ una verifica del funzionamento logico del sistema. In questa fase non si tiene conto dei ritardi introdotti dalla logica e dalle linee di interconnessione, ma si fa riferimento solo alla “netlist” in modo da rendere facilmente evidenti le relazioni causa-effetto tra ingresso e uscita di ogni blocco. Il sistema di sviluppo permette di selezionare direttamente sullo schema i punti da testare, imponendo opportuni stimoli sugli ingressi e verificando il conseguente andamento delle uscite mediante un’opportuna finestra di visualizzazione. Dopo aver effettuato la simulazione funzionale, se non si e’ verificato alcun errore di logica, si passa all’implementazione del circuito mediante le risorse del dispositivo scelto. Il passo successivo poi consiste nell’analisi temporale del sistema e viene eseguito utilizzando l’analizzatore temporale (Timing Analyzer) e la simulazione temporale (Timing Simulation). Implementazione (Design Implementation). Una volta scelto il dispositivo su cui effettuare l’implementazione e descritto correttamente il comportamento voluto per il sistema, appositi programmi provvedono a creare una corrispondenza tra le funzioni richieste e le risorse a disposizione, determinando il posizionamento ottimale e le connessioni tra i CLB e gli IOB. Queste operazioni vengono compiute con un buon grado di automazione, permettendo all’utilizzatore di intervenire o meno nelle varie fasi del processo. E’ possibile, per esempio, effettuare tramite un’opportuna interfaccia grafica un’operazione di “floorplanning”, cioe’ di disposizione “manuale” di alcuni o di tutti i blocchi su una certa area 179 Capitolo IV Memorie e logiche programmabili dell’array. Si possono inoltre introdurre vincoli sulla piedinatura e sulle temporizzazioni di alcuni segnali particolarmente critici. L’andamento dei vari passi dell’implementazione viene costantemente monitorato e documentato mediante opportuni file. Analisi temporale statica. Il “Timing Analyzer” permette di eseguire un’analisi temporale statica di un progetto “sbrogliato”, cioe’ di un progetto di cui siano stati definiti i percorsi che realizzano i vari segnali e collegano i blocchi necessari. Il termine “statica” e’ relativo al fatto che viene effettuata un’analisi dei percorsi che uniscono tutte le coppie di punti del circuito, senza inserire stimoli agli ingressi dei blocchi. Il circuito comunque deve essere sincrono, composto solo da flip-flop e da logica combinatoria. Il software permette di organizzare e visualizzare i dati necessari ad analizzare i percorsi critici nel circuito ed evidenzia i percorsi aventi i maggiori ritardi. Essendo basato sui dati dei ritardi tra i vari blocchi relativi ad ogni specifico dispositivo programmabile, e’ possibile verificare velocemente l’effetto dovuto all’utilizzo di chip con prestazioni diverse in termini di velocita’ di risposta. I dati necessari vengono forniti dalla casa costruttrice e vengono determinati nelle condizioni di funzionamento piu' gravose. I risultati delle analisi dei vari tipi di ritardo vengono riportati dal Timing Analyzer sotto forma di opportuni rapporti che riassumono i casi peggiori e danno la possibilita’ di stimare la massima frequenza di clock del dispositivo, valutata come l’inverso del massimo ritardo che si puo’ avere. I percorsi dei segnali del circuito si dividono in sei categorie fondamentali: • • • • • • Clock to Setup Clock to Pad Pad to Setup Pad to Pad Clock input Clock Skew Prima di descrivere i vari tipi di percorso e’ opportuno ricordare che viene definito tempo di setup l’intervallo di tempo entro il quale il segnale di ingresso deve essere stabile prima che il clock divenga attivo, mentre viene definito tempo di hold l’intervallo di tempo entro il quale il segnale di ingresso deve rimanere stabile dopo che il clock e’ tornato passivo. clock to setup Questo tipo di percorso inizia all’uscita Q di un flip-flop o di un latch e termina all’ingresso di un altro flip-flop, latch o RAM, elementi che necessitano di un periodo di assestamento (setup time) prima che agisca il clock. Esso comprende il ritardo che si ha nel primo flip-flop, da quando agisce il clock a quando e’ disponibile la corrispondente uscita (clock-to-Q-delay), il ritardo dovuto al percorso da un flip-flop all’altro e il tempo di setup del secondo flip-flop. Il tempo che il segnale impiega sull’intero percorso deve essere minore del periodo di clock. In figura 4.34 e’ rappresentato un generico percorso di questo tipo con il corrispondente diagramma di temporizzazione. 180 Capitolo IV Memorie e logiche programmabili D Q interconnessioni e logica D Q Clock clock dato valido dato valido ritardo da clock a uscita ritardo della logica e delle interconnessioni tempo di setup ritardo del percorso e minimo periodo di clock figura 4.34 Clock to Pad Un percorso di questo tipo ha inizio all’uscita di un flip-flop e termina su un pin di uscita del chip. Esso comprende il ritardo clock-to-Q del flip-flop e il ritardo relativo al percorso che porta all’uscita, come illustrato in figura 4.35. D Q interconnessioni e logica pad Clock clock dato valido dato valido ritardo da clock a uscita ritardo della logica e delle interconnessioni ritardo del percorso periodo minimo di clock figura 4.35 181 ritardo d'uscita margine esterno Capitolo IV Memorie e logiche programmabili Pad to setup Il percorso ha inizio su un ingresso del chip e termine all’ingresso di un flip-flop o di una RAM. Il tempo corrispondente a tale percorso e’ quello richiesto al dato per entrare nel chip, attraversare la logica e3 le risorse di connessione presenti e arrivare al flip flop prima che agisca il clock, come mostrato in figura 4.36. interconnessioni e logica pad D Q Clock clock dato valido dato valido margine esterno ritardo di ingresso ritardo della logica e delle interconnessioni tempo di setup ritardo del percorso periodo minimo di clock figura 4.36 Pad to pad Il percorso inizia su un ingresso del chip e termina su un pin di uscita. Il tempo corrispondente e’ il massimo tempo richiesto affinche’ il segnale entri nel chip, si propaghi attraverso la logica e i collegamenti e lasci il chip. In questo caso non vi e’ alcuna relazione con il segnale di clock e in figura 4.37 e’ schematizzato un tale tipo di percorso. interconnessioni e logica pad pad dato valido dato valido ritardo di ingresso ritardo della logica e delle interconnessioni ritardo del percorso figura 4.37 182 ritardo di uscita Capitolo IV Memorie e logiche programmabili Clock input Un percorso del tipo Clock Input puo’ avere inizio a un ingresso del chip, oppure all’uscita di un flip-flop o una RAM, mentre ha termine sull’ingresso di clock di un flip-flop. Il corrispondente tempo rappresenta il massimo tempo necessario al segnale per raggiungere il pin di destinazione (figura 4.38). D Q interconnessioni e logica Clock input clock input pin di clock ritardo del clock figura 4.38 Clock skew Per il Timing Analyzer il clock skew e’ dato dall’intervallo temporale che intercorre tra gli istanti in cui agiscono due clock che siano connessi alla stessa linea. Questo fenomeno e' dovuto alle diverse lunghezze dai percorsi che portano il clock agli elementi di destinazione e influisce sulla massima frequenza di clock utilizzabile. Come si vede dalla figura 4.39 si possono avere due tipi di clock skew, positivo o negativo, a seconda che il clock giunga al flip-flop di destinazione prima o dopo di quando arrivi all’altro flip-flop. D Q interconnessioni e logica D Q FF2 FF1 Clock clock a FF1 clock a FF1 clock a FF2 clock a FF2 clock skew clock skew periodo di clock periodo di clock figura 4.39 183 Capitolo IV Memorie e logiche programmabili E’ ovvio che i parametri appena definiti vengono determinati per ciascuno dei clock del sistema. Oltre ai risultati relativi ai casi peggiori e’ possibile studiare i ritardi relativi a un qualunque percorso scelto sul circuito, selezionando il punto di partenza, quello di arrivo, oppure il percorso piu’ lungo o quello piu’ lento e escludendo eventualmente particolari collegamenti. E’ possibile ottenere un resoconto dettagliato passo per passo con l’indicazione del ritardo dovuto alla logica e quello dovuto al tempo di propagazione sulle linee che uniscono ogni blocco al successivo. Se nel circuito vi sono percorsi critici, noti a priori, ovvero evidenziati da analisi precedenti, e’ di solito possibile imporre su di essi vincoli mediante opportune specifiche temporali che fissano i massimi ritardi ammessi. Simulazione temporale. La simulazione temporale viene eseguita aggiornando la “netlist” ottenuta dalla descrizione funzionale con i dati relativi ai ritardi e ai tempi di propagazione determinati dopo aver effettuato le operazioni di posizionamento dei blocchi logici (placing) e di interconnessione (routing). Si utilizza una tecnica chiamata “back annotation”, che consiste nel creare una corrispondenza tra le informazioni temporali, i nomi dei segnali e i simboli utilizzati negli schemi. In tal modo e’ possibile eseguire la simulazione temporale utilizzando gli stessi stimoli e gli stessi punti di test di quella funzionale, permettendo di confrontare piu’ facilmente i risultati. Il simulatore e’ in grado di determinare e visualizzare automaticamente violazioni sui tempi di setup, di hold e sulla durata minima dei cicli di clock, permettendo di localizzarle e di stabilirne le cause. Programmazione. Una volta giunti a risultati soddisfacenti da tutte e tre le fasi del processo, eventualmente provando su dispositivi con potenzialita’ piu’ ampie, si passa alla programmazione della PGA utilizzando il file di configurazione ottenuto nella fase di implementazione. Spesso tale file viene caricato su una EPROM dalla quale viene a sua volta caricato all’atto dell’accensione in apposite celle di RAM all’interno della PGA. La possibilita’ di sostituire le EPROM permette di riconfigurare il sistema anche “sul campo” in tempi brevissimi. 4.11) Frequenza massima di funzionamento di un sistema sequenziale. Per definire la massima frequenza di commutazione di un dispositivo sequenziale i costruttori fanno riferimento a semplici sistemi quale quello illustrato in figura 4.40 D Q clock uscita clock uscita figura 4.40 184 Capitolo IV Memorie e logiche programmabili Nella connessione illustrata in tale figura il flip-flop D si comporta come un T, commutando in corrispondenza ad ogni fronte attivo del clock e realizzando un divisore binario. Ovviamente la situazione prospettata e’ ottimale e normalmente le condizioni di lavoro saranno piu’ pesanti di quella illustrata a causa di altri elementi combinatori o sequenziali che si possono trovare inseriti nei loop di reazione. In altre parole la struttura presentata in figura 4.40 sara’ presumibilmente quella che puo’ commutare alla massima velocita’ e non rappresentera’ casi realistici. Per qualsiasi rete sequenziale si puo’ tuttavia utilizzare un semplice modello di ritardo, derivato dal modello fondamentale dei circuiti sequenziali. Si sa infatti che un qualunque sistema sequenziale puo’ venire rappresentato dal modello di figura 4.41, realizzato con una rete puramente combinatoria e con uno o piu’ loop di reazione in cui si trovano inseriti elementi di memoria. ingressi Rete combinatoria stato attuale memoria uscite stato futuro clock figura 4.41 Fissando allora l’attenzione su un determinato stato iniziale l’evoluzione del circuito potra’ venire studiata con riferimento al modello di figura 4.42. ingressi stato attuale Rete combinatoria MEM uscite ingressi della memoria MEM clock figura 4.42 E’ evidente che per un corretto funzionamento del sistema il periodo T del clock non dovra’ essere inferiore al tempo che impiega un qualsiasi segnale ad attraversare la rete combinatoria. E’ 185 Capitolo IV Memorie e logiche programmabili necessario quindi individuare il percorso critico, cioe’ quello che e’ caratterizzato dal massimo ritardo di propagazione. In realta’ la situazione e’ piu’ complessa in quanto, a rigore, sarebbe necessario tenere anche conto del tempo di set-up e di propagazione degli elementi di memoria. In termini di diagramma di temporizzazione la situazione sara’ quella illustrata in figura 4.43. T clock ts ts stato (ingresso) t pmax ingressi della memoria stato (uscita) t co figura 4.43 In sostanza pertanto il periodo di clock non potra’ essere inferiore a t co + t p max + t s dove con tco si e’ indicato il tempo di propagazione dell’elemento di memoria, con tpmax il tempo di propagazione del cammino critico e con ts il tempo di set-up sempre dell’elemento di memoria. E’ ovvio che per tco e ts si devono prendere in considerazione i valori massimi forniti dal costruttore. L’analisi del problema non e’ semplice da svolgere a tavolino quando il sistema sequenziale sia appena complesso. Si ricorre allora, come detto nei paragrafi precedenti, alla simulazione utilizzando programmi che permettono di calcolare con buona precisione i tempi di ritardo e di segnalare qualsiasi violazione delle esigenze di temporizzazione. 186