Package: DIP40Bus: A15-A0 (Bus indirizzi) - 16 bit - indirizzi possibili 64K ovvero 65536 celle D7-D0 (Bus dati) - 8 bit - 256 tipi di codice memorizzabile in una cella Linee controllo Bus: BUSRQ (Bus Request) - ingresso - riceve le richieste di controllo bus dalle perifericheBUSAK (Bus Acknowledge) - uscita - attiva bassa in risposta al segnale su BUSRQ per comunicare alla periferica che è stata accettata la richiesta di controllo bus Linee di controllo del sistema: M1 (Ciclo Macchina) - uscita - attiva bassa - durante la fase di lettura di un'istruzione, o dopo accettazione interrupt (insieme a IORQ)IORQ (I/O Request) - uscita three-state - attiva bassa - durante lettura o scrittura periferica I/O, o dopo accettazione interrupt (insieme a M1)MREQ (Memory Request) - uscita three-state - attiva bassa - quando c'e' indirizzo valido su bus indirizziRD (Read) - uscita three-state - attiva bassa - attiva (con MREQ) durante lettura o scrittura memoria - disattiva (con MREQ) durante lettura ingresso I/OWR (Write) - uscita three-state - attiva bassa - attiva (con MREQ) durante lettura o scrittura memoria - disattiva (con MREQ) durante scrittura uscita I/ORFSH (Refresh) - uscita three-state - attiva bassa - attiva per segnalare durante il ciclo istruzioni che sui bit A6-A0 del bus indirizzi è presente l'indirizzo per il refresh della RAM dinamicaLinee di controllo della CPU: HALT - uscita - attiva bassa - quando la CPU è inattiva (Non Operation) - esce dall'inattività con interrupt o segnale su RESET
NMI (Non Maskable Interrupt) - ingresso - attivo basso - interruzione non mascherabile - CPU salva Program Counter (PC) nello stack e salta a all'indirizzo 0066h
INT (Interrupt Request) - ingresso - attivo basso - interruzione generata da una periferica - accettata se interruzione abilitata e se BUSEQ disattivo - CPU verifica modalità interruzione:
modo 0: CPU salva PC in stack - esegue istruzione inviata da periferica, per esempio un restart o un call
modo 1: CPU salva PC in stack - salta a all'indirizzo 0038h
modo 2: CPU salva PC in stack - salta a all'indirizzo risultante da byte fornito da periferica (LSB) e byte in registro interruzione (MSB)
RESET - ingresso - attivo basso - provoca l'azzeramento di PC
WAIT - ingresso - attivo basso - segnale di attesa quando periferica o memoria non sono pronti per trasferimento dato
Interfacciamento CPU - RAM - EPROM:
Per il trasferimento dati sono necessari segnali sui seguneti pin: A15-A0, D7-D0, MREQ, WR, RD.
Per stati di attesa o refresh si usano WAIT e RFSH.
Per collegare un banco da 2k di eprom (dall'indirizzo 0000h a 07FFh) ed uno da 2k di ram (dall'indirizzo 0800h a 0FFFh) si deve realizzare un circuito di decodifica che attivi il Chip Enable (CE) della eprom o della ram in funzione dell'indirizzo (pin A11=0 per la eprom, A11=1 per la ram).
L'integrato 74138 può svolgere la funzione di circuito di decodifica con i seguenti collegamenti in ingresso: A11 a A, A12 a B, A13 a C, A14 e A15 con una porta OR a G2A, MREQ a G2B, Vcc a G1.
Mentre quelli in uscita sono: Y0 a CE della eprom, Y1 a CE della ram.
Interfacciamento CPU - PERIFERICHE:
CTC (Contatore/Timer programmabile)
E' un contatore programmabile usato dallo Z80 per:
- misurare intervalli di tempo attraverso il conteggio del clock,
- sentire eventi esterni (pulsanti, interruttori, ecc.) attraverso le linee clock/trigger.
Contiene quattro contatori. Viene collegato al bus dati. Ha un ingresso di abilitazione CE.
Il CTC viene letto quando arriva un segnale attivo su RD. Il CTC può generare interruzioni attraverso il pin INT che si collega a INT dello Z80. Gli ingressi M1 e IORQ servono a gestire le
interruzioni da parte dello Z80 e sono collegato agli omonimi dello Z80.
Il CTC può essere collegato in catena (daisy chain) con altre periferiche: ha un pin IEI di ingresso (interrupt enable input) e un pin IEO di uscita.
I quattro contatori si programmano selezionando il contatore con i piedini CS1 e CS0.
I quattro ingressi CLK/TRG (clock/trigger) servono per contare gli eventi.
Le quattro uscite ZC/TO (zero count/time out) servono a segnalare il fine conteggio.
Il quarto contatore non ha segnale di uscita per cui può segnalare il fine conteggio solo con una interruzione.
L'ingresso RESET azzera i contatori, mette in three-state le uscite e disabilita la generazione delle interruzioni.
All'interno di un CTC per ogni canale c'è un registro di controllo che contiene la channel
control word, la specifica dei dettagli del funzionamento di un contatore.
C'è poi un registro della costante di tempo, il numero che il contatore deve contare.
Ogni contatore è dotato di un contatore down a 8 bit.
Quando il contatore arriva a zero attiva l'uscita ZC/TO.
Il segnale clock/trigger arriva direttamente al contatore down, mentre mentre il segnale di clock
passa per un prescaler.
Modo timer del CTC
In modo timer un contatore del CTC misura intervalli di tempo contando gli impulsi di clock del sistema.
Al prescaler possono essere assegnati i valori 16 o 256. Con 256 solo dopo 256 fronti di clock il contatore down riceverà un impulso.
Per conoscere l'intervallo di tempo misurato occorre moltiplicare la costante di tempo, per il valore dei prescaler e per il periodo del clock.
Se la costante di tempo è 256, il prescaler è 256, il clock è di 1 MHz (periodo 1 microsecondo), il contatore segnala che sono passati 65536 microsecondi, ovvero 65 millisecondi.
I contatori 0, 1, 2 segnalano di essere arrivati a fine conteggio con un impulso di durata pari ad un ciclo di clock sull’uscita ZC/T0 e generano un’interruzione, se sono abilitati.
Il contatore numero 3, non disponendo di un’uscita può generare soltanto un’interruzione.
Quando il contatore termina il conteggio, la costante di tempo viene caricata nuovamente nel contatore down ed il conteggio riprende.
Il contatore può essere programmato per partire quando si scrive la costante di tempo
o quando arriva un impulso dell’ingresso CK/TG.
Gli intervalli di tempo misurabili mediante CTC si possono aumentare ponendo più
contatori in cascata (collegando ZC/T0 con CK/TG del successivo counter).
Il primo contatore del CTC funziona da timer e conta gli impulsi di clock del
sistema, mentre tutti gli altri contatori funzionano da counter. L’uscita ZC/TO del primo contatore
rappresenta l’ingresso CK/TG del secondo contatore. Il primo contatore misura 65,536 millisecondi, mentre il secondo contatore misura 256 impulsi, ovvero 256x65536=16.777.216μs=16,78 secondi.
Collegando l’uscita ZC/TO del secondo contatore all’ingresso CK/TG del terzo contatore si arriva a misurare circa 71 minuti. Collegando il terzo contatore al quarto contatore si arriva a misurare 303 ore.
Modo Counter del CTC
Il contatore down conta i fronti attivi del segnale CK/TG.
In questo modo il CTC è anche un contatore di eventi.
Le specifiche da rispettare sono le seguenti:
- l’impulso in ingresso deve avere una durata minima (200 nanosecondi nella versione base del CTC),
- il fronte attivo dell’evento deve arrivare prima del fronte di salita del clock di almeno 210 nanosecondi, altrimenti esso verrà registrato sul fronte successivo del clock,
- se gli eventi si susseguono troppo rapidamente il contatore non è in grado registrarli, essi devono essere distanti almeno due periodi di clock.
Programmazione del CTC
Per programmare un CTC occorre inviare al singolo CTC una channel control word (parola di controllo canale), D7-D0, dove:
- D0 è sempre 1,
- D1 - nel caso il contatore stia già contando: se è 0, la scrittura della parola di controllo non interrompe il conteggio in atto - se è 1, la scrittura determina un reset del contatore, il suo contenuto si azzera e per riprendere a funzionare il contatore deve attendere una nuova costante di tempo,
- D2 - se è 0 indica che non segue una costante di tempo per cui può essere utilizzato quando si vuole riprogrammare il contatore senza modificare la costante di tempo - se è 1 indica che seguirà una
costante di tempo per cui il canale interpreterà il prossimo byte in arrivo come costante di tempo,
- D3 - ha senso solo per la modalità timer (in modalità counter il suo valore è indifferente) - se è 0 il conteggio si avvia con partenza software - se è 1 il conteggio si avvia con partenza hardware,
- D4 - se è 0 indica che il fronte attivo dell’ingresso CK/TG è quello di discesa, se è 1 indica che il fronte attivo è quello di salita
- D5 - ha senso solo per la modalità timer (in modalità counter il suo valore è indifferente) - imposta il valore del prescaler a 16 (se è 0) o a 256 (se è 1)
- D6 - indica la modalità di funzionamento - se è 0 significa modalità timer - se è 1 significa modalità counter
- D7 - se è 0 disabilita la generazione di interruzioni - se è 1 abilita la generazione di interruzioni
Alla channel control word segue (se il suo bit D2 è ad 1) la costante di tempo (time constant word) che può valere da 0 a 255 (lo 0 viene interpretato come 256).
Alla costante di tempo segue la interrupt control word, cioè la parte bassa del vettore delle interruzioni, ovvero il byte che il contatore deve inviare al microprocessore quando quest’ultimo esegue il ciclo di riconoscimento relativo a un’interruzione del contatore.
Nel caso del CTC vi è una particolarità: il bit D0 è sempre a 0 come ogni interrupt control word, nei bit D1 e D2 il CTC inserisce un valore corrispondente al contatore che ha generato l'interrupt.
Esempio: la tabella dei vettori delle interruzioni è in memoria a partire dall’indirizzo 1A00h.
Al terzo contatore gli si deve inviare come interrupt vector word, il byte 04h.
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 0 0
Lo Z80 in caso di interruzione da parte del terzo contatore va a leggere nella tabella dei vettori delle interruzioni all’indirizzo 1A04h.
Gerarchia di priorità delle interruzioni del CTC
I quattro canali o contatori del CTC sono in daisy chain fra loro per cui il primo contatore ha priorità più alta rispetto al secondo contatore, questo rispetto al terzo contatore e così via.
PIO (Parallel Input Output)
La PIO è un’interfaccia programmabile parallela di ingresso e di uscita.
E' dotato di uscite di three-state per evitare conflitti sul bus dati.
Le periferiche sono in genere più lente dello Z80 nelle operazioni di IO, per cui occorre che esse siano dotata di un buffer, in cui il microprocessore scrive temporaneamente i dati.
Per evitare attese allo Z80 si utilizza un protocollo di handshake fra periferica e microprocessore costituito da alcuni segnali che consentano allo Z80 di avvertire la periferica che è disponibile un dato per essa, e alla periferica di avvertire il microprocessore quando ha terminato di acquisire il dato.
Per evitare che il microprocessore debba attendere la periferica è utile usare l'interrupt.
Per esempio il microprocessore invia un dato alla periferica e poi svolge altre operazioni.
Quando la periferica termina di acquisire il dato può generare un’interruzione per costringere il microprocessore a dedicarle nuovamente la sua attenzione ed inviarle un nuovo dato.
Tutte queste problematiche vengono risolte automaticamente interponendo un PIO fra periferica e microprocessore.
D7-D0 (bus dati)
PA7-PA0 e PB7-PB0 (porte parallele) - transito dati - collegate a due periferiche
RDY (Ready) e STB (Strobe) per poter effettuare un dialogo di handshake con la periferica
INT - serve alla PIO per generare interruzioni - può essere messo anche in daisy chain con altri
dispositivi per cui presenta l’ingresso IEI e l’uscita IEO (la PIO utilizza il modo 2 delle interruzioni)
Il modo 2 d'interruzione prevede che dopo il segnale di interrupt, la CPU attiva contemporaneamente i pin M1 e IORQ (a zero), poi la periferica mette sul bus dati la parte bassa del vettore delle interruzioni.
Nel circuito sopra disegnato il pin E (Chip Enable) è collegato a A2, mentre per selezionare la porta A o la porta B lo Z80 utilizza il pin A/B (se è a 0 viene selezionata la porta A, se è a 1 viene selezionata la porta B). Infine per indicare alla PIO se lo Z80 sta inviando un dato (per la periferica) o gli sta inviando una parola di programmazione, si utilizza il pin C/D (se è a 0 si tratta di un dato, se è a 1 è una parola di programmazione). Alla PIO arriva solo il segnale RD.
La struttura interna del PIO è rappresentata nella figura seguente.
La struttura di ogni singola porta è invece la seguente.
Il Mode Control Register è il registro il cui contenuto indica il quale modalità opera la porta
L’interrupt control logic controlla la generazione delle interruzioni
L’handshake control logic controlla i segnali di handshake ed il dialogo fra porta e periferica
Il data output register è un buffer per i dati che devono andare verso la periferica
Il data input register è un buffer per i dati che provengono dalla periferica
L’input/output select register, il mask control register e il mask register sono registri che vengono coinvolti nel modo tre di funzionamento della porta.
Modi di funzionamento della PIO
Si possono definire tre modalità diverse di trasmissione:
· Simplex
· Half-duplex
· Full-duplex
Nel collegamento simplex i dati possono viaggiare soltanto in un senso. Il ruolo di trasmettitore e di ricevitore sono assegnati. Il dispositivo ricevitore non può inviare a sua volta dati al trasmettitore.
Nel collegamento half-duplex esiste un’unica linea di connessione come nel caso del collegamento simplex. I ruoli di trasmettitore e ricevitore non sono fissati in modo rigido ed i dati possono viaggiare in entrambe le direzioni. La linea di comunicazione è unica, quundi di volta in volta uno dei due terminali è in ricezione è l’altro in trasmissione. Per scambiare i ruoli occorre un certo tempo di turn-around.
Nel collegamento full-duplex i due sistemi sono collegati mediante una doppia linea trasmissivo che consente di effettuare contemporaneamente le operazioni di trasmissione e ricezione. Raddoppia la quantità di dati che si possono scambiare nell’unità di tempo e si eliminano i tempi morti dovuti al turn-around.
Modo 0: Byte in uscita
È una modalità simplex che prevede che i dati vadano sempre dal microprocessore alla periferica. Il microprocessore scrive il dato all’indirizzo della porta del PIO.
All’interno della porta si genera un segnale interno WR* = RD • CE • C/D • IORQ
WR* va a zero quando il microprocessore scrive il dato sulla porta per cui si ha contemporaneamente che
· RD è ad uno (si sta scrivendo)
· CE è a zero (il microprocessore ha abilitato il PIO)
· C/D è a zero (quindi si sta inviando un dato alla periferica)
· IORQ è a zero (si sta effettuando un’operazione di ingresso uscita)
Dal lato della porta si ha la seguente temporizzazione.
Mentre WR* è attivo, il dato viene trasferito sui piedini che collegano la porta alla periferica (Port Output), quando il segnale WR* si rialza vuol dire che l’operazione di scrittura da parte del microprocessore sulla porta è terminata.
Allora la porta alza il segnale READY per avvertire la periferica che un dato è disponibile per essa.
La periferica risponde mandando basso il segnale STROBE.
Finché questo segnale rimane basso vuol dire che la periferica è ancora impegnata nell’acquisizione del dato stesso impedendo ala porta del PIO di inviarle altri dati.
Quando STROBE si rialza indica alla porta della PIO che il trasferimento del dato è stato completato e si può inviare alla periferica un altro dato. Se la porta è abilitata ad utilizzare le interruzioni genera a questo punto un’interruzione per il microprocessore per costringerlo ad inviare un nuovo dato.
Modo 1: Byte in ingresso
Anche in questo caso si tratta di un collegamento simplex. Stavolta, però, i dati provengono dalla periferica e vanno verso il microprocessore.
La periferica abbassa il segnale di STROBE per avvertire la porta che è disponibile un dato da mandare al microprocessore. La porta provvede poi a scaricare il dato sul bus che la collega alla porta. Dopo che si alza il segnale di STROBE, la porta del PIO abbassa il segnale READY. Finché questo segnale rimane basso la periferica sa che il dato non è stato ancora acquisito dal microprocessore e quindi essa non può inviare un altro dato. Quando abbassa il segnale READY, la porta, se è abilitata, può generare un’interruzione per indicare al microprocessore che deve leggere il dato depositato nel buffer della porta. Quando il microprocessore inizia il ciclo di lettura nella porta si genera un segnale *RD che resta a zero finché è in corso l’acquisizione del dato da parte del microprocessore. Se questo segnale si rialza, vuol dire che la lettura del dato da parte del microprocessore è terminata per cui
READY si rialza indicando alla periferica che può inviare un nuovo dato
Modo 2: byte bidirezionale
In questa modalità il PIO consente un dialogo di tipo half-duplex permettendo ai dati di viaggiare in entrambi i sensi alternativamente. In questo caso occorre, però, duplicare le linee di handshake.
Occorrono due segnali per garantire il dialogo nel caso che il dato vada verso la periferica e due linee per i dialogo nel caso che il dato vada dalla periferica alla porta. La soluzione consiste nel collegare la
periferica alla porta A e di utilizzare per l’handshake le linee di controllo sia della porta A che della porta B. in tal caso la porta B non può essere utilizzata per collegarle una periferica, poiché non sarebbe in grado di gestire protocolli di handshake. La porta B può essere utilizzata soltanto nel modo 3 che vedremo più avanti. Le linee della porta A vengono utilizzate per controllare l’invio dei dati dalla porta alla periferica e le linee della porta B vengono utilizzate per controllare l’invio dei dati dalla periferica alla porta A.
Si tratta della fusione dei modi 0 ed 1. C’è però una piccola differenza. Nel modo zero la porta scarica il
dato sul bus che la collega alla periferica prima di attivare il segnale READY. Nel modo 2, invece, la porta attiva prima READY, aspetta di avere una conferma dalla periferica mediante il segnale STROBE e poi invia il dato in uscita. Il motivo di questa differenza è il seguente. Immaginiamo che la periferica abbia inviato un dato verso la porta. Ora vi è un turnaround, cioè è la porta a voler inviare un dato alla periferica. Quest’ultima potrebbe aver ritardato nel rilasciare il bus, per cui si potrebbe avere che contemporaneamente sia la porta che la periferica tentano di inviare un dato sul bus creando un conflitto. E’ per questo che, nel modo 2, la porta aspetta l’OK da parte della periferica prima di inviare il dato sul bus.
Modo 3 bit a bit
Questa modalità viene utilizzata quando si vuole interfacciare il microprocessore con sensori o attuatori da comandare.
In questo caso non si tratta di far transitare dati con parallelismo a 8 bit, ma ogni bit della porta ha una sua identità indipendente. In questa modalità ogni singola linea della porta può essere programmata come ingresso o come uscita indipendentemente dalle altre. In questa modalità, i segnali di handshake non vengono utilizzati. Quando il microprocessore tenta di leggere la porta del PIO, le linee di ingresso vengono latchate, cioè vengono congelate al valore che avevano quando si è abbassato il segnale di RD. In tal modo eventuali variazioni che subiscono le linee di ingresso durante la lettura non vengono prese in considerazione dl a microprocessore. Per le linee impostate come uscita i bit corrispondenti che vengono letti contengono l’ultimo valore che era stato inserito nell’ultima operazione di scrittura. Molto utili sono le caratteristiche di tale modo per quanto riguarda la generazione di interruzioni.
Innanzitutto tra tutti i sensori collegati ai pin di ingresso della porta, può accadere che solo alcuni abbiano un’importanza tale da volere che generino un’interruzione. In tal caso il PIO consente di mascherare i bit di ingresso che non volgiamo che possano causare un’interruzione.
Inoltre può accadere che noi vogliamo che sia generata un’interruzione quando almeno uno dei sensori d’ingresso sia attivo (si parla di condizione di OR logico) oppure che sia generata l’interruzione quando tutti i sensori non mascherati siano attivi (condizione di AND logico). Il Pio consente,
tramite opportuna programmazione di impostare, per la generazione delle interruzioni, l’AND o l’OR logico
Si possono collegare alla porta sensori attivi alti o attivi bassi. Il Pio consente di stabilire se i sensori collegati vanno considerati attivi quando danno un segnale alto o danno un segnale basso. In tal caso non si possono, però, utilizzare sensori promiscui. Si possono utilizzare cioè, sensori di un
solo tipo in una porta.
SIO (Serial Input Output)
La Sio Z80 Serial (Ingresso/Uscita seriale) è una porta periferica, a due canali, progettato per soddisfare un’ampia varietà di comunicazione. La sua funzione è quella di convertitore/controllore dati da serie a parallelo e da parallelo a serie, è programmabile tramite software in modo da ottimizzare qualsiasi comunicazione dati. La SIO è in grado di trattare comunicazioni con protocolli asincroni, sincroni orientati al byte, può generare e controllare codici CRC (Controllo di ridondanza ciclico) in ogni comunicazione sincrona e può essere programmato per verificare l’integrità dei dati scambiati.
Struttura della SIO
Contenitore a 40 piedini DIP
Alimentazione singola a + 5V
Alimentazione di sistema singolo a + 5V
Tutti gli ingressi e uscite sono compatibili TTL.
Descrizioni dei segnali della SIO
D7-D0 - bus dati del sistema - serve per trasferire dati e comandi tra la CPU e la SIO.
B/A - selezione del canale A o B, il livello alto seleziona il canale B - definisce quale canale è abilitato durante un trasferimento di dati tra la CPU e la SIO
C/D - selezione comandi o dati - definisce il tipo di informazione trasferita tra laCPU e la SIO, un livello alto durante il ciclo di scrittura fa si che le informazioni presenti sulbus dei dati siano interpretati come comandi dal canale selezionato. Un livello basso significa che le informazioni sono interpretate come dati.
CE (Chip Enable) - abilitazione del chip, un livello basso abilita la SIO ad accettare comandi o dati in ingresso dalla CPU durante il ciclo di scrittura oppure inviare dati alla CPU duranteil ciclo di lettura.
M1 - primo ciclo macchina - quando i segnali M1 e RD sono attivi, la CPU acquisisce un’istruzione dalla memoria
IORQ - richiesta di ingresso/uscita. IORQ è usato in congiunzione con B/A, C/D, CE e RD per trasferire comandi e dati fra la CPU e il SIO
RD - richiesta di lettura. Se RD è attivo un’operazione di lettura di memoria o di I/O è in corso
RESET - azzeramento - un livello sull’ingresso attivo basso disabilita sia il ricevitore che il trasmettitore
IEI - ingresso di abilitazione delle interruzioni (attivo alto). Un livello alto su questa linea indica che nessun altro componente con priorità più elevata sta richiedendo un’interruzione allaCPU
IEO - uscita di abilitazione delle interruzioni (attivo alto). Questo segnale è alto solo se IEI è alto e la CPU non sta già eseguendo un’interruzione per questa SIO
INT - richiesta d’interruzione
W/RDYA W/RDYB - attesa / pronto A, attesa / pronto B - queste uscite possono essere programmate comelinee wait per sincronizzare la CPU alla velocità di trasferimento dati della SIO
CTSA CTSB - libera l’invio dei dati dal canale A o B (abilitazione alla trasmissione)
DCDA DCDB - rivelazione della portante di dati, sono simili agli ingressi CTS, eccetto che sonoutilizzabili come abilitazione ai ricevitori
RxDA RxDB - ricezioni dati canale A e canale B
TxDA TxDB - trasmissioni dati canale A e canale B
RxCA RxCB - clock di ricezione canale A e canale B (ingressi)
TxCA TxCB - clock di trasmissio