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 dati
  • A0-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 chip
  • WR#, RD# : scrittura/lettura del bus dati
  • RESET

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 )
  • 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 00000xxxxxxxxxxx dove i primi 5 bit ( A15-A11 ) sono bassi, quindi nel range in hex 0000 - 07FF
  • RAM : selezionata dagli indirizzi del formato 10000xxxxxxxxxxx dove il primo bit A15 è alto ( siccome = 32 KB ) e gli altri 4 bit bassi, quindi nel range in hex 8000-87FF
  • PIO : formato 11111111111111xx dove A15-A2 sono alti, quindi nel range in hex FFFC-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 :


Esempio microarchitettura