Implementazione di PC mediante memoria ROM
Qualora la complessità della PC risultasse eccessiva, si può optare per una reaizzazione alternativa basata sull'utilizzo di memorie ROM (read only memory).
La PC fornisce sostanzialmente una configurazione di segnali di controllo (α e β) alla PO a seconda dello stato in cui si trova (quale microistruzione sta eseguendo) e dei valori delle variabili di condizionamento e, a partire dalle stesse informazioni determina quale micro istruzione verrà eseguita all'istante successivo. La ωPC infatti implementa una funzione S x X → Z (S è lo stato interno, X è una configurazione delle variabili di condizionamento e Z è una configurazione delle uscite (α e β) e la σPC implementa una funzione S x X → S.
Entrambe le funzioni possono essere implementate da una memoria M che contiene all'indirizzo s..vc (risultato della concatenazione del registro di stato interno s con il valore delle variabili di condizionamento vc) una parola di n+m bit (con *n* numero dei bit del registro di stato e m numero delle variabili di controllo verso la PO).
Ad ogni ciclo di clock, il valore del registro di stato interno viene concatenato alla configurazione delle variabili di controllo e utilizzato come indirizzo per leggere un posizione della memoria di controllo M. La prima parte (di n bit) viene utilizzata come ingresso del registro di stato (dunque diventerà il nuovo stato interno al ciclo di clock successivo), mentre la seconda parte (di m bit) verrà utilizzata come configurazione delle variabili di controllo da inviare alla PO.
Il ritardo introdotto dalla PC per calcolare sia ωPC che σPC sarà dunque pari al tempo di accesso della memoria M.
La memoria M può essere implementata utilizzando una ROM, ovvero una memoria in cui le parole sono scritte in modo immutabile all'atto della fabbricazione, utilizzando i valori derivabili da microprogramma.
Esempio
Una unità U riceve da U1 un valore e lo cerca in una memoria interna M. Se lo trova, ne restituisce l'indirizzo ad U1, altrimenti restituisce -1.
Il microcodice è il seguente
0. (RDY=0) nop, 0 (=1) 1->I, zero(IN-M[0])->F, 1 1. (I0, F = 00) I+1->I, zero(IN - M[I])->F, 1 (=10) -1 -> OUT, reset RDY, set ACK, 0 (=-1) I-1 -> OUT, reset RDY, set ACK, 0
Serve un commutatore (e quindi un segnale α) per scrivere in I (1 o I+1) per scrivere in OUT (I-1 o (-1)) e un commutatore per decidere se indirizzare la memoria M con la costante 0 o con I.
Servono β per decidere se scrivere I, F, OUT, RDY (reset) e ACK (set).
Ci sono due possibili stati interni della PC.
Quindi (rispetto alla terminologia utilizzata per la spiegazione qui sopra):
- n = 1
- vc = 3
- m = 8
- M è una memoria da 2 alla (1+3) = 16 posizioni, ognuna di 8 bit (nota che ci sono più posizioni che frasi, perchè serve scrivere qualcosa anche negli indirizzi che non contano: per la 0. conta l'indirizzo che ha il bit di stato a 0 e il bit RDY a 0 o a 1, ma non interessano le configurazioni di I0 e F che dunque devono essere rappresentate con tutti i 4 valori possibili nell'indirizzo)
La configurazione della memoria scritta in fase di creazione della memoria, assumendo che l'ordine delle variabili di controllo sia quello stabilito sopra αKout, αKindM, βI, … , βack:
// ind s α β M[0000] = 0 000 00000 // quando lo stato interno è 0 e RDY è 0, tutti i β sono a 0 M[0001] = 0 000 00000 // (e per comodità anche gli α ) M[0010] = 0 000 00000 M[0011] = 0 000 00000 M[0100] = 1 000 11000 // quando lo stato interno è 0 e RDY è 1 ... M[0101] = 1 000 11000 M[0110] = 1 000 11000 M[0111] = 1 000 11000 M[1000] = 1 101 11000 // prima frase della 1. indipendendemente da RDY M[1100] = 1 101 11000 M[1010] = 0 000 00111 // seconda frase della 1. indipendentemente da RDY M[1110] = 0 000 00111 M[1001] = 0 010 00111 // terza frase della 1. indipendentemente da RDY M[1101] = 0 010 00111 M[1011] = 0 010 00111 // quarta frase della 1. indipendentemente da RDY M[1111] = 0 010 00111