DISPENSE DI SISTEMI ELETTRONICI PROGRAMMABILI Parte I Richiami di Elettronica Digitale Andrea Del Re SOMMARIO CAPITOLO 1 – Sistemi Combinatori e Sequenziali ...........................................................................3 1.1 Introduzione ...................................................................................................................................3 1.2 Sistemi combinatori e sequenziali..................................................................................................3 1.3 Macchine a stati finiti.....................................................................................................................5 CAPITOLO 2 – Registri, Contatori e Memorie...................................................................................6 2.1 Introduzione ...................................................................................................................................6 2.2 Registri ...........................................................................................................................................6 2.2.1 Registro parallelo ....................................................................................................................6 2.2.2 Registro a scorrimento (shift-register) ....................................................................................7 2.3 Contatori ........................................................................................................................................8 2.3.1 Contatori modulo 2n ................................................................................................................8 2.3.2 Contatori modulo M≠2n ..........................................................................................................8 2.3.3 Contatori con conteggio decrescente ......................................................................................9 2.3.4 Circuiti ri-configurabili registro-contatore..............................................................................9 2.4 Random Access Memory (RAM) ................................................................................................10 2.4.1 RAM composte da più dispositivi.........................................................................................11 2.4.2 Singola cella di memoria.......................................................................................................12 2.4.3 RAM con bus dati separati....................................................................................................13 2.4.4 RAM con data bus singolo....................................................................................................14 2.4.5 Indirizzamento di memorie di grandi dimensioni .................................................................15 2.5 Register Files................................................................................................................................16 INDICE DELLE FIGURE Figura 1: Esempio di circuito combinatorio ....................................................................................................................... 3 Figura 2: Esempio di circuito sequenziale .......................................................................................................................... 4 Figura 3: Simbolo di un Flip-Flop JK................................................................................................................................. 5 Figura 4: Registro a caricamento parallelo ......................................................................................................................... 6 Figura 5: Registro a caricamento parallelo con segnale di Load ........................................................................................ 7 Figura 6: Shift register ........................................................................................................................................................ 7 Figura 7: Shift register con uscita parallela ........................................................................................................................ 8 Figura 8: Contatore modulo 24............................................................................................................................................ 8 Figura 9: Contatore modulo 13........................................................................................................................................... 9 Figura 10: Contatore con conteggio decrescente ................................................................................................................ 9 Figura 11: Circuito che realizza un registro-contatore ri-configurabile............................................................................ 10 Figura 12: Schema a blocchi di una RAM 1024x8........................................................................................................... 11 Figura 13: Blocco RAM 256x8 realizzato con 4 dispositivi da 64x8 ............................................................................... 12 Figura 14: Schema di una singola cella di memoria statica .............................................................................................. 13 Figura 15: Schema di una RAM con BUS dati separati.................................................................................................... 13 Figura 16: Schema di una RAM con BUS dati singolo .................................................................................................... 14 Figura 17: Indirizzamento bi-dimensionale ...................................................................................................................... 15 Figura 18: Collegamento del register file alla ALU all'interno della CPU ....................................................................... 16 Figura 19: Schema a blocchi di un semplice Register File ............................................................................................... 17 INDICE DELLE TABELLE Tabella 1: Funzioni di transizione di stato e funzioni di eccitazione per i diversi tipi di elementi memoria ...................... 4 Tabella 2 Modalità di funzionamento del registro-contatore.............................................................................................. 9 Tabella 3: Funzionamento della singola cella di memoria................................................................................................ 12 Tabella 4: Confronto tra la complessità dell'indirizzamento mono e bi-dimensionale ..................................................... 15 CAPITOLO 1 – Sistemi Combinatori e Sequenziali 1.1 Introduzione Nei paragrafi seguenti vengono riportati alcuni richiami sui fondamenti dei circuiti logici. Lo scopo è quello di stimolare il ricordo di concetti che dovrebbero essere già noti e di spingere a rivedere quelle parti che dovessero essere fonte di dubbi. Per questo motivo la seguente esposizione ha carattere fortemente sintetico, senza la pretesa di essere completa. Per una trattazione più organica si rimanda ai libri di testo consigliati. 1.2 Sistemi combinatori e sequenziali I circuiti logici digitali possono essere classificati come combinatori o sequenziali. Nei circuiti combinatori, l’uscita del circuito è funzione solamente dei suoi ingressi correnti e il loro comportamento può essere descritto usando tabelle di verità o espressioni booleane. Nella Figura 1 è riportato un esempio di circuito combinatorio (a) e della sua tabella di verità (b) ed espressione booleana (c). A B’ Y A’ B A 0 0 1 1 B 0 1 0 1 (b) Y 0 1 1 0 Y=AB’+A’B (c) (a) Figura 1: Esempio di circuito combinatorio Nei circuiti sequenziali, l’uscita è funzione, oltre che dei suoi ingressi correnti, anche di un certo numero dei suoi ingressi precedenti. Il comportamento di un circuito sequenziale può essere descritto utilizzando tabelle o diagrammi di stato o le funzioni di transizione di stato e di uscita. Lo stato di un circuito sequenziale può essere pensato come la condizione nella quale il circuito si è portato, partendo da determinate condizioni iniziali, a seguito della sequenza di ingressi ricevuta. Nella Figura 2 è riportato un esempio di circuito sequenziale (a), della sua tabella di transizione di stato (b), della sua funzione di transizione di stato (c) e del suo diagramma di stato (d). In questo caso particolarmente semplice, lo stato e l’uscita coincidono e lo stesso vale, quindi, per le funzioni di transizione di stato e d’uscita. A A 0 0 1 1 Y PS (Y) 0 1 0 1 (a) Y+ = A xnor Y (c) NS (Y+) 1 0 0 1 0 1 0 1 (b) 1 0 (d) Figura 2: Esempio di circuito sequenziale Il circuito di Figura 2 si comporta come un sistema sequenziale: a parità d’ingressi, infatti, la sua uscita dipende dallo stato in cui il sistema si trova. L’elemento distintivo dei circuiti sequenziali nei confronti di quelli combinatori è la presenza di elementi di memoria, che vengono realizzati riportando le uscite di alcune porte logiche all’ingresso delle stesse o di altre porte. Così, un circuito nella cui forma minima siano presenti questi loop è un circuito sequenziale. I circuiti sequenziali possono esseri asincroni o sincroni. Nei circuiti asincroni gli ingressi modificano il valore delle uscite del circuito in qualsiasi istante questi vengano applicati. Nei circuiti sincroni, invece, il cambiamento di uno o più ingressi ha effetto sulle uscite solamente in corrispondenza di alcuni istanti significativi, identificati attraverso un segnale solitamente indicato come “clock”. Questo è un ingresso particolare del circuito, dall’andamento temporale tipicamente periodico, che non altera la funzione logica realizzata, il cui compito è quello di segnare gli intervalli di tempo durante il quale il circuito può evolvere, modificando la sua uscita ed il suo stato in funzione dei suoi ingressi. I circuiti sincroni sono pensati in modo che l’uscita degli elementi di memoria subisca al più una singola transizione per ogni periodo di clock. Combinando opportunamente porte logiche e loop è possibile creare diversi elementi di memoria (D, SR, JK, T), sensibili al livello (latches) o ad uno dei due fronti (di salita o di discesa) del segnale di clock (Flip-Flop). Questi ultimi sono gli elementi di memoria solitamente utilizzati nei circuiti sincroni. Nella Tabella 1 sono riportate le funzioni di transizione di stato PS/NS e le funzioni di eccitazione per i diversi tipi di elementi di memoria. FF D PS 0 1 D=0 0 0 FF T D=1 1 1 PS 0 1 FF SR T=0 0 1 NS T=1 1 0 SR=00 0 1 NS FF D PS 0 1 PS 0 1 SR=01 SR=10 0 1 0 1 NS FF T NS=0 0 0 NS=1 1 1 D PS 0 1 FF JK SR=11 - PS 0 1 JK=00 0 1 JK=01 JK=10 0 1 0 1 NS FF SR NS=0 0 1 NS=1 1 0 T PS 0 1 NS=0 001 FF JK NS=1 10 -0 SR JK=11 1 0 PS 0 1 NS=0 0-1 NS=1 1-0 JK Tabella 1: Funzioni di transizione di stato e funzioni di eccitazione per i diversi tipi di elementi memoria Il simbolo di un Flip-Flop (FF) J/K è mostrato nella Figura 3. Oltre agli ingressi J e K ed al segnale di clock, il FF prevede anche due segnali asincroni: il segnale di preset, che pone l’uscita ad 1 indipendentemente dal valore degli altri segnali, ed il segnale di clear, che pone l’uscita a 0 qualsiasi sia il valore degli altri segnali. Naturalmente, non ha senso porre ad 1 contemporaneamente i segnali preset e clear. Clear Preset J Q FF K Q’ CLK Figura 3: Simbolo di un Flip-Flop JK 1.3 Macchine a stati finiti Un caso particolare di circuito sequenziale è rappresentato dalle macchine a stati finiti (Finite State Machine). Come il nome stesso suggerisce, si tratta di circuiti sequenziali in cui il numero degli stati è finito. A questa categoria appartengono tutti i circuiti che hanno una memoria limitata, e alcuni di quelli con memoria infinita. Come esempio si consideri un circuito la cui funzione sia quella di determinare se il numero di 1 ricevuti in ingresso dalla sua accensione al tempo t sia pari o dispari; si tratta di un sistema con memoria infinita, ma con soli 2 stati (numero di 1 pari e numero di 1 dispari). Il comportamento di una macchina a stati finiti è completamente identificato dalle funzioni di transizione di stato e di uscita. Le macchine a stati finiti possono essere descritte sia come macchine di Mealy che come macchine di Moore. Per le macchine di Mealy, l'uscita è funzione dello stato presente e degli ingressi: S(t+1)=F[S(t),x(t)] Y(t)=G[S(t),x(t)] Per le macchine di Moore, l'uscita è funzione solamente dello stato presente: S(t+1)=F[S(t),x(t)] Y(t)=G[x(t)] Sebbene la prima rappresentazione possa sembrare più generale, è possibile dimostrare che per ogni macchina di Mealy ne esiste una di Moore equivalente. CAPITOLO 2 – Registri, Contatori e Memorie 2.1 Introduzione In questo capitolo verranno illustrati alcuni dei più comuni circuiti sequenziali utilizzati nell’architettura dei calcolatori. In particolare, verranno trattati i registri, i contatori, i register-file e la Random Access Memory (RAM). 2.2 Registri Un registro è una sequenza di elementi di memoria ad 1 bit che sono utilizzati come una singola unità di memoria. I registri sono utilizzati per immagazzinare dati temporanei per l’elaborazione o la comunicazione tra due unità del calcolatore. Possono differire per dimensione, modalità di scrittura e modalità di lettura. 2.2.1 Registro parallelo In un registro a caricamento parallelo il contenuto degli elementi di memoria che lo compongono viene immagazzinato in un unico colpo di clock. Un registro parallelo ad n-bit è un registro con n ingressi, composto da n FF, ognuno dei quali ha il compito di registrare un bit della parola d’ingresso. Di conseguenza, il contenuto del registro può essere letto in un unico colpo di clock. Un esempio di un registro parallelo a 3 bit è riportato Figura 4. I2 I1 I0 CLK CLK CLK D D D FF FF FF Q Q Q Out2 Out1 Out0 Figura 4: Registro a caricamento parallelo Il circuito di Figura 5 ha un ulteriore ingresso “Load” che serve ad attivare o meno il caricamento dei dati nel registro. Questo meccanismo è utile nel caso in cui nel nostro sistema siano presenti più registri e non sia necessario aggiornarli tutti ad ogni colpo di clock. Di conseguenza, se il segnale Load è alto, sul fronte di salita del clock l’ingresso di ogni flip-flop viene copiato sulla sua uscita; al contrario, se Load è basso l’uscita rimane al valore precedente grazie al loop esterno ai FF. Load I2 I1 I0 CLK CLK CLK D D D FF FF FF Q Q Q Out2 Out1 Out0 Figura 5: Registro a caricamento parallelo con segnale di Load 2.2.2 Registro a scorrimento (shift-register) I registri a scorrimento sono utilizzati per scrivere nel registro un bit per volta. Possono essere realizzati in modo da rendere disponibile in uscita un bit alla volta o tutti i bit in parallelo. Ad ogni ciclo di clock i bit contenuti nel registro vengono spostati verso sinistra o verso destra (a seconda di come sono posti in cascata i registri all’interno dello shift-register). Nella Figura 6 è riportato un esempio di shift-register a 4 bit. Input D Q FF D Q D FF Q FF D Q Out FF CLK Figura 6: Shift register Sul fronte di salita del clock l’ingresso è memorizzato nel FF più a sinistra e, allo stesso tempo, i valori memorizzati in ogni FF vengono fatti scorrere verso il FF subito a destra. Per riempire il registro saranno necessari, quindi, 4 cicli di clock. In maniera analoga, occorreranno 4 cicli di clock per leggere il contenuto completo dello shift-register. Questo modificherà il contenuto del registro, poiché ad ogni colpo di clock il segnale d’ingresso verrà fatto avanzare verso destra, prendendo il posto dei dati registrati. Normalmente questo meccanismo è quello desiderato quando si utilizza uno shift-register, ma in caso contrario si può provvedere a rendere disponibile le uscite in parallelo, come mostrato nella Figura 7. Y0 Input D Q D FF CLK Y1 Q FF Y2 D Q D FF Q FF Y3 Figura 7: Shift register con uscita parallela 2.3 Contatori I contatori sono dei circuiti sequenziali la cui uscita segue una sequenza periodica predeterminata. Se la sequenza di uscita corrisponde al conteggio binario si parla di contatori binari. I contatori possono essere sincroni, nei quali tutti i flip-flop ricevono lo stesso segnale di clock, oppure asincroni, dove questo non avviene. Noi tratteremo solamente contatori sincroni. 2.3.1 Contatori modulo 2n Un contatore binario modulo m è un circuito sequenziale la cui uscita varia da 0 ad m-1, a passi di 1, in modo periodico, ossia con lo 0 che segue il valore m-1. Se m=2n, il circuito può essere realizzato utilizzando, come elementi di memoria, solo flip-flop di tipo T o JK. Infatti, osservando la sequenza delle uscite, si può notare come il bit k-esimo venga modificato, da 0 a 1 e viceversa), solo dopo che tutti i precedenti sono diventati 1. Quindi, l’ingresso del k-esimo FF sarà dato dall’AND delle uscite di tutti i FF precedenti. Nella Figura 8 è riportato un esempio di un contatore modulo 24. COUNT Q’ Y2 Q Y1 J K Q FF J Q’ Y0 FF K Q Q’ J Q’ FF K Q FF J K CLK Y3 Figura 8: Contatore modulo 24 Un problema di questo circuito deriva dal fatto che il numero di porte AND collegate in cascata cresce come il numero di bit, portando a dei ritardi nel calcolo dell’ingresso dell’ultimo FF che potrebbero limitare pesantemente la massima frequenza di clock. 2.3.2 Contatori modulo M≠2n Quando M non è una potenza di 2, il circuito che realizza il contatore può essere sintetizzato utilizzando la classica procedura basata sulle mappe-K. In alternativa, è possibile sfruttare l’ingresso clear asincrono, per azzerare l’uscita di tutti i FF quando si è raggiunto il massimo valore per il conteggio. Nella Figura 9 è mostrato l’esempio di un contatore modulo 13. COUNT J Q Q’ Y1 FF C K Q Q’ J K Q Y0 FF C J Q’ FF C K Q FF C Q’ J K CLK Y2 Y3 Figura 9: Contatore modulo 13 Si noti come il valore massimo dell’uscita sia mantenuto per un periodo di tempo molto limitato. Questo perché tutti i FF vengono resettati non appena la condizione di fine conteggio rappresentata dall’uscita della AND si propaghi fino all’ingresso Clear dei FF. La soluzione consiste nel rendere sincrono l’azzeramento dei registri, con una struttura analoga a quella mostrata nella Figura 11. 2.3.3 Contatori con conteggio decrescente In alcune situazioni può essere conveniente utilizzare un contatore che, ad ogni passo, decrementi la sua uscita piuttosto che aumentarla. Questi contatori sono facilmente realizzabili utilizzando l’uscita negata Q’ dei FF. Il risultato è mostrato nella Figura 10. COUNT Q’ J K Q FF J Y1 Y2 Q Q’ Y0 FF K Q Q’ J Q’ FF K Q FF J K CLK Y3 Figura 10: Contatore con conteggio decrescente 2.3.4 Circuiti ri-configurabili registro-contatore Utilizzando dei multiplexer è possibile realizzare dei circuiti che, a seconda del valore dei bit di controllo, possa funzionare come un contatore o come un registro. Nel circuito di Figura 11 è mostrato un circuito ri-configurabile che può funzionare in 4 diverse modalità, indicate nella seguente tabella. S1 0 0 1 1 S0 0 1 0 1 Funzionamento Il contenuto dei registri non cambia Gli ingressi I0…I3 vengono registrati Conteggio crescente Conteggio decrescente Tabella 2 Modalità di funzionamento del registro-contatore D FF Q Out0 FF Q D FF D D Out1 Q Out2 FF Q Out3 CLK 4 to 1 MUX 4 to 1 MUX 4 to 1 MUX 4 to 1 MUX S1 S0 1 I3 I2 I1 I0 Figura 11: Circuito che realizza un registro-contatore ri-configurabile Se i segnali di controllo sono pari a S1S0=00 l’uscita del registro viene riportata al suo ingresso e, di conseguenza, l’uscita rimarrà invariata al fronte di clock successivo. Quando i segnali di controllo sono pari a S1S0=01 gli ingressi I0…I3 vengono portati ai FF e la funzionalità del circuito è pari a quella di un registro parallelo. Quando S1S0=10 il circuito assume la configurazione di un contatore crescente, mentre con S1S0=11 quella di un contatore decrescente. 2.4 Random Access Memory (RAM) La RAM è l’elemento di memoria utilizzato nel calcolatore per immagazzinare i dati e programmi durante l’esecuzione di un programma. La memoria è divisa in parole (word), ovvero l’insieme di locazioni di memoria che possono essere mosse da/verso la RAM come una singola entità. Una parola è individuata attraverso il suo indirizzo (address) e caratterizzata dal suo contenuto, ossia l’informazione effettivamente immagazzinata. Il nome deriva dal fatto che si può accedere in maniera casuale ad una sequenza di parole mantenendo, approssimativamente, lo stesso tempo di ritardo. Nella Figura 12 è riportato lo schema a blocchi di una RAM di 1024 parole da 8 bit. In questo caso la RAM è accessibile attraverso due data bus a 8 bit, uno d’ingresso e uno d’uscita, un address bus a 10 bit, e segnali di chip select (CS) per l’abilitazione della RAM, e di read/write (R/W) per l’abilitazione della scrittura sulla RAM. 8 Address BUS 10 CS R/W Data In BUS 1010111 Word 0 Word 1 RAM Word 1023 8 Data Out BUS Figura 12: Schema a blocchi di una RAM 1024x8 L’operazione di lettura è quella che permette di ottenere in uscita dalla RAM il contenuto di una parola. Per far questo, occorre: 1. abilitare il blocco di RAM in questione ponendo ad 1 il segnale di chip select CS 2. fare una richiesta di lettura ponendo ad 1 (ma, a seconda dei casi può essere anche 0) il segnale read/write R/W 3. mettere l’indirizzo corrispondente alla parola che si vuol leggere nell’address bus L’operazione di scrittura permette di modificare il contenuto di una parola. Per far questo occorre: 1. abilitare il blocco di RAM in questione ponendo ad 1 il segnale di chip select CS 2. fare una richiesta di scrittura ponendo a 0 (ma, a seconda dei casi può essere anche 1) il segnale read/write R/W 3. mettere la parola che si vuole scrivere sul data-in bus 4. mettere l’indirizzo della locazione in cui si vuol scrivere nell’address bus 2.4.1 RAM composte da più dispositivi A causa di limitazioni fisiche legate ai processi tecnologici, il numero di parole contenute in un singolo dispositivo RAM non può crescere a piacimento. Laddove sia necessario avere un numero di parole maggiore di quello offerto dai singoli dispositivi, è possibile collegare più dispositivi in modo da realizzare RAM più grandi. Nella Figura 13 è mostrato il circuito con il quale è possibile costruire una RAM da 256 word x 8 bit utilizzando dei dispositivi con 64 word x 8 bit. I 2 bit più significativi del bus indirizzi vengono utilizzati per stabilire quale dispositivo attivare, mentre i restanti 6 indirizzano la parola. Inoltre, i bus d’uscita dei vari dispositivi sono collegati all’unico bus dati verso la CPU, utilizzando dei buffer tristate, che vengono attivati dallo stesso decoder che genera i CS. Data_IN BUS 8 Address BUS (5..0) 6 RAM 0 CS RAM 1 CS RAM 2 CS RAM 3 CS 2x4 Decoder Address 2 BUS (7..6) CPU Data_OUT BUS 8 Figura 13: Blocco RAM 256x8 realizzato con 4 dispositivi da 64x8 2.4.2 Singola cella di memoria Nella presente sezione verrà mostrata la realizzazione di una cella di RAM statica (SRAM), il cui utilizzo è limitato a memorie di ridotte dimensioni e ad elevate prestazioni. L'alternativa è rappresentata dalla RAM dinamica (DRAM), che è la più utilizzata per la RAM di sistema dei PC, essenzialmente per ragioni economiche, legate alla possibilità di un maggiore livello d'integrazione. Il circuito di Figura 14 mostra lo schema di una singola cella di memoria SRAM. In una RAM occorre essere in grado di indirizzare ogni singola cella e di indicare se si tratta di una richiesta di lettura o scrittura. Per questo vengono utilizzati il segnale select e il segnale R/W. Inoltre occorre poter abilitare l'uscita nel caso di operazione di lettura; per queso motivo è necessario utilizzare il buffer tristate di uscita. In particolare, se select=0 si ha S=0 e R=0 (nessun cambiamento nell'informazione immagazzinata nel FF) e l'uscita è disabilitata; se select=1 e R/W=0 si ha S=In ed R=In', in modo da avere Q(t+1)=In(t), e l'uscita è disabilitata; infine, se S=1 e R/W=1, si ha ancora S=0 ed R=0, ma l'uscita è collegata al FF. Il funzionamento è riassunto nella Tabella 3, mettendo in evidenza il comportamento della cella di memoria. S 0 1 1 R/W X 0 1 Q(t+1) Q In Q Out Floating Floating (scrittura) Q (lettura) Tabella 3: Funzionamento della singola cella di memoria R/W Select S IN Q ENB FF R Q’ Figura 14: Schema di una singola cella di memoria statica 2.4.3 RAM con bus dati separati Per una memoria con 2n parole, ognuna di m bit, occorrono 2n⋅m celle da 1 bit. Per la selezione di una parola si utilizza un decoder n⋅2n che abilita tutte le celle che formano la parola in esame. Nella Figura 15 è mostrato un esempio di una RAM composta da 4 parole, ognuna di 3 bit; i blocchi indicati con MC corrispondono ad 1 bit di memoria, del tipo indicato in Figura 14. Data IN BUS (2..0) MC MC MC MC MC MC MC MC MC MC MC MC CS ADDR_1 ADDR_0 2x4 Decoder R/W Data OUT BUS (2..0) Figura 15: Schema di una RAM con BUS dati separati Il segnale di CS è collegato all'enable del decoder, in modo che quando CS=0, le uscite del decoder sono tutte a 0, e nessuna cella di memoria risulta selezionata. 2.4.4 RAM con data bus singolo Per ridurre il numero di linee necessarie per collegare la CPU alle periferiche, ottenendo un beneficio in termini di complessità e costi, molto spesso le RAM utilizzate nella pratica hanno un solo bus dati bi-direzionale. Questo può essere ottenuto utilizzando dei buffer tristate, come illustrato nella Figura 16. I buffer sono comandati dal segnale R/W in modo da collegare il bus dati alle celle di memoria durante una scrittura e l'uscita delle celle al bus dati durante una lettura. MC MC MC MC MC MC MC MC MC MC MC MC CS ENB R/W ENB ADDR_0 2x4 Decoder ENB ADDR_1 Data BUS (2..0) Figura 16: Schema di una RAM con BUS dati singolo 2.4.5 Indirizzamento di memorie di grandi dimensioni Un singolo chip di RAM può eccedere i 256 Mbit di dimensione e non è praticamente realizzabile un'indirizzamento basato su un unico decoder, soprattutto per questioni legate al ritardo che un componente tanto complesso introdurrebbe nel circuito. Utilizzando un indirizzamento bidimensionale è possibile ridurre sensibilmente la complessità del decoder. Con questa tecnica, le celle di memoria sono organizzate su una griglia, ed il singolo elemento viene individuato attraverso la divisione del bus indirizzi in 2 parti, una delle quali identifica la riga e l'altra la colonna delle celle di memoria MC. Nella Figura 17 è mostrato il funzionamento dell'indirizzamento. Address BUS Indirizzo della Colonna Decoder di Colonna Indirizzo della Riga Parola Indirizzata Decoder di Riga Figura 17: Indirizzamento bi-dimensionale La complessità dei decoder riga e colonna è molto minore di quella del decoder singolo: infatti, se l'address bus è composto da 10 bit avremo bisogno di un decoder 10x1024, mentre utilizzando un indirizzamento bi-direzionale si scende a 2 decoder da 5x32. Nella Tabella 4 è mostrato il numero di mintermini necessario nei 2 casi al variare della grandezza del bus indirizzi. Dimensioni di ADDR BUS 2 4 10 20 1 Decoder 4 16 1024 1M Numero di mintermini 2 Decoder 4 8 64 2048 Tabella 4: Confronto tra la complessità dell'indirizzamento mono e bi-dimensionale 2.5 Register Files I register files sono una particolare forma di memoria che può essere utilizzata all’interno delle CPU. Si tratta essenzialmente di un insieme di registri con un bus d’ingresso e due di uscita, tipicamente collegati alla ALU, come mostrato nella Figura 18. Output BUS REGISTER FILE Output BUS ALU Input BUS Figura 18: Collegamento del register file alla ALU all'interno della CPU Nella Figura 19 è riportato lo schema di un register file semplificato, composto da soli 2 registri di 2 bit ognuno. I dati all’ingresso del register file vengono memorizzati in un certo registro quando il relativo segnale di load è alto, altrimenti il contenuto rimane invariato. Per selezionare su quale bus d’uscita collocare i dati provenienti dai registri vengono utilizzati due decoder, uno per ogni bus, che abilitano i relativi buffer tristate. Naturalmente, il contenuto di uno stesso registro può essere posto in uscita sui 2 bus contemporaneamente. Bus Select A Bus Enable A Bus Select B Bus Enable B 1x2 Decoder 1x2 Decoder B0 B1 A0 A1 Q D FF Q R00 D FF D D FF Q R01 FF R10 Q R11 CLK 2 to 1 MUX I1 2 to 1 MUX Load 1 2 to 1 MUX I0 Figura 19: Schema a blocchi di un semplice Register File 2 to 1 MUX Load 0