La versione precedente è abbastanza completa per dimostrare le funzionalità principali di una CPU; in questa versione si passa a estendere il progetto iniziale, per consentire il collegamento con dispositivi di input-output. Per fare questo viene aggiunto un bus dati e un bus indirizzi per l'I/O (input-output), inoltre, si aggiungono alcune linee nel bus di controllo (CON), da utilizzare per i componenti che costituiscono l'interfaccia con i dispositivi di I/O. Il progetto della CPU dimostrativa si basa su Tkgate e nelle sezioni successive si mostra anche il codice utilizzato per realizzare i dispositivi in questione con questo simulatore.
I dispositivi di I/O sono normalmente asincroni rispetto alla CPU (nel senso che non sono regolati dal clock che amministra la CPU), pertanto si rende necessario un protocollo per richiedere un'azione al dispositivo e per recepirne il risultato, tipico dei componenti asincroni. I dispositivi di I/O utilizzati in questo progetto dimostrativo hanno esteriormente le connessioni che si possono vedere nella figura successiva.
L'ingresso o l'uscita DATA consente di movimentare l'informazione che serve al dispositivo o che viene fornita dallo stesso. Gli ingressi REQ (request) e ACK (acknowledge) servono a negoziare il movimento dell'informazione (l'ingresso CLR serve ad azzerare il dispositivo). Vanno fatti due esempi, a seconda che si debba leggere un'informazione dal dispositivo, oppure che vi si voglia scrivere.
Per comunicare con un dispositivo di input, dal quale si deve leggere un'informazione, si comincia attivando l'ingresso REQ (t1), con il quale si intende richiedere il dato. Il dispositivo riceve la richiesta e predispone l'uscita DATA con l'informazione (t2); subito dopo, attiva l'uscita ACK (t3). A questo punto, trovando attiva l'uscita ACK si può leggere il valore dall'uscita DATA (t4) e al termine si può disattivare l'ingresso REQ (t5). Il dispositivo, osservando la disattivazione dell'ingresso REQ sa che l'informazione è stata recepita, quindi smettere di fornire l'informazione richiesta (t6) e disabilita a sua volta l'uscita ACK (t7).
Per comunicare con un dispositivo di output, nel quale si deve scrivere un'informazione, si comincia fornendo l'informazione sull'ingresso DATA (t0); subito dopo, si attiva l'ingresso REQ (t1) per informare il dispositivo della disponibilità dell'informazione. Quindi il dispositivo recepisce l'informazione (t2) e poi dà conferma attivando l'uscita ACK (t3). Ricevendo la conferma, non è più necessario trattenere l'informazione disponibile nell'ingresso DATA (t4), quindi viene disattivato l'ingresso REQ (t5) e dopo di questo il dispositivo disattiva l'uscita ACK (t7) concludendo l'operazione.
In questo progetto, per il momento, si realizzano soltanto due dispositivi di I/O: una tastiera e uno schermo. Dato che il progetto è sviluppato con Tkgate, i dispositivi vanno dichiarati attraverso codice Tcl/Tk. Il codice che viene mostrato qui è stato ottenuto modificando un dispositivo di esempio che fa parte della distribuzione di Tkgate.
|
|
I due programmi Tcl/Tk servono a fornire due moduli software, a cui poi si fa riferimento attraverso del codice Verilog. Nei listati successivi si vedono i moduli keyboard
e display
che graficamente si mostrano esattamente come nella figura u141.1.
|
|
Fino a qui, i dispositivi descritti funzionano in modo asincrono, ma per essere utilizzati devono essere adattati per poter funzionare in modo sincrono.
Le interfacce sincrone dei dispositivi di I/O devono potersi collegare al bus della CPU come gli altri moduli già presenti; tuttavia, per semplificare il cablaggio, invece di disporre di linee di controllo personali, viene creato un bus aggiuntivo, in cui indicare l'indirizzo del modulo a cui si vuole fare riferimento.
Come si vede dal disegno, il bus connesso agli ingressi ADDR serve a selezionare il dispositivo, mentre il bus connesso agli ingressi CON serve a uniformare le linee di controllo per tutti i moduli di I/O. In pratica, viene mostrato in seguito che questi due bus aggiuntivi provengono dallo stesso bus di controllo complessivo.
Gli ingressi CON sono uniformi, ma ogni modulo utilizza solo ciò che gli serve, ignorando il resto:
Le linee bus read e bus write sono le stesse degli altri moduli già descritti, riferendosi all'ordine di leggere o di scrivere sul bus della CPU. La linea request serve a richiedere l'operazione di lettura o scrittura del dispositivo, ma senza la necessità di mantenerla attiva come nel protocollo di comunicazione asincrona. La linea is ack? serve a ottenere, in qualche modo, l'informazione sul fatto che sia stata ricevuta la conferma da parte del dispositivo.
Il modulo di interfaccia della tastiera utilizza solo due delle quattro linee di controllo: bus write e request.
Per comunicare con il modulo della tastiera, è necessario inizialmente un segnale request che all'arrivo dell'impulso di clock viene memorizzato nel flip-flop JK superiore, attivandolo; tale flip-flop ha il compito di trasferire e fissare tale valore sull'ingresso REQ del dispositivo. Il secondo flip-flop JK, in posizione centrale, ha invece il compito di memorizzare l'esito emesso dall'uscita ACK e, se tale valore risulta memorizzato, non permette la ricezione di una nuova richiesta. Dopo la ricezione di un segnale request acquisito correttamente, nella migliore delle ipotesi, il dispositivo ha già accumulato un carattere digitato da tastiera e risponde quasi subito mettendo tale valore nella sua uscita DATA e poi attivando la sua uscita ACK. Al secondo impulso di clock, il flip-flop che manteneva attivo l'ingresso REQ si azzera e invece si attiva il secondo flip-flop al centro del disegno; tuttavia, il dispositivo mantiene il valore dell'uscita DATA. A questo punto si riceve il segnale bus write che consente di immettere il valore ricevuto dalla tastiera nel bus della CPU, azzerando contestualmente il flip-flop centrale. Se invece non si riesce a ottenere un carattere dalla tastiera, nel tempo stabilito, si ottiene il valore nullo (0016), dato che manca l'attivazione del flip-flop che conserva lo stato di ACK.
A livello di macrocodice, se la lettura della tastiera produce un carattere nullo, significa che non c'è alcun carattere pronto e occorre ripetere la lettura.
Il modulo DSP
utilizza tutte le linee dell'ingresso di controllo, in quanto deve poter leggere dal bus della CPU, quando si vuole visualizzare un carattere sullo schermo, ma deve anche poter scrivere sul bus, per fornire un codice di conferma della riuscita della visualizzazione.
Il modulo DSP
utilizza un registro modificato che serve principalmente per memorizzare il carattere da rappresentare sullo schermo; tuttavia, quando si attiva il suo ingresso isack, può immettere nel bus della CPU l'esito della visualizzazione: 0016 vuol dire che questa non è ancora stata confermata, mentre FF16 indica una rappresentazione avvenuta correttamente.
Per visualizzare un carattere sullo schermo, si comincia attivando la linea bus read: all'arrivo dell'impulso di clock il registro accumula il carattere leggendolo dal bus della CPU, mentre il flip-flop JK centrale si azzera, azzerando così l'ingresso ack del registro DREG. Quindi deve essere attivata la linea request e all'arrivo dell'impulso di clock questo valore viene memorizzato nel flip-flop JK superiore, il quale attiva così l'ingresso REQ del dispositivo. A quel punto, ritardo di propagazione permettendo, il dispositivo mostra il carattere già presente nel suo ingresso DATA (proveniente dal registro DREG e a un certo punto risponde attivando la sua uscita ACK. Quando l'uscita ACK del dispositivo si attiva e sopraggiunge un impulso di clock, il registro che manteneva il segnale REQ si azzera, mentre si attiva il flip-flop JK centrale, attivando di conseguenza l'ingresso ack del registro DREG.
Per la visualizzazione di un carattere, sono sufficienti i due cicli di clock iniziali, ma per verificare che la visualizzazione sia avvenuta effettivamente, occorre intervenire nuovamente con un'interrogazione. In tal caso si attiva la linea is ack? e bus write, in modo da immettere nel bus della CPU il valore che può essere 0016 o FF16, a seconda del fatto che non sia ancora stata ottenuta la conferma oppure che invece questa ci sia stata.
Nel bus della CPU, oltre ai moduli dei dispositivi di I/O, si aggiunge un registro, denominato IOA, con lo scopo di conservare l'indirizzo del dispositivo di I/O con il quale si vuole comunicare.
Dal disegno si può vedere che il bus di controllo complessivo è stato modificato, inserendo delle linee per il controllo del registro IOA e le quattro linee necessarie a controllare i dispositivi di I/O, spostando di conseguenza la linea usata per fermare il segnale di clock. Pertanto, nel codice della dichiarazione delle memorie e in quello che descrive i campi del bus di controllo, si apportano le modifiche seguenti:
|
Nell'elenco dei codici operativi si aggiungono istruzioni nuove e lo stesso poi nella descrizione del microcodice; in particolare, si ammettono macroistruzioni che richiedono due argomenti:
|
|
|
In questa sezione viene mostrato l'uso della macroistruzione out, per visualizzare un carattere attraverso il dispositivo DSP
. Nel listato successivo si mostra l'uso di out e poi anche io_is_ack per verificare che il carattere da visualizzare sia stato effettivamente mostrato. Il programma si limita a mostrare la lettera «H», ripetutamente, senza fermarsi.
|
Anche per questo esempio è disponibile un video: ogv http://www.youtube.com/watch?v=S9XqmTMYAj4.
In questa sezione viene mostrato l'uso della macroistruzione in, per recepire la digitazione da tastiera, attraverso il modulo KBD
. Nel listato successivo si usa anche l'istruzione out, usata per riemettere il carattere ricevuto.
|
Video: ogv http://www.youtube.com/watch?v=JhGoQhssWQM.
«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net