Le interfacce I/O sono quelle schede che permettono ai dispositivi I/O di collegarsi al bus e di scambiare dati all'interno del computer.
Esistono dei chip “standard” per la realizzazione di questi controllori :
- UART ( Universal Asynchronous Receiver Transmitter ) : legge un byte dal bus dati e genera in output un bit alla volta, su una linea seriale ( oppure riceve in input da un terminale )
- USART ( Universal Synchronous Asynchronous Receiver Transmitter ) : oltre alle funzionalità del UART, gestisce trasmissioni sincrone
- PIO ( Parallel I/O ) : trasmissione in parallelo
UART e USART hanno perso importanza con la scomparsa dei modem telefonici.
Interfacce PIO - esempio Intel 8255A

review
L’interfaccia è dotata di una serie di linee di I/O ( 3 porte da 8 bit l’una ) che vengono collegate ai dispositivi I/O, come tastiere e stampanti.
Questa interfaccia ha un registro di configurazione a 3 bit che controlla la direzione ( 0 - input o 1 - output ) di ogni singola porta ( sono 3 - 3 bit ).
Inoltre, ogni porta ha associato un registro latch a 8 bit che tiene “bloccato” l’eventuale input o output da 8 bit.
Quindi se la CPU vuole dare 8 bit in output, scrive sul registro della porta corrispondente ( in output ), invece se la CPU vuole leggere, legge il registro della porta corrispondente ( in input ).
L’interfaccia PIO ha altri pin :
D0-D7: 8 linee collegate al bus datiA0-A1: 2 linee di indirizzo per selezionare uno dei 4 registri interni ( 3 latch + 1 conf )CS#: combinare più interfacce PIO a 24 bit per una più grande, e quindi questo pin è utilizzato anche per la selezione del chipWR#,RD#: scrittura/lettura del bus datiRESET
Decodifica dell’indirizzo - indirizzamento di I/O
Fino ad ora abbiamo avuto un’idea vaga su come un chip di memoria o di I/O venga “selezionato”.
Infatti l’interfaccia PIO può essere selezionata in 2 modi :
- port-mapped I/O : selezionata come un dispositivo I/O reale
- necessario utilizzare una linea di bus di controllo che indica se l’operazione deve essere eseguita in memoria o su I/O
- utilizzate istruzioni specifiche ( es. IN e OUT )
- memory-mapped I/O : selezionata come parte della memoria
- assegnare 4 byte di spazio memoria per i 4 registri del PIO ( 3+1 )
La differenza tra port-mapped I/O e memory-mapped I/O è come quei registri vengono indirizzati e riconosciuti sul bus.
Consideriamo adesso un esempio di calcolatore embedded a 16-bit, che unisce tutti gli aspetti del livello logico digitale visti fino ad ora :
- mono-processore con :
- 16-bit di indirizzamento (
A0-A15) - bus dati a 8-bit (
D0-D7)
- 16-bit di indirizzamento (
- EPROM da 2 KB 8 byte per il programma
- RAM da 2 KB 8 byte per i dati
- interfaccia PIO Intel 8255A

( dove segnali blu - bus controllo, segnali gialli - bus dati, segnali verde - bus indirizzi )
Siccome abbiamo una CPU con 16 bit di indirizzamento avremo = 64 KB di spazio di indirizzamento. Infatti perché avremo bisogno di :
- 2 KB per EPROM
- 2 KB per RAM
- 4 byte per PIO Una possibile allocazione potrebbe essere la seguente :

Quindi avremo la seguente situazione di indirizzamento :
- EPROM : selezionata da qualunque indirizzo di memoria a 16 bit del formato
00000xxxxxxxxxxxdove i primi 5 bit (A15-A11) sono bassi, quindi nel range in hex0000-07FF - RAM : selezionata dagli indirizzi del formato
10000xxxxxxxxxxxdove il primo bitA15è alto ( siccome = 32 KB ) e gli altri 4 bit bassi, quindi nel range in hex8000-87FF - PIO : formato
11111111111111xxdoveA15-A2sono alti, quindi nel range in hexFFFC-FFFF
Quindi per selezionare il chip desiderato attraverso il pin in input CS# che si asserisce a valore basso 0, è utile utilizzare un circuito del genere :

