Un componente principale di ogni computer è la memoria, utilizzata per memorizzare le istruzioni da eseguire e i dati. Iniziamo ad analizzare la memoria dalle porte logiche per capire come funzionano. Per costruire un circuito che memorizzi dei dati ( finché è alimentato ), dobbiamo utilizzare i circuiti sequenziali ovvero quei circuiti che il loro output (O) non dipende solo dall’input attuale (I) ma anche dallo stato del circuito (S) :

Latch
Per creare una memoria a 1-bit abbiamo bisogno di un circuito che riesca a “ricordare” il valore precedente dato in input. Un circuito del genere è chiamato SR-LATCH che può essere costruito partendo da due porte NOR :
- ingresso (Set) : serve a impostare a 1 l’output
- ingresso (Reset) : serve per azzerare l’output
vedi appunti di LRL → Latch-FlipFlop
SR-Latch clocked
Alcune volte è conveniente avere un SR-Latch che cambia stato solo in alcuni momenti, ovvero i segnali S e R agiscono solo quando il segnale di clock è attivo.

Per ottenere questo circuito basta aggiungere due porte AND che “mascherano” i segnali di S e R. Infatti quando il clock = 0, gli AND danno 0 in output e quindi il latch non cambia stato. Quando invece il clock = 1, l’output degli AND sarà uguale a S e R ( rispettivamente ).
Latch-D clocked
Per risolvere l’ambiguità del SR-Latch ( causata dalla condizione ) può essere utilizzato un solo ingresso dati … vedi corso di LRL → Latch-FlipFlop

Questo circuito infatti realizza una cella di memoria a 1-bit.
Flip-Flop
Nei circuiti latch lo stato cambia quando il segnale di clock è alto ( 1 ) e questo è chiamato level triggered.
Important
Nei flip-flop invece lo stato cambia durante la transazione da 0 a 1 ( fronte di salita ) oppure da 1 a 0 ( fronte di discesa ). Il flip-flop è edge triggered.
Quindi abbiamo bisogno di un impulso brevissimo sul fronte di salita del segnale di clock. Questo impulso potrebbe essere dato ad un latch-D che diventa trasparente in un brevissimo intervallo e poi opaco, in questo modo cattura il valore di D in un preciso istante ( ovvero sul fronte di salita del clock ). Per ottenere questo impulso brevissimo possiamo avvalerci di un generatore di impulsi :

- prende in input in
ail clock originale - viene poi ritardato in
bcon l’inverter - con una porta AND viene ritardato ulteriormente che lo da in output a
d

infatti quando il segnale di b e c sono messi in AND, il risultato è un impulso brevissimo, dove la larghezza di questo impulso è uguale al ritardo dell’inverter. Quindi l’output della porta AND d, è questo impulso brevissimo “shiftato” dal ritardo della stessa porta AND.
Quindi il circuito finale del flip-flop-D è il seguente :

I simboli di un flip-flop-D :

dove il primo cambia stato nel fronte di salita del clock ( da 0 a 1 ) e viceversa il secondo (d).
Alcuni flip-flop e latch hanno due input aggiuntivi :
- Preset : forza lo stato
- Clear : forza lo stato

questi input sono generalmente in logica negativa, ovvero che sono attivi quando sono al livello logico basso.
Registri
I flip-flop possono essere combinati in gruppi per creare dei registri, che permettono di memorizzare dati più grossi di 1-bit.
#review

Questo infatti è un registro a 8-bit ( 1-byte ) che utilizza 8 flip-flop.
Il registro accetta in input un valore a 8-bit , quando il clock CK effettua la transazione.
Vengono usati flip-flop-D che cambiano stato quando il clock passa da 1 a 0, però il clock originale viene invertito e quindi si comportano al contrario. Questo perché il segnale di CK potrebbe non avere abbastanza corrente per arrivare a tutti gli 8 flip-flop, quindi l’inverter fa da amplificatore.
Inoltre l’input CLR quando è impostato a 0, tutti i flip-flop sono forzati a mettersi nello stato 0.
Organizzazione della memoria
Per costruire memorie più grandi è necessaria una organizzazione piuttosto diversa, una dove è possibile indirizzare singole parole ( words ). Una tipica organizzazione di memoria utilizzata è questa review :

Questo esempio mostra una memoria a 12-bit con :
- 4 celle, dove ogni cella può memorizzare una word a 3-bit
- 2 input che permettono di indirizzare la cella che dovrebbe prendere i dati in input o dare i dati in output
- 3 input , ovvero i dati in entrata
- input
CS(Chip Select), usato per selezionare questo circuito - input
RD( ReaD ), usato per specificare se deve leggere (1) o scrivere (0). - input
OE( Output Enable ), usato per abilitare l’output - 3 output , ovvero i dati in uscita
basta poi osservarlo e provare a fare una lettura o scrittura per capire come funziona molto bene. C’è solo una cosa che non capiamo vicino all’output.
Infatti siccome nelle attuali memorie gli ingressi e le uscite occupano le stesse “linee”, ovvero che sono connesse al bus, si deve fare in modo di scollegare le uscite nel momento di scrittura e viceversa.

Per risolvere questo problema esistono degli interruttori, come il non-inverting buffer :

- quando il segnale di control è alto ( = 1 ) il buffer si comporta come un cavo normale

- quando il segnale di control è basso ( = 0 ) il buffer ci comporta come un circuito aperto e quindi l’output è come se non esistesse ed il cavo fosse tagliato

Questo tipo di buffer viene chiamato anche tri-state devices siccome può essere :
- 0
- 1
- alta impedenza ( ovvero ne 0 ne 1 ) ( circuito aperto )

Inoltre è utile osservare che una memoria :
- con linee di indirizzo ( in questo caso erano con )
- memorizza bit per cella ( in questo caso ) avrà una dimensione pari a
PS : quest’ultima osservazione è utile per gli esercizi di creazione circuito per abilitazione chip ROM, RAM e PIO
Chip di memoria
Ora è molto comodo costruire “efficientemente” una memoria più grande di quella che abbiamo visto prima da che memorizzava bit per cella. Per creare per esempio una da , basta aggiungere ad ogni cella 4 flip-flop.
Vediamo della terminologia per non confonderci :
- si dirà che il segnale è asserito ( piuttosto che dire che il valore è alto o basso ) secondo la logica che segue per quel segnale, per dire che è attivo :
- è asserito quando
- è asserito quando
- si dirà che il segnale è negato per dire che non è attivo :
- è negato quando
- è negato quando
- alcuni segnali sono
- in logica negativa ( sono asseriti quando il segnale è basso )
- in logica positiva ( sono asseriti quando il segnale è alto )
Inoltre siccome un computer ha molti chip di memoria, sono necessari alcuni segnali fondamentali :
- (Chip Select)
- (Write Enable) : determina l’operazione da eseguire ( write o read )
- ( Output Enable ) : permette di abilitare l’output, quando è negato l’output del chip è “disconnesso”
Vediamo ora un esempio di chip di memoria che utilizza uno schema diverso da quello :

Questo, infatti è un esempio di chip di memoria a 4 Mbit ( 512 KB ), che utilizza uno schema diverso di indirizzamento da quello utilizzato per il chip . Internamente questo chip è organizzato come una matrice ( sarebbe ) di celle da 1-bit. Per selezionare una cella occorre :
- inserire nei pin
A0...A10il numero delle riga che si vuole selezionare e asserire il segnale ( Row Address Strobe ) - inserire nei pin
A0...A10il numero delle colonna che si vuole selezionare e asserire il segnale ( Column Address Strobe )
Con questo schema si riduce il numero di pin da utilizzare, infatti se volevamo utilizzare lo schema con indirizzamento lineare, avremmo dovuto utilizzare almeno 22 pin. Rende però il chip lento rispetto ad uno con indirizzamento lineare, che richiederebbe un solo ciclo per la selezione della cella.
RAM
Important
Le memorie che abbiamo visto fino ad ora possono essere scritte e lette, queste memorie si chiamano ==RAM== ( Random Access Memory )
Le RAM si dividono in :
- statiche - SRAM :
- costruite usando circuiti simili ai flip-flop-D
- sono in grado di mantenere l’informazione finché sono alimentate
- molto veloci ( nanosecondi ) infatti sono molto utilizzate come memorie cache di secondo livello
- dinamiche - DRAM :
- non usano i flip-flop, ma un array di celle, ogni cella contene un transistor e un condensatore, ogni condensatore può “memorizzare” 1 o 0, ma deve essere “rinfrescato” ogni millisecondi per evitare di perdere i dati
- hanno maggiori capacità siccome hanno bisogno solo di un transistor e un condensatore per bit ( SRAM 6 transistor per bit ), infatti sono utilizzate come memorie principali
- lente
La combinazione dei due combina i vantaggi di una e i vantaggi dell’altra ( velocità e capacità ).
Esistono vari tipi di RAM :
- SDRAM ( DRAM sincrona ) : è ibrida tra statica e dinamica ed è guidata dal clock. Trasferisce i dati quando il segnale di clock è sul fronte di salita
- DDR SDRAM ( Double Data Rate ) : trasferisce i dati sia nel fronte di salita che discesa del segnale di clock ( trasferisce il doppio dei dati nello stesso tempo ).
Chip di memoria non-volatile
Le RAM non sono l’unico tipo di chip memoria, infatti in molte applicazione ( es. giochi, elettrodomestici e macchine ) i programmi e alcuni dati devono rimanere memorizzati anche quando si spengono. Questo ha portato allo sviluppo delle ==ROM== ( Read Only Memory ).
I dati in una ROM vengono inseriti durante la fabbricazione
Le ROM sono più economiche delle RAM, ma il problema è che i dati non posso essere cambiati ( l’unico modo è cambiare chip ). Inoltre siccome i tempi di fabbricazione di una ROM sono lunghi, sono state inventate le PROM ( Programmable ROM ), ovvero una ROM programmabile una volta sola bruciando dei fusibili collocati in un array all’interno del chip.
Lo sviluppo successivo è stato il chip EPROM ( Erasable PROM ), che non è solo ri-programmabile ma anche cancellabile. La cancellazione consiste nel esporre il chip a raggi ultravioletti per circa 15 min, settando i bit di ogni cella a 1 ( stato di cancellazione di default ) . Per ri-programmare è necessario portare i bit voluti a 0 e in questo modo si rende il chip ri-utilizzabile.
Molto meglio della EPROM è la EEPROM ( Electrically EPROM ), che per essere cancellata è necessario solo applicare un impulso elettrico. Un tipo di EEPROM è la memoria flash, che è cancellabile a blocchi e riscrivibile ( EEPROM è cancellabile byte a byte ). Inoltre le memorie flash stanno rimpiazzando i dischi meccanici .
Vediamo ora una comparazione dei vari tipi di memorie viste fino ad ora :

(appliances = elettrodomestici, read-mostly = principalmente read )

