| |
Introduzione alla tecnica DSP
L'elaborazione e la riconversione D/A
di Diego Armari, IW4DN
Proseguiamo questa breve serie di appuntamenti
dedicati all’elaborazione digitale dei segnali, iniziata
con l’uscita numero 8/95 di RadioRivista e proseguita con
un secondo articolo dedicato alla conversione A/D, dando
uno sguardo al vero e proprio cuore dell’intero sistema:
il processore. Fino ad ora abbiamo infatti parlato della
possibilità di trattare matematicamente un segnale,
senza trascurare di mettere in rilievo le tecniche che
consentono di convertirlo da analogico a digitale; ora
vedremo con quali strumenti siano possibili le
elaborazioni suddette e, per concludere la sezione
dedicata "all’hardware ", daremo un cenno anche alla
problematica della riconversione da digitale in
analogico, indispensabile per ripresentare all’uscita
della catena di elaborazione un segnale utilizzabile nei
modi consueti.
La prima domanda che sorge è la seguente: poiché si è
già accennato al fatto che le operazioni da compiere
sulle sequenze di bit sono per la maggior parte
costituite da moltiplicazioni, somme o rotazioni, è
necessario ricorrere ad hardware specifico oppure può
bastare un normale microprocessore coadiuvato dalla
solita schiera di chips periferici? La risposta è
semplice: ricorriamo a ciò che costa meno.... In linea di
principio, nulla vieta di adoperare un normale
microprocessore per l’applicazione degli algoritmi di
calcolo DSP, gli unici requisiti da soddisfare sono la
velocità di esecuzione, che deve essere tale da garantire
di trattare i campioni in ingresso "in tempo reale", e la
precisione, che nella fattispecie si può misurare con la
lunghezza delle parole binarie capaci di essere elaborate
dal processore. In un prossimo articolo vedremo meglio
quali siano le operazioni matematiche principali che si
debbono compiere durante l’elaborazione dei segnali; per
ora accennerò al fatto che per la maggior parte di esse
(convoluzione, trasformata di Fourier, filtraggio) lo
svolgimento veloce di moltiplicazioni è essenziale e che
la precisione oggi ritenuta sufficiente è quella
ottenibile con parole binarie lunghe 16 o 32 bit.
Sembrerebbe quindi che, in applicazioni un pochino
spinte, un processore Pentium o similare sia adeguato...
ma purtroppo è anche esageratamente costoso, in virtù
della sua natura di processore "general-purpose" (cioè
passibile di impiego pressoché universale). Ecco spiegato
il motivo della proliferazione di processori progettati
espressamente per il DSP con l’intento di ottimizzare le
prestazioni per le operazioni indispensabili (leggi le
moltiplicazioni) e al contempo presentare un costo
unitario più contenuto dei processori general-purpose.
Nello spirito di questa serie di articoli, entriamo
allora nel dettaglio ed analizziamo le caratteristiche di
una famiglia di processori DSP sul mercato fin dal 1983
ed oggi largamente impiegata dai progettisti: si tratta
dei processori TMS320xxx prodotti dalla Texas
Instruments.
Tutti gli integrati di questa famiglia sono
realizzati in tecnologia CMOS, e permettono frequenze di
clock fino a 35 Mhz con un parallelismo interno di 16 bit
(che salgono a 32 per l’Aritmetic Logic Unit ed alcuni
registri coinvolti nella moltiplicazione). A bordo dei
processori sono previsti fino a 4K di ROM o EPROM per la
memorizzazione del software di controllo ed elaborazione
(che può essere protetta dagli accessi in lettura per
tutelare il copyright del software memorizzato), e fino a
256 words (1 word = 16 bit) di RAM per la memorizzazione
dei dati. E’ inoltre possibile gestire interruzioni (a
questo scopo è presente uno stack hardware) e indirizzare
delle porte di I/O per dialogare con il mondo esterno, ed
alcuni membri della famiglia hanno già disponibili anche
porte seriali e timer (anche per il watchdog) in modo
tale da assomigliare in tutto e per tutto a dei completi
microcontroller. Per ultimo, va detto che il TMS320C17
include anche tutto l’hardware necessario alla
compressione/decompressione dei dati secondo algoritmi
standard.
La cosa più interessante è tuttavia l’architettura
interna, che non ricalca la solita struttura della
maggior parte dei microcontrollori utilizzati, bensì
prevede due memorie (e due bus) separate per codice di
programma e dati (la cosiddetta architettura "Harvard",
utilizzata internamente anche dal Pentium per il dialogo
con le sue cache...); questa scelta, unitamente
all’adozione di un moltiplicatore hardware, ha reso
possibile effettuare una moltiplicazione tra due dati a
16 bit (con risultato a 32 bit) in un solo ciclo di bus
(è cioè stato possibile sovrapporre le fasi di
caricamento della nuova istruzione e di elaborazione dei
dati correnti), che nel caso del TMS320C16 risulta essere
di soli 114 nanosecondi. Tutto questo, unitamente ad un
set di istruzioni pensato specificamente per algoritmi di
DSP, permette a tali circuiti integrati di eseguire fino
a 8,77 milioni di istruzioni per secondo.
La figura 1 mostra uno schema a blocchi interno di
uno dei più semplici rappresentanti della famiglia: il
TMS320C15; la commenteremo brevemente senza la pretesa di
esaurire l’argomento microprocessori, argomento che se
dovesse risultare di interesse per diversi lettori potrà
essere trattato in una diversa serie di articoli.
Iniziamo dunque dal blocco in alto a sinistra
denominato "unità di controllo"; come facilmente
intuibile, ad esso sono demandate le funzionalità di
coordinamento delle operazioni svolte da tutti gli altri
blocchi interni, naturalmente al ritmo di un opportuno
segnale di clock e sotto lo stimolo di segnali esterni
(quali le interruzioni ed i vari segnali di
abilitazione). Spicca inoltre la ROM (che in alcune
versioni è scrivibile una sola volta, mentre in altre è
una normale EPROM) di programma, indirizzata da un
registro a 12 bit con funzionalità di puntatore
all’istruzione da svolgere (detto Program Counter, o PC)
e collegata all’unità di controllo (che comanda tutti gli
altri blocchi a seconda del significato dell’istruzione
letta) nonché al mondo esterno tramite il Program Bus,
che, faccio notare, non è un bus ove circolano indirizzi
di celle di memoria, bensì direttamente il contenuto
della ROM di programma, e dunque le istruzioni. A fianco
della ROM troviamo lo stack hardware, indispensabile per
la memorizzazione degli indirizzi di ritorno dai
sottoprogrammi e dalle routine di servizio delle
interruzioni. Il Data Bus collega tra di loro invece
tutti i dispositivi dedicati all’elaborazione dei dati.
Si notano subito, nella parte in basso, la ALU (Aritmetic
Logic Unit) per l’esecuzione delle operazioni aritmetiche
e logiche sui dati, il moltiplicatore hardware capace di
moltiplicare in un solo ciclo macchina due dati a 16 bit,
e ben due shifter in grado di effettuare rotazioni ed
estrazioni di bit dai dati stessi. Per la memorizzazione
dei dati e dei risultati sono disponibili diversi
registri a 16 bit (AR0, AR1, T) ed a 32 bit (P,
l’accumulatore ACC), nonché 256 celle a 16 bit di RAM. Si
osservi la separazione tra i due bus e la presenza di due
aree di memoria distinte: in ciò consiste l’architettura
Harvard, ma va detto che per comodità esiste una via di
comunicazione tra di essi: questo per permettere ai
coefficienti da utilizzare nei calcoli (e che quindi
andranno caricati nei registri della sezione in basso) di
poter risiedere normalmente nella ROM di programma,
anziché venire introdotti dall’esterno (magari da una
EPROM separata) con dispendio di risorse. Infine, il bus
dei dati (D0/D15) ed un bus degli indirizzi (A0/A11)
vengono portati all’esterno per poter interfacciare il
processore DSP con dispositivi periferici, quali i
convertitori A/D e D/A, porte di IN/OUT, memoria
aggiuntiva per il programma di controllo (solo in alcuni
modelli) oppure addirittura con un altro microprocessore
o microcontroller. Per lo schema a blocchi sono
disseminati diversi multiplexer, il cui scopo è fungere
da deviatori per permettere la circolazione di dati ed
indirizzi per differenti percorsi, sotto il comando della
particolare istruzione in esecuzione.
Analizzato in breve il cuore del sistema DSP, e visto
che è in grado di eseguire tutte le elaborazioni
necessarie sui dati analogici precedentemente campionati
e convertiti in digitale, resta da studiare il problema
della riconversione in analogico dei risultati di tale
processo. Il dispositivo capace di compiere questa
trasformazione inversa è (guarda un po’) il convertitore
digitale-analogico (D/A).
La figura 2 illustra lo schema di principio di un
convertitore Digitale/Analogico ad 8 bit; chiaramente
discuteremo lo schema a titolo esemplificativo, dato che
abbiamo appena visto che la maggior parte dei chip DSP
lavora su dati a 16 bit e richiede dunque convertitori
(sia A/D che D/A) a 16 bit. Quella raffigurata è una
particolare realizzazione (oggi diffusissima) denominata
"a rete R-2R" per la particolarità di richiedere
solamente resistori di due valori (di cui uno è il doppio
dell’altro, e poco importa quale sia il valore
effettivo). Iniziamone la discussione dal blocco
denominato Latch di ingresso, la cui funzione è quella di
rendere facilmente interfacciabile con un microprocessore
l’intero convertitore: esso infatti serve a campionare il
byte da convertire, normalmente emesso dal
microprocessore stesso sul suo bus dei dati per un breve
periodo, in modo tale da mantenerlo stabilmente
memorizzato per l’utilizzo nel processo vero e proprio di
trasformazione in tensione analogica. I bit del byte di
ingresso comandano poi una batteria di deviatori
elettronici (realizzati con dei transistori MOS) il cui
scopo è collegare alla rete di resistori una sorgente di
corrente costante qualora il bit in questione sia ad 1
logico, oppure dirottare tale corrente verso massa se il
bit ha valore logico 0. La rete R-2R fa sì che la
corrente iniettata si ripartisca in modo tale da giungere
sull’ingresso dell’amplificatore operazionale
(sull’estrema destra dello schema) con una intensità
inversamente proporzionale al "peso" del bit
corrispondente. Tale corrente viene poi convertita in una
tensione ad essa proporzionale proprio dall’operazionale,
ed in questo modo l’espressione della tensione di uscita
Vout diviene:
Vout =
K*(27*D7+26*D6+25*D5+24*D4+23*D3+22*D2+2*D1+D0)
dove la costante K dipende dai valori dei componenti
inseriti nel circuito (R, I e le resistenze presenti
nella rete di retroazione dell’operazionale) e D0-D7
possono valere 1 o 0 e rappresentano come detto i bit del
dato da convertire. Tale formula (ricavabile
semplicemente applicando il principio di sovrapposizione
degli effetti e le semplificazioni serie/parallelo del
caso alla rete R-2R che è senza dubbio lineare) mostra
come la tensione in uscita sia proporzionale al
significato numerico della configurazione binaria in
ingresso.
Nello schema elettrico, si osserva come sia possibile
chiudere la catena di retroazione servendosi di
differenti percorsi; ad esempio collegando a Vout il
piedino indicato con SENSE oppure il piedino indicato con
SELECT, oppure ancora cortocircuitando i due pin SENSE e
SELECT e collegando il nodo comune a Vout; in questo modo
si realizzano differenti valori di K e conseguentemente
il valore della tensione di uscita modifica il proprio
range di variabilità. Tanto per esemplificare, faremo
riferimento al circuito integrato DAC 0890 della
National, il cui schema di principio è esattamente
identico a quello di figura 2; ebbene, in tale
convertitore la tensione di uscita può essere scelta nel
range 0-2,55 V oppure 0-10,2 V proprio agendo sulle
connessioni tra SENSE, SELECT e Vout, tutti piedini
regolarmente presenti nel chip. Nel caso si sia
selezionata la gamma 0-2,55 V le cose funzioneranno così:
ad un valore di ingresso pari a 0 (tutti i bit D0-D7 a
zero logico) corrisponderà una tensione Vout nulla, ad un
valore di ingresso pari a 255 (tutti i bit D0-D7 ad uno
logico) corrisponderà una tensione di uscita di 2,55 Volt
mentre per tutti i valori intermedi otterremo una Vout
proporzionale (es: 125 == 1,25V).
Lo schema a blocchi completo del convertitore DAC
0890 è mostrato in figura 3, ove si nota subito la
presenza di due sezioni identiche; il chip incorpora
infatti due convertitori completi e tutta la logica di
selezione necessaria all’interfacciamento con un
microprocessore (o un chip DSP...); quest’ultimo "vede"
il doppio convertitore come due celle di memoria oppure
due porte I/O a sola scrittura, dotate ciascuna di un
segnale di selezione (CS1* e CS2*) e comandate in
scrittura dal classico segnale di Write (WR*). In verità
il DAC 0890 è ancora più flessibile: è possibile infatti
comandarlo con un solo segnale (il Csx*) ed inoltre il
piedino SENSE può essere utilizzato per compensare le
cadute di tensione che si verificano quando la tensione
di uscita viene portata ad un utilizzatore lontano.
Due parole infine sulla velocità di un convertitore
D/A; si è infatti più volte ribadito che, affinché i
processi di conversione A/D e D/A diano luogo alla
ricostruzione del segnale corretto, è necessario non
scendere al di sotto di una ben precisa frequenza di
conversione. Il comando dei deviatori elettronici
richiede tempo, ed è perciò la principale limitazione
alla velocità di funzionamento del sistema; non solo, va
anche detto che la commutazione non avviene con lo stesso
tempo in tutti i deviatori, con il risultato di passare
attraverso configurazioni binarie "spurie" che vengono
ugualmente convertite dando luogo a rumore sull’uscita (i
cosiddetti "glitch"). Tutto ciò si traduce in un "tempo
di assestamento" dell’uscita, durante il quale occorre
attendere che la tensione assuma il nuovo valore di
regime, e quindi in una velocità massima di funzionamento
che nel caso del DAC 0890 arriva a circa 300 Khz, valore
più che buono nel caso di impiego nel trattamento di
segnali in banda fonica.
Anche questa volta vi segnalo alcune risorse Internet
dedicate all’argomento; anzitutto è d'obbligo consultare
il newsgroup comp.dsp, poi se quello che cercate è il
software, allora può essere interessante sfogliare il
sito all'indirizzo
ftp://ftp.ti.com/mirrors/tms320bbs ;
è il sito FTP della Texas Instruments dedicato al
software ed alla documentazione sui chip della famiglia
TMS320Cxx; vi si può trovare dal data-sheet ad alcune
applicazioni di esempio. All'URL
ftp://ece.rutgers.edu/pub/sjo/intro2dsp.html si può
consultare la presentazione di un buon libro (ottimo per
introdurre ai concetti base) sulle tecniche DSP; vi si
trovano inoltre numerosi links a sorgenti di funzioni per
il DSP scritte in C e come m-files per Matlab. Segnalo
infine una completa lista di FAQ:
http://www.bdti.com/faq/dsp_faq.htm ed una nutrita lista
di altre risorse:
http://204.97.220.29/dsp.htm.
Relativamente alla reperibilità dell’autore, ricordo
l’indirizzo packet: IW4DN@IK4OMO nonché l’indirizzo
Internet e-mail: d.armari@acdx2.dsnet.it
ed infine
segnalo la variazione dell’indirizzo delle pagine Web ove
trovare gli articoli di questa serie unitamente ad altre
informazioni utili; il nuovo URL è il seguente:
http://www.geocities.com/SiliconValley/2551/ con la
raccomandazione di avere pazienza, dato che il server
(che si trova negli USA) è molto affollato.
Copyright 1996 by Diego Armari - IW4DN
Il presente articolo può essere pubblicato o diffuso
in qualunque forma purché non a fini di lucro e
sempre citando l'autore nonchè
previa autorizzazione scritta dell’autore.
|