minilogo.gif (2094 bytes)

Ricetrasmissione seriale asincrona

left.gif (1019 bytes) up.gif (1014 bytes) right.gif (1020 bytes)

Il trasmettitore seriale

Le trasmissioni seriali vengono suddivise in due grandi categorie. Una trasmissione seriale si dice sincrona se insieme al segnale dei dati viene trasmesso (su un canale separato, o modulato insieme ai dati) anche un segnale di clock con cui sincronizzare il trasmettitore con il ricevitore. In una trasmissione seriale asincrona, invece, il segnale di clock non viene trasmesso e la sincronizzazione tra il ricevitore ed il trasmettitore avviene in altro modo. Nel seguito dell'esercitazione ci occuperemo solamente delle trasmissioni asincrone, che sono peraltro le più utilizzate nei collegamenti a bassa velocità.

Nelle trasmissioni seriali asincrone permangono tuttora molti termini ereditati dalle prime trasmissioni telegrafiche; in particolare, lo stato logico 1 viene detto mark, mentre lo stato logico 0 viene detto space. Ogni bit viene emesso per un intervallo di tempo T costante. Per mantenere la sincronizzazione tra il trasmettitore ed il ricevitore i dati vengono organizzati in pacchetti, detti caratteri, aventi numero predeterminato e costante di bit; tra un carattere e l'altro deve trascorrere un certo tempo minimo in cui viene trasmesso un ben preciso livello logico, generalmente un mark. L'inizio di ogni pacchetto viene invece marcato mediante l'invio di uno space; in questo modo, il ricevitore può rimanere in attesa della transizione da mark a space prima di iniziare la ricezione del pacchetto di bit. Il periodo di tempo in cui viene trasmesso questo segnale iniziale coincide generalmente con T, lo stesso periodo di tempo riservato agli altri bit, ed il segnale prende il nome di start bit.

Dopo lo start bit vengono inviati, uno per volta, i bit del carattere, il numero dei quali è preventivamente noto sia al ricevitore che al trasmettitore; il primo bit ad essere trasmesso è in genere quello meno significativo del carattere. Dopo i bit di informazione viene spesso trasmesso un bit di parità, utilizzato per controllare (entro i limiti di questo metodo per la rivelazione degli errori) se i dati inviati sono stati ricevuti correttamente dalla parte del ricevitore, oppure se si sono verificati degli errori nella trasmissione su lunga distanza dei dati. Anche in questo caso è ovvio che trasmettitore e ricevitore devono essere d’accordo non solo sulla presenza o meno di questo bit, ma anche se la parità deve essere pari o dispari.

Dopo aver trasmesso il bit di parità viene trasmesso uno o più bit di mark, che vengono chiamati bit di stop (stop bit). Questi bit vengono trasmessi sia per garantire ad apparecchiature a bassa velocità un minimo periodo di tempo prima dell'inizio del successivo pacchetto di dati, sia per consentire la risincronizzazione sullo start bit del carattere successivo. Si noti che tra un pacchetto ed il successivo può passare un periodo di tempo qualunque (non necessariamente multiplo della durata T di ciascun bit), in cui la linea di trasmissione rimane al livello di mark. Se T è il periodo di tempo (costante) riservato ad ogni bit trasmesso, allora il numero 1/T si chiama velocità di trasmissione, od anche baud-rate (dove il termine baud è l'abbreviazione di Baudot, che fu l’inventore di un codice a 5 bit ancor oggi utilizzato in certi tipi di trasmissioni telegrafiche). Ad esempio, il formato di un tipico pacchetto da 8 bit di informazione è quello illustrato in Fig. 2.

Fig. 2

Formato di un pacchetto asincrono da 8 bit.

Esaminiamo adesso la struttura di un circuito che accetta dati in parallelo da un calcolatore e li emette in forma seriale con le modalità viste sopra. È chiaro che il calcolatore, essendo generalmente molto più veloce del trasmettitore seriale, deve essere in grado, una volta inviato il dato, di rimanere in attesa fino a che il trasmettitore seriale non abbia finito di trasferire tutti i bit del pacchetto al modem. Occorre quindi definire un protocollo tramite cui il calcolatore ed il trasmettitore seriale siano in grado di scambiarsi queste informazioni. I segnali, o le sequenze di bit che permettono a due dispositivi di inviarsi a vicenda delle segnalazioni di controllo o di stato si chiamano segnali di handshake.

Il trasmettitore seriale sarà allora dotato di un segnale in uscita, chiamato BUSY, che rimane attivo nell'intervallo di tempo in cui il trasmettitore seriale è impegnato ad inviare i bit uno dopo l'altro al modem, e comunica dunque al calcolatore l'impossibilità di accettare ulteriori dati.

Oltre alle 8 linee parallele PD0-7 che trasportano i dati dal calcolatore al trasmettitore seriale, all'ingresso di quest'ultimo avremo ancora un altro segnale di tipo impulsivo, che chiameremo STROBE, e che il calcolatore provvederà a portare attivo quando sulle linee PD0-7 è presente un dato da trasmettere e i livelli logici su di esse sono stabili. Tuttavia, non vi è alcuna garanzia che il segnale di STROBE rimanga alto per tutto il tempo necessario al trasmettitore ad inviare serialmente tutti i bit di informazione del pacchetto; il trasmettitore deve avere pertanto la capacità di memorizzare gli 8 bit in ingresso e poi operare su quanto ha memorizzato per eseguire la trasmissione seriale.

In linea di principio, la realizzazione del trasmettitore seriale richiederà dunque uno shift register con caricamento parallelo, un clock interno avente la frequenza di trasmissione desiderata, e un contatore che permetta di contare i bit trasmessi. Di norma, la realizzazione del generatore di clock per il trasmettitore seriale non presenta particolari problemi; gli oscillatori controllati a quarzo reperibili in commercio costituiscono dei sottoassiemi completi. Le loro frequenze di oscillazione sono dell'ordine dei Mhz, ma è raro che una trasmissione seriale asincrona, ad esempio su linea telefonica, possa superare i 48.800 Kbaud. Occorrerà dunque ricorrere quasi sempre a un divisore di frequenza che può essere facilmente realizzato mediante un contatore avente opportuno modulo di conteggio. Ad esempio, la divisione per 2 della frequenza del generatore di clock viene realizzata mandando il segnale ad un contatore ad un bit, e prelevando il risultato dall'uscita Q0 di tale contatore; il bit Q0 infatti cambia di stato ad ogni fronte attivo del clock, fornendo così una frequenza di valore dimezzato, come è mostrato in Fig. 3.

Fig. 3

Divisione di frequenza per 2.

Si noti che qualunque sia il duty cycle del clock originale, con questo metodo il clock a frequenza dimezzata avrà sempre un duty cycle del 50%. Analogamente, per dividere la frequenza di un clock per 4 si utilizza un contatore a 2 bit, utilizzando come uscita il bit più significativo del contatore. Per dividere la frequenza di un clock per un numero che non sia una potenza intera di 2, occorrerà utilizzare un contatore di modulo opportuno, prelevando l'uscita dal bit più significativo di tale contatore. Si noti tuttavia che il duty cycle del clock così ottenuto non sarà più del 50%, come avviene invece per tutti i contatori il cui modulo è una potenza intera di 2.

Come accennato sopra, il clock della frequenza di trasmissione è generalmente molto più lento del clock interno del calcolatore (al giorno d'oggi, le CPU operano con clock anche da oltre 100 Mhz). Per questo motivo ci dovremo aspettare che il segnale di strobe che il calcolatore invia al trasmettitore seriale abbia durata molto più breve del periodo del clock di trasmissione, il che non dà alcuna garanzia che esso sia attivo in corrispondenza dei fronti attivi del clock di trasmissione: quest'ultimo, dunque, non può essere usato con sicurezza per campionare i dati paralleli in ingresso. Dovremo allora ricorrere ad un registro ad 8 bit, con cui catturare e memorizzare gli 8 bit paralleli nel momento in cui la CPU emette il segnale di STROBE. In questo modo, per campionare correttamente i dati sarà sufficiente che lo strobe duri almeno quanto il tempo di setup del registro (che è generalmente dell'ordine di qualche nanosecondo). Dovremo poi usare un flip-flop che commuti in ON all'arrivo del segnale di strobe e rimanga tale fino a che la trasmissione non sia stata completata; il segnale uscente da tale flip-flop può dunque essere utilizzato per abilitare lo shift register e il contatore.

Osserviamo che lo shift register dovrà essere dotato di un ingresso di load di tipo sincrono, in modo che tutti i bit da trasmettere possano avere la stessa durata T. Se infatti lo shift register avesse un caricamento di tipo asincrono e si utilizzasse STROBE come segnale di load, può benissimo accadere che, se STROBE arrivasse all'interno del periodo T del clock di trasmissione, (e, come osservato sopra, non è possibile garantire che ciò non avvenga), il primo bit trasmesso avrebbe durata sicuramente inferiore a T. La circostanza è illustrata in Fig. 4. Si osservi come il dato PD0 che si presenta in uscita immediatamente dopo il caricamento dello shift register abbia durata inferiore a quella degli altri bit.

Fig. 4

Effetto di un caricamento asincrono: il dato PD0 ha durata inferiore agli altri dati.

Gli shift register con load di tipo sincrono hanno un ingresso di controllo chiamato SHIFT/LOAD (che da ora in poi abbrevieremo con S/L): quando questo segnale è alto, lo shift register esegue un normale shift sui dati ad ogni fronte attivo del clock, mentre quando è basso, ad ogni fronte attivo del clock vengono caricati i dati in parallelo. Sarà di conseguenza necessario generare questo segnale S/L, che deve operare come indicato in Fig. 5.

Fig. 5

Segnale di SHIFT/LOAD e sua temporizzazione.

Si osservi che il segnale S/L viene portato a zero per il caricamento parallelo a partire dal fronte di clock successivo all'arrivo dell'impulso di strobe, anziché immediatamente in corrispondenza dell'impulso di strobe stesso. Può accadere infatti che il tempo che intercorre tra l'arrivo dell'impulso di strobe e l'arrivo del successivo fronte attivo del clock sia troppo breve; in tal caso, per via dei ritardi di commutazione dei circuiti logici, il segnale S/L potrebbe raggiungere il livello logico basso solo dopo l'arrivo del fronte attivo del clock, e lo shift register potrebbe non caricare correttamente i dati. Al contrario, mandando basso il segnale S/L in corrispondenza del primo fronte attivo del clock successivo all'impulso di strobe (in questo fronte di clock lo shift-register non carica i dati, a causa del tempo di commutazione dei circuiti) e mantenendolo basso per un intero periodo di clock, si avrà la piena sicurezza che al successivo fronte attivo del clock (il punto a del grafico) lo shift register caricherà correttamente i dati paralleli. Per realizzare questo comportamento, dobbiamo disporre anzitutto di un segnale, che chiameremo Z1, che tenga memoria dell'arrivo del segnale di strobe; useremo allo scopo un flip-flop di tipo D. Il segnale S/L verrà allora generato a partire da due altri segnali Z2 e Z3, che hanno normalmente livello logico basso: il primo di essi va alto al fronte di clock successivo all'impulso di strobe, mentre il secondo va alto in corrispondenza al fronte di clock seguente. Il segnale S/L si ricava allora facilmente mediante la relazione

Il diagramma di temporizzazione di questi segnali è illustrato in Fig. 6.

Fig. 6

Temporizzazioni dei segnali legati allo STROBE.

Prendiamo adesso in esame gli aspetti del progetto relativi ai bit di start, di stop e di parità. Se i bit da trasmettere sono 8, allora conviene ricorrere ad uno shift register che abbia 10 bit, in modo che i due bit in più siano dedicati rispettivamente allo start bit e al bit di parità. Indicando con DI0-9 i dieci bit paralleli in ingresso allo shift-register, si ha che:

Per calcolare in parallelo la parità di tutti i bit in ingresso, è sufficiente ricorrere a un albero di XOR. Ad esempio, il circuito di Fig. 7 calcola la parità pari di tutti i dati da trasmettere; per calcolare la parità dispari sarà sufficiente negare l'uscita del circuito.

Fig. 7

Circuito per il calcolo della parità.

Il segnale BUSY potrebbe essere generato utilizzando direttamente Z1; bisognerebbe però far tornare Z1 a zero non appena è possibile accettare nuovi dati in ingresso. Il diagramma completo di temporizzazione (Fig. 8) di una trasmissione di 8 bit ci aiuta a capire in quale istante è opportuno riportare a zero Z1 (nonché i segnali Z2 e Z3); nella figura, in corrispondenza dei vari periodi del clock è stata riportata l'uscita dello shift register, ossia del trasmettitore seriale.

Fig. 8

Diagramma di temporizzazione del trasmettitore seriale.

Supponendo di dover trasmettere due bit di stop, vediamo che dal fronte di salita a del grafico in poi possiamo già trasmettere un bit di start per un nuovo pacchetto; potremmo quindi portare basso il segnale BUSY dopo il fronte di salita a. Se esaminiamo l'inizio del pacchetto, tuttavia, possiamo notare che tra l'arrivo del segnale di strobe ed il caricamento parallelo dello shift register passano due fronti di salita del clock (questa situazione è evidenziata dalla lettera A in Fig. 8). In altri termini, possiamo portare a 0 i segnali Z1, Z2 e Z3 (e quindi anche BUSY) già in corrispondenza del fronte di salita b del clock, restando così pronti ad accettare, da quel fronte di salita in poi, un nuovo segnale di strobe da parte del calcolatore.

Abbiamo stabilito che il passaggio da 0 ad 1 dei segnali Z1, Z2 e Z3 è subordinato al segnale di strobe del calcolatore ed al segnale di clock. Per riportare questi tre segnali a 0, dobbiamo evidentemente ricorrere ad un contatore che tenga conto di quanti bit sono stati trasmessi. Supponiamo allora che il contatore (che per i nostri scopi deve essere a 4 bit) venga resettato dal segnale S/L; se il clock del contatore è lo stesso di quello applicato allo shift register, allora il contatore passerà dal conteggio 0 al conteggio 1 in corrispondenza del fronte di salita c del clock (Fig. 8). È facile allora vedere che in corrispondenza del fronte di salita b del clock il contatore passerà dal conteggio 9 al conteggio 10.

Potremo dunque utilizzare il conteggio 10 del contatore per mandare a zero i segnali Z1, Z2 e Z3. La decodifica del conteggio 10 non può tuttavia essere collegata al segnale di reset dei flip-flop che generano Z1, Z2 e Z3, poiché questi segnali resterebbero forzati in reset per tutto il periodo di clock che va dal fronte di salita b al successivo, rischiando così di ignorare un eventuale segnale di strobe che il calcolatore, trovando il segnale di BUSY inattivo, potrebbe inviare in quell'intervallo. È necessario allora usare un circuito che, non appena il contatore raggiunge il conteggio 10, generi un impulso che abbia la durata strettamente necessaria a resettare i tre flip-flop.

Se indichiamo con Y la codifica del conteggio 10, ossia un segnale che vale sempre 0 e passa ad 1 non appena il contatore raggiunge il numero 10 (facilmente realizzabile con un AND e due invertitori), allora il circuito che genera i segnali Z1, Z2 e Z3, e che ne permette il reset, è riportato in Fig. 9.

Fig. 9

Circuito per la generazione e il reset dei segnali Z1, Z2 e Z3.

Qui l'uscita X diventa pari ad 1 non appena il segnale Y passa da 0 ad 1, ossia non appena il contatore raggiunge il conteggio 10. I tre flip-flop che generano i segnali Z1, Z2 e Z3 si resettano, e non appena Z1 torna a 0, il flip-flop che genera l'uscita X si resetta immediatamente, lasciando così i tre flip-flop liberi di ritornare ad 1 all'arrivo del prossimo impulso di strobe.

Una volta resettati questi tre segnali, dobbiamo ancora impedire al contatore di avanzare ulteriormente, per evitare che possa ritornare a zero e iniziare un nuovo ciclo di conteggio: possiamo anzi tener fermo il contatore al conteggio 10, visto che i tre flip-flop vengono resettati al passaggio dal conteggio 9 al conteggio 10. Questa funzione si realizza facilmente collegando la codifica del conteggio 10 all'ingresso di abilitazione del contatore: in tal modo il contatore rimarrà fermo fino a che un nuovo segnale di reset (che ha precedenza sull'ingresso di abilitazione) non provvede a mandare il conteggio di nuovo a 0, e quindi a riabilitare il contatore. In conclusione, dunque, il trasmettitore seriale avrà lo schema illustrato in Fig. 10.

Fig. 10

Schema completo del trasmettitore seriale asincrono.

 

minilogo.gif (2094 bytes)

Ricetrasmissione seriale asincrona

left.gif (1019 bytes) up.gif (1014 bytes) right.gif (1020 bytes)

© 1997-2003 Paolo Marincola (Rome, Italy)
e-mail:
pmaNOSPAM@acm.org (eliminare i caratteri "NOSPAM" per ottenere l'indirizzo esatto)
Commenti, osservazioni e suggerimenti sono estremamente graditi.

Last revised: 2003-10-28 00:33