Implementarea Algoritmilor Adaptivi Rls Si Lms cu Procesorul de Semnal Adsp 21160

1. PROCESORUL ADSP-21160

ADSP-21160 este un procesor digital de semnal de inalta performanta, pe 32 de biti, folosit in aparate medicale, in comunicatii, in aplicatii militare, in aplicatii audio si de recunoastere a vocii, in echipamente de testare, in grafica 3D si in multe alte aplicatii. Acest procesor este construit pe nucleul ADSP-21000 si formeaza un sistem complet integrat pe un singur chip, avand in plus o memorie SRAM, porturi de intrare-iesire integrate si elemente suplimentare pentru procesarea SIMD (Single-Instruction-Multiple-Data).

Deoarece matematica in virgula mobila a procesoarelor digitale de semnal reduce nevoia de a scala si probabilitatea de aparitie a depasirilor, utilizarea unui procesor in virgula mobila poate usura algoritmul si implementarea software a acestuia. Limbajul de programare de nivel inalt si spatiile mari pentru adrese permit ca timpul alocat dezvoltarii sistemului sa fie folosit in vederea elaborarii algoritmilor si a procesarii semnalelor, lucru care reprezinta un avantaj considerabil daca se tine seama ca se elimina timpul alocat codarii in limbaj de asamblare sau tratarii erorilor. ADSP-21160 este un procesor ce face parte din familia de procesoare de semnal cu arhitectura SHARC (Super Harvard Arhitecture) si care dispune de toate aceste avantaje mentionate mai sus. Arhitectura SHARC imbina performantele inalte ale nucleului procesorului cu magistralele dedicate pentru program, date si intrari/iesiri (PM, DM, IO). In nucleu fiecare instructiune este executata intr-un singur ciclu. Magistralele si memoria cache pentru instructiuni ofera nucleului un flux de date rapid necesar pentru a mentine rata de executie ridicata.

In figura 1.1 este prezentata detaliat schema bloc a procesorului, fiind ilustrate urmatoarele caracteristici arhitecturale:

Doua elemente de procesare (PEx si PEy), fiecare continand unitati de calcul pe 32 de biti standardizate IEEE – multiplicator, ALU, registru de deplasare si setul de registre;

Secventor de program cu memorie cache pentru instructiuni, timer de interval, doua generatoare de adrese de date (DAG1 si DAG2);

Un bloc de memorie SRAM cu doua porturi;

Port extern de interfata cu memoria externa, periferice, sisteme gazda sau sisteme multiprocesor;

Procesor de Intrare/Iesire (IO) cu controler DMA integrat, porturi seriale si porturi de legatura punct la punct pentru comunicatii multiprocesor;

JTAG port test de acces pentru emulari.

Figura 1.1 prezinta de asemenea si cele trei magistrale incluse in procesorul ADSP-21160: PM (Program Memory) magistrala de program, DM (Data Memory) magistrala de date si IO (Input/Output) magistrala pentru intrari/iesiri. PM ofera acces atat la date cat si la instructiuni. In timpul unui singur ciclu, aceste magistrale lasa procesorul sa acceseze doi operanzi (unul de la PM si altul de la DM), o instructiune (din cache) si sa efectueze un transfer DMA. Aceste magistrale se conecteaza la portul extern al procesorului care are rol de interfata cu memoria externa, cu un alt procesor gazda sau cu siteme multiprocesor de prcesoare ADSP-21160. Portul extern arbitreaza magistralele si furnizeaza semnale de control memoriei partajate globale si dispozitivelor I/O.

Figura 1.1 Schema bloc a procesorului de semnal ADSP-21160

Procesorul ADSP-21160 indeplineste cele cinci cerinte de baza ale procesoarelor digitale de semnal (DSP):

Unitati aritmetice de calcul rapide si flexibile;

Flux de date nerestrictionat de la si inspre unitatile de calcul;

Precizie extinsa in unitatile de calcul;

Doua generatoare de adrese cu suport de memorare circular;

Secventiere de program eficienta.

Aritmetica rapida si flexibila. Familia de procesoare ADSP-21000 executa toate instructiunile intr-un singur ciclu. Ele ofera atat timpi mici pentru un ciclu cat si un set complet de operatii aritmetice. Procesorul digital de semnal este IEEE compatibil in virgula mobila si permite intreruperi pentru exceptiile aritmetice.

Flux de date nerestrictionat. Procesorul ADSP-21160 are o arhitectura SHARC combinata cu un set mare de registre de date. In fiecare ciclu procesorul de semnal poate citi sau scrie doi operanzi de la sau inspre setul de registre, poate furniza doi operanzi unitatii ALU, poate furniza doi operanzi multiplicatorului si poate receptiona trei rezultate de la ALU si multiplicator. Cuvintele de instructiuni de 48 de biti ale procesorului suporta transferuri de date paralele si operatii aritmetice in aceeasi instructiune.

Precizie extinsa la 40 de biti. Procesorul utilizeaza formate standard IEEE pe 32 de biti, formate intregi si fractionale pe 32 de biti (in complement fata de 2) dar si formate in virgula mobila cu precizie extinsa pe 40 de biti. Procesorul beneficiaza de aceasta precizie extinsa la nivelul unitatilor de calcul, limitind erorile de trunchiere intermediare.

Doua generatoare de adrese. Procesorul dispune de doua generatoare de adrese de date pentru adresarea indirecta. Operatiile de modul, inversie de bit si de difuziune sunt suportate fara nici un fel de restrictii in ceea ce priveste plasarea memoriei tampon de date (buffer).

Secventiere de program eficienta. Procesorul suporta initierea si iesirea din bucla intr-un singur ciclu. Buclele pot fi atat de tipul bucla-in-bucla (cu 6 nivele posibile hardware) cat si intreruptibile.

1.1 Elementele de procesare

Nucleul procesorului contine doua elemente de procesare (PEx si PEy). Fiecare element este compus dintr-un set de registre de date si trei unitati independente de calcul: o unitate ALU, un multiplicator si o unitate de deplasare. Pentru a acoperi o gama cat mai larga de necesitati de procesare, cele trei unitati de calcul proceseaza datele in trei formate posibile: pe 32 de biti in virgula fixa, pe 32 de biti in virgula mobila si pe 40 de biti in virgula mobila. Daca formatul pe 32 de biti in virgula fixa este formatul standard IEEE, cel pe 40 de biti cu precizie extinsa dispune de opt biti aditionali, cei mai putini importanti, Least Significant Bits (LSB), pentru o acuratete cat mai mare.

Elementul de procesare primar PEx proceseaza toate instructiunile de calcul chiar daca procesorul lucreaza in mod SISD (single-instruction single-data – o intructiune – o data) sau in mod SIMD (single-istruction multiple-data – o instructiune – mai multe date). Acest element se regaseste si in procesoarele mai vechi din familia din care face parte si ADSP-21160.

Elementul de procesare secundar PEy proceseaza instructiunile in acelasi ritm cu PEx, dar face lucrul acesta doar daca procesorul lucreaza in modul SIMD.

Unitatile de calcul din cele doua elemente se ocupa fiecare cu diferite tipuri de operatii. Unitatea ALU realizeaza operatii aritmetice si logice in virgula fixa sau mobila. Multiplicatorul realizeaza inmultiri in virgula mobila sau fixa si executa in virgula fixa operatii de inmultire/adunare si inmultire/scadere. Unitatea de deplasare realizeaza deplasari logice si aritmetice, stocari de date in campuri de date si operatii de extragere a acestora pe operanzi pe 32 de biti. Caile fluxurilor de date dintre unitatile de calcul sunt dispuse in paralel si sunt prezentate in figura 1.2:

Figura 1.2 Unitatile de calcul din elementul de procesare

1.1.1 Unitatea Aritmetica Logica – ALU

Instructiunile ALU in virgula fixa utilizeaza operanzi pe 32 de biti, iar rezultatele de iesire sunt tot pe 32 de biti. Instructiunile ALU in virgula mobila utilizeaza operanzi pe 32 de biti sau pe 40 de biti, iar rezultatele de iesire sunt tot pe 32 de biti si respectiv 40 de biti . Acestea includ:

adunari, scaderi, medieri in virgula mobila;

adunari, scaderi, medieri in virgula fixa;

in virgula fixa: adunari cu depasire, scaderi cu imprumut, incrementari, decrementari;

operatii logice: si, sau, si exclusiv, sau exclusiv;

functii: valoare absoluta, minim, maxim, comparare;

conversie de format;

radacina patratica;

Instructiunile ALU au una sau doua intrari: X si Y. Aceste intrari (cunoscute si sub numele de operanzi) pot fi in oricare registru de date din setul de registre. Majoritatea operatiilor ALU intorc un singur rezultat; operatiile adunare/scadere intorc insa doua rezultate pe cand operatia de comparare nu intoarce nici un rezultat, fiind modificate numai unele fanioane (flags). Rezultatele provenite de la ALU pot fi stocate in oricare locatie din setul de registre.

Procesorul transfera operanzii de intrare din setul de registre in prima jumatate a unui ciclu iar rezultatele in cea de-a doua jumatate a ciclului. In acest fel, unitatea ALU poate citi si scrie aceeasi locatie a registrului intr-un singur ciclu. Daca operatia este in virgula fixa, intrarile sunt tratate ca operanzi pe 32 de biti in virgula fixa. Rezultatele in acest caz vor fi mereu valori in virgula fixa pe 32 de biti.

Operatiile ALU modifica sapte fanioane de stare in registrele specializate ASTATx si ASTATy si patru fanioane in registrele STKYx si STKYy, prin care se determina starile exceptionale (de depasire, rezultat negativ, tipul ultimei operatii etc.).

1.1.2 Multiplicatorul

Multiplicatorul realizeaza inmultiri in virgula fixa si mobila si operatii de inmultire/adunare in virgula mobila. Inmultirile/adunari in virgula mobila sunt disponibile atat cu adunari cu depasire cat si cu scaderi cu imprumut. Instructiunile multiplicatorului functioneaza cu operanzi pe 32 de biti sau 40 de biti in virgula mobila iar rezultatele sunt de asemenea tot pe 32 de biti sau 40 de biti. Operatiile in virgula fixa in schimb, folosesc operanzi pe 32 de biti si genereaza rezultate pe 80 de biti. Intrarile sunt tratate ca fractii sau intregi, fara semn sau in complement fata de doi. Instructiunile multiplicatorului includ:

inmultiri in virgula mobila;

inmultiri in virgula fixa;

instructiuni pentru rotunjirea rezultatului;

instructiuni de stocare a rezultatului;

instructiuni de stergere a rezulatului.

Multiplicatorul dispune de doua intrari: X si Y. Aceste intrari pot fi orice inregistrari de date din setul de registre. Multiplicatorul poate acumula rezulatele in virgula fixa in registrele locale specializate pentru rezultate ale multiplicatorului (MRF) sau le poate scrie inapoi in setul de registre. Rezulatele din MRF pot fi de asemenea rotunjite prin operatii separate. Inmultirile in virgula mobila produc rezultate in virgula mobila, pe care multiplicatorul le scrie mereu direct in setul de registre.

Multiplicatorul transfera operanzii de intrare in prima parte a unui ciclu si rezulatele in cea de a doua parte. Astfel multiplicatorul poate citi si scrie in setul de registre la aceeasi locatie intr-un singur ciclu. Pentru inmultirile in virgula fixa, multiplicatorul citeste intrarile din primii 32 de biti ai registrelor de date. Operanzii in virgula fixa pot fi ori amandoi in format fractional ori amandoi in format intreg. Formatul rezultatului este identic cu cel al intrarilor. Operatiile in virgula fixa plaseaza rezulatul pe 80 de biti ori in registrul multiplicatorului MRF ori MRB depinzand de care dintre ele este activ. Plasarea unui rezultat intr-un camp de 80 de bit al MRF depinde de formatul rezulatului: fractional sau intreg. Daca rezultatul este scris direct in registrul de date atunci el va fi tot pe 32 de biti, indentic cu datele de intrare, folosind bitii 63-32 pentru un rezultat fractional si bitii 31-0 pentru un rezultat intreg. Cei opt biti LSB din formatul de 40 de biti sunt completati cu zerouri. Rezultatele fractionale pot fi rotunjite catre cel mai apropiat intreg inainte de a fi trimise in setul de registre. Daca rotunjirea nu este specificata atunci eliminand bitii 31-0 se truncheaza efectiv rezultatul fractional (rotunjire la zero).

Multiplicatorul modifica patru fanioane in registrele ASTATx si ASTATy si patru fanioane in registrele STKYx si STKYy pentru a indica ultima opreratie a multiplicatorului: rezultat negativ, depasire in sus sau in jos, operatie in virgula mobila invalida. Fanioanele se modifica la sfarsiiti. Operatiile in virgula fixa in schimb, folosesc operanzi pe 32 de biti si genereaza rezultate pe 80 de biti. Intrarile sunt tratate ca fractii sau intregi, fara semn sau in complement fata de doi. Instructiunile multiplicatorului includ:

inmultiri in virgula mobila;

inmultiri in virgula fixa;

instructiuni pentru rotunjirea rezultatului;

instructiuni de stocare a rezultatului;

instructiuni de stergere a rezulatului.

Multiplicatorul dispune de doua intrari: X si Y. Aceste intrari pot fi orice inregistrari de date din setul de registre. Multiplicatorul poate acumula rezulatele in virgula fixa in registrele locale specializate pentru rezultate ale multiplicatorului (MRF) sau le poate scrie inapoi in setul de registre. Rezulatele din MRF pot fi de asemenea rotunjite prin operatii separate. Inmultirile in virgula mobila produc rezultate in virgula mobila, pe care multiplicatorul le scrie mereu direct in setul de registre.

Multiplicatorul transfera operanzii de intrare in prima parte a unui ciclu si rezulatele in cea de a doua parte. Astfel multiplicatorul poate citi si scrie in setul de registre la aceeasi locatie intr-un singur ciclu. Pentru inmultirile in virgula fixa, multiplicatorul citeste intrarile din primii 32 de biti ai registrelor de date. Operanzii in virgula fixa pot fi ori amandoi in format fractional ori amandoi in format intreg. Formatul rezultatului este identic cu cel al intrarilor. Operatiile in virgula fixa plaseaza rezulatul pe 80 de biti ori in registrul multiplicatorului MRF ori MRB depinzand de care dintre ele este activ. Plasarea unui rezultat intr-un camp de 80 de bit al MRF depinde de formatul rezulatului: fractional sau intreg. Daca rezultatul este scris direct in registrul de date atunci el va fi tot pe 32 de biti, indentic cu datele de intrare, folosind bitii 63-32 pentru un rezultat fractional si bitii 31-0 pentru un rezultat intreg. Cei opt biti LSB din formatul de 40 de biti sunt completati cu zerouri. Rezultatele fractionale pot fi rotunjite catre cel mai apropiat intreg inainte de a fi trimise in setul de registre. Daca rotunjirea nu este specificata atunci eliminand bitii 31-0 se truncheaza efectiv rezultatul fractional (rotunjire la zero).

Multiplicatorul modifica patru fanioane in registrele ASTATx si ASTATy si patru fanioane in registrele STKYx si STKYy pentru a indica ultima opreratie a multiplicatorului: rezultat negativ, depasire in sus sau in jos, operatie in virgula mobila invalida. Fanioanele se modifica la sfarsitul fiecarui ciclu, moment in care se genereaza starea multiplicatorului, devenind astfel disponibila pentru urmatorul ciclu.

1.1.3 Unitatea de deplasare

Unitatea de deplasare realizeaza operatii la nivel de bit cu operanzi in virgula fixa. Operatiile de deplasare includ:

deplasari si rotatii de la stanga la dreapta;

operatii la nivel de bit incluzand setari de biti, resetari de biti, inversarea ordinii bitilor;

operatii cu campuri de biti incluzand extractii si depozitari;

operatii de conversie din virgula fixa in virgula mobila, numarator de 1 si de 0;

Unitatea de deplasare dispune de una pana la trei intrari: X, Y si Z. Acestea pot fi orice inregistrare din setul de registre. In cadrul unei instructiuni a unitatii de depalsare, intrarile au urmatoarele roluri:

intrarea X ofera datele cu care se lucreaza;

intrarea Y specifica dimensiunea deplasarii, lungimea campurilor de biti sau pozitia bitilor;

intrarea Z specifica datele cu care se lucreaza si care din ele vor fi modificate.

Dupa cum se observa si in figura 1.3, unitatea de deplasare isi culege operanzii de intrare din cei 32 de biti aflati in partea superioara (bitii 39-8).

Figura 1.3 Intrare Y pe 32 de biti

Unitatea de deplasare tranfera operanzii in prima jumatate a unui ciclu si rezultatele in cea de a doua jumatate in partea de 32 de biti superioara a unui registru pe 40 de biti (cei opt LSB fiind zero). Astfel si unitatea de deplasare poate scrie si citi aceeasi locatie din setul de registre in acelasi ciclu.

Intrarile X si Z au mereu valori in virgula fixa pe 32 de biti. Intrarea Y poate fi tot o valoare pe 32 de biti in virgula fixa, dar poate fi si un camp de 8 biti (shf8) plasat in interiorul setului de registre ca in figura 1.4.

Figura 1.4 Intrare Y sau rezultat pe 8 biti

Unele operatii de deplasare produc rezultate pe 8 biti sau 6 biti. Unitatea de deplasare plaseaza rezultatul ori in campul shf8 ori in campul bit6 prezentat in figura 1.5, dar in orice caz rezultatul final este oferit pe 32 de biti. Unitatea de deplasare suporta instructiuni pentru depozitari si extractii de biti din campuri de biti care au ca scop manevrarea grupurilor de biti continute de intrari. Intrarea Y, pentru instructiunile care lucreaza cu campuri de biti, specifica doua valori de 6 biti: len6 si bit6 care sunt pozitionate intr-un registru Rx (din setul de registre) ca in figura 1.5:

Figura 1.5 Intrare Y pe 12 biti

Unitatea de deplasare interpreteaza campurile bit6 si len6 ca pe niste intregi pozitivi. Bit6 este pozitia de inceput pentru depozitari si extrageri, iar len6 este lungimea campului de biti care specifica cati biti sunt extrasi sau depozitati.

Instructiunile pentru depozitele in camp iau un grup de biti din inregistrarea de intrare (incepand cu LSB al campului intreg de 32 de biti), si depoziteaza bitii acolo unde este specificat in interiorul campului alocat pentru rezultate. Campul bit6 precizeaza pozitia de inceput de bit pentru realizarea depozitarii. Figura 1.6 este un exemplu de depozitare de biti pentru instructiunea: R0 = FDEP R1 BY R2;

Figura 1.6 Exemplu de depozitare a unui camp de biti

Instructiunile de extragere din camp extrag un grup de biti specificat din campul datelor de intrare si il plaseaza in registrul de rezultat (aliniat cu LSB al campului intreg de 32 de biti). Valoarea bit6 arata pozitia primului bit care va fi extras. Un exemplu pentru instructiunea R3 = FEXT R4 BY R5 este prezentat in figura 1.7:

Figura 1.7 Exemplu de extractie a unui camp de biti

Operatiile de deplasare modifica trei fanioane din registrele ASTATx si ASTATy semnificand ultima stare a unitatii de deplasare:

depasire de biti la stanga celui mai important bit MSB (most significant bit);

rezultatul deplasarii este zero;

semnul de intrare al extragerii exponentului.

Fanioanele se modifica la sfarsitul fiecarui ciclu, moment in care se genereaza starea unitatii de deplasare, devenind astfel disponibila pentru urmatorul ciclu. Daca un program scrie starea explicita a registrului aritmetic in acelasi ciclu in care unitatea de deplasare realizeaza o operatie, scrierea explicita in ASTAT intrerupe orice modificare de fanion datorata operatiilor de deplasare.

1.1.4 Setul de registre

Fiecare element de procesare prezent in arhitectura unui processor digital de semnal dispune de cate un set de registre. Acest set de registre de date ajuta la transferul datelor intre magistrale si unitatile de calcul. Aceste registre ofera de asemenea si spatii pentru depozitarea operanzilor si a rezultatelor.

Fiecare din cele doua seturi de registre constau in 16 registre primare si 16 registre secundare (alternative). Toate registrele de date sunt pe 40 de biti. In interiorul acestora datele sunt mereu aliniate pe primii 32 de biti din stanga. Daca o operatie necesita un transfer de 32 de biti din aceste registre de 40 de biti, atunci cei mai putin importanti opt biti (LSB) sunt ignorati de citirile din registru sau sunt setati la zero de catre scrierile in registru.

Accesul la memoria program sau la memoria de date se face cu ajutorul magistralelor PM si DM. Pentru fiecare element de procesare in parte se poate efectua cate un transfer atat pe magistrala PM cat si pe magistrala DM in cadrul unui singur ciclu. Transferurile intre registre si magistralele PM si DM poate ajunge pana la 64 de biti de date valide pe fiecare dintre ele.

Daca o operatie specifica aceeasi locatie din setul de registre de date atat pentru intrari cat si pentru iesiri, atunci citirea are loc in prima jumatate a unui ciclu iar scrierea in cea de a doua jumatate. Astfel procesorul digital de semnal foloseste datele vechi ca si operanzi inainte de a acutaliza locatia la care se gasesc acestia, cu noua valoare a rezultatului. Daca mai multe scrieri au loc in acelasi ciclu la aceeasi locatie, numai cea cu prioritatea cea mai mare are de fapt loc. Procesorul digital de semnal determina prioritatile operatiilor de scriere in functie de cine este sursa datelor care urmeaza a fi scrise. Astfel, de la cea mai mare la cea mai mica, prioritatile sunt:

Memoria de date;

Memoria program;

ALU din PEx;

ALU din PEy;

Multiplicatorul din PEx;

Multiplicatorul din PEy;

Unitatea de deplasare din PEx;

Unitatea de deplasare din PEy.

Setul de registre din figura 1.2 enumera numele registrelor de la R0 la R15 din elementul de procesare PEx. Cand un program face referire la aceste registre ca si R0 pana la R15, unitatile de calcul trateaza continutul registrelor ca si date in virgula fixa. Pentru a realiza calcule in virgula mobila trebuie ca programele sa se adreseze la aceste registre ca si F0 pana la F15. Spre exemplu urmatoarele instructiuni se refera la aceleasi registre dar impun unitatilor de calcul sa realizeze operatii diferite:

F0 = F1 * F2; inmultire in virgula mobila,

R0 = R1 * R2; inmultire in virgula fixa.

Prefixul F sau prefixul R din numele registrelor nu afecteaza transferurile de date pe 32 sau 40 de biti; conventiile de nume doar specifica ALU, multiplicatorului si unitatii de deplasare cum sa trateze datele. Regulile pentru folosirea numelor registrelor sunt urmatoarele:

R0 pana la R15 si F0 pana la F15 se refera la registrele ce tin de PEx si care folosesc intructiunilor pentru transferul sau calcularea datelor indiferent daca procesorul digital de semnal lucreaza in modul SISD sau SIMD;

R0 pana la R15 si F0 pana la F15 se refera la registrele din PEx cat si la registrele din PEy pentru instructiunile de calcul in modul SIMD;

S0 pina la S15 se refera la registrele din PEy pentru instructiunile de transfer al datelor indiferent de modul de lucru SISD sau SIMD.

1.1.5 Registrele alternative (secundare)

Fiecare set de registre are un set de registre alternative. Pentru a facilita schimbul rapid de context, procesorul digital de semnal include mai multe seturi de registre alternative pentru date, rezultate si pentru registrele generatoarelor de adrese de date (DAG). In timp ce registrele alternative sunt inaccesibile, continutul lor nu este afectat de operatiile pe care le efectueaza procesorul. Este de notat ca exista o intarziere de un ciclu intre scrierea in registrul MODE1 si posibilitatea de a accesa un registru alternativ.

Bitii din registrul MODE1 pot activa seturi de registre alternative independente: jumatatea inferioara (R0-R7 sau S0-S7) si jumatatea superioara (R8-R15 sau S8-S15). Pentru a schimba date intre rutinele sale, un program plaseaza datele ce urmeaza a fi schimbate intr-una din cele doua jumatati ale setului de registre ale elementului de procesare curent si activeaza cealalta jumatate ca si registru alternativ.

Fiecare multiplicator are un registru primar (MRF) si unul alternativ (MRB). Un anume bit din registrul MODE1 selectaza care din cele doua registre este cel in care va fi plasat rezultatul inmultirii desemnand astfel care registru este cel current: MRF sau MRB. Spre deosebire de alte registre care dispun de registre alternative, MRF si MRB pot fi accesati in acelasi timp. Toate inmultirile in virgula fixa isi pot acumula rezultatele atat in MRF cat si in MRB, fara a tine cont de starea registrului MODE1. Astfel programele pot folosi ori registrul primar ori cel alternativ pentru a-si stoca rezultatele, sau pot chiar folosi ambele registre in paralel. Aceasta caracteristica faciliteaza calculele matematice complexe.

Utilizand mai multe cai paralele de date intre unitatile sale functionale, procesorul digital de semnal este capabil sa suporte si calcule multiple, in paralel. Instructiunile care fac acest lucru se realizeaza intr-un singur ciclu si combina operatii paralele de la multiplicator si ALU sau de la doua ALU in acelasi timp. Pentru a lucra cu caile de date disponibile, unitatile de calcul restrang numarul registrelor de date ce pot contine operanzii de intrare pentru calculele multiple.

1.1.6 Elementul de procesare secundar PEy

Procesorul de semnal ADSP-21160 poseda doua elemente de procesare PEx si PEy, care pot lucra in doua moduri diferite: SISD sau SIMD. Modul de lucru este setat in registrul MODE1. Acesta poate sa sisteze complet functionarea elementului de procesare PEy procesorul functionand astfel in modul SISD. Trecerea la modul SIMD se face cu un ciclu intarziere, indiferent daca aceasta trecere se face de la modul SISD la SIMD sau de la SIMD la SISD.

In modul SISD transferurile registru-registru sunt unidirectionale, insemnand ca o operatie executata intr-un element de procesare nu este duplicata in celalat element. Transferurile SISD folosesc un registru sursa si un registru destinatie, iar fiecare dintre acestea pot fi registre apartinand oricarui element de procesare din cele doua PEx sau PEy. In modul SISD o conditie dintr-o instructiune este testata doar in elementul PEx si este apoi aplicata intregii instructiuni.

In modul SIMD transferurile registru-registru sunt bidirectionale, insemnand ca operatia realizata intr-un PE poate fi duplicat in paralel si in celalat PE. Instructiunile vor folosi in acest caz doua registre sursa si doua registre destinatie, cate unul pentru fiecare element de procesare. Pentru a suporta modul de lucru SIMD, procesorul de semnal efectueaza urmatoarele operatii paralele:

livreaza aceeasi instructiune tuturor unitatilor de calcul din cele doua elemente de procesare;

incarca doua seturi de date din memorie, cate unul pentru fiecare element de procesare;

executa aceeasi instructiune simultan in ambele elemente de procesare;

stocheaza rezultatele obtinute in urma celor doua executii in memorie.

Figura 1.8 prezinta diagrama bloc a functionarii celor doua elemente de procesare PEx si PEy (in modul SIMD):

Figura 1.8 Schema bloc pentru functionarea in SIMD

Deci cele doua elemente de procesare PEx si PEy sunt identice, continand urmatoarele blocuri functionale:

ALU unitatea aritmetica logica;

Multiplicatorul, cu registrele primar si alternativ pentru stocarea rezultatelor;

Unitatea de deplasare (shifter);

Setul de registre si setul de registre alternative;

1.2 Secventorul de program

Acest bloc functional dirijeaza cursul programului ce ruleaza in procesorul de semnal, oferind in mod constant adresa instructiunii care urmeaza a fi executata unitatii functionale, din interiorul procesorului, careia ii este destinata.

Cursul programului este de regula liniar in procesor, acesta executand instructiunile secvential in ordinea in care apar. Aceasta liniaritate poate disparea insa daca programul are si structuri nesecventiale asa cum sunt ilustrate in figura 1.9:

Figura 1.9 Secvente de program posibile

Secventorul administreaza executia acestor structuri de program selectand adresa urmatoarei instructiuni care urmeaza a fi executata. Secventorul indeplineste urmatoarele sarcini:

incrementeaza adresa instructiunii;

intretine stivele cu adrese pentru instructiuni;

evalueaza conditiile pentru structuri de program nesecventiale;

decrementeaza contorul buclei;

calculeaza noile adrese;

tine o memorie cache rapida pentru instructiuni;

administreaza intreruperile.

1.2.1 Schema bloc a secventorului de program

Pentru a realiza toate sarcinile mentionate in paragraful precedent, secventorul de program utilizeaza blocurile prezentate in figura 1.10. Multiplexorul de adrese selecteaza urmatoarea adresa din mai multe surse posibile. Aceasta adresa intra in pipeline-ul pentru instructiuni, care dispune de un registru pentru noile adrese, un registru de decodare a adreselor si un contor de program PC. Aici sunt continute adresele noi pe 24 de biti pentru instructiunile aduse, decodate si executate. Contorul PC se cupleaza la stiva PC, care stocheaza adresele de intoarcere si adresele cap-de-bucla. Toate adresele generate de secventorul de program sunt adrese de 24 de biti. Pentru a administra evenimentele, controlerul de intreruperi al secventorului se ocupa de procesarea intreruperilor, determina daca o intrerupere este mascabila si genereaza vectorul de adrese adecvat pentru intrerupere. Cu ajutorul memoriei cache pentru intreruperi, care este selectiva, secventorul poate aduce din zona memoriei de program o instructiune in acelasi ciclu.

Figura 1.10 Schema bloc a secventorului de program

Secventorul evalueaza instructiunile conditionale si conditiile pentru iesirea din bucla folosind registrele de stare. Stiva adresei bucla si stiva contorului de bucla suporta modul de lucru bucla-in-bucla. Stivele de stare stocheaza registrele de stare pentru implementarea rutinelor cu intreruperi intretesute. Toate registrele din secventorul de program sunt registre universale si sunt accesibile si altor registre universale si memoriei de date. Toate registrele secventorului si varfurile de stiva sunt citibile. De asemenea in toate acestea se si poate scrie, exceptie facand doar Adresa noua, Decodorul de adresa si Contorul de program.

Un set de registre de control de sistem configureaza si furnizeaza intrari secventorului de program. O instructiune ce opereaza la nivel de bit permite setarea, stergerea, inversarea si testarea anumitor biti din registrele de sistem. Scrierile in aceste registre nu au efect imediat ci in ciclurile urmatoare. Spre exemplu, dupa o scriere in registrul MODE1 pentru a activa modul de lucru saturat al ALU, schimbarile nu au efect decat doua cicluri mai tarziu dupa scriere. De asemenea, unele registre nu se modifica imediat dupa ce a fost executata scrierea. Va trece un ciclu nou pana cand o citire din registru va intoarce noua valoare.

1.2.2 Structura pipeline si memoria cache

Secventorul de program determina adresa urmatoarei instructiuni examinand atat instructiunea care tocmai se afla in executie cat si starea curenta a procesorului. Daca nu exista alte conditii care sa ceara altceva, procesorul de semnal executa instructiunile din memoria de program in ordine secventiala incrementand constant noua adresa. Folosind pipeline-ul instructiunile vor fi procesate in trei cicluri:

Ciclul de aducere (citire). Procesorul citeste instructiunea fie din memoria cache pentru instructiuni fie din memoria program;

Ciclul de decodare. Procesorul decodeaza instructiunea, generand conditiile care guverneaza executarea intructiunii;

Ciclul de executie. Procesorul executa propriu-zis instructiunea, operatiile specificate de instructiune fiind completate intr-un singur ciclu.

In cazul unui program secvential, fara salturi sau intreruperi, in timp ce o instructiune este apelata, instructiunea adusa in ciclul anterior este decodata, iar instructiunea adusa cu doua cicluri in urma este executata. Aceasta ordine secventiala are mereu ca rezultat procesarea unei instructiuni pe ciclu.

In cazul unui program ne-secvential, numarul de instructiuni pe ciclu poate scadea. Operarea programelor ne-secventiale includ:

accesarea datelor din memoria program care sunt in conflict cu apelarea instructiunii;

salturi;

chemarea de subrutine si intoarceri din subrutine (RTS);

intreruperi si intoarceri din intreruperi (RTI);

bucle.

In general, secventorul apeleaza cate o instructiune din memorie la fiecare ciclu. Ocazional, anumite limitari ale magistralei impiedica posibilitatea de a apela din memorie date sau instructiuni intr-un singur ciclu. Pentru a usura aceste limitari ale fluxului de date, procesorul poseda o memorie cache pentru instructiuni. Cand procesorul executa o instructiune care necesita accesul datelor pe magistrala PM, va aparea un conflict deoarece secventorul de program utilizeaza magistrala PM pentru apelarea instructiunilor. Pentru a evita aceste conflicte, procesorul memoreaza in cache aceste instructiuni reducand astfel intarzierile. In afara de activarea si dezactiverea ei, memoria cache, nu necesiata nici o interventie din partea utilizatorului.

Cu prima ocazie in care procesorul se confrunta cu un conflict de apelare, acesta trebuie sa astepte apelarea instructiunii in ciclul urmator, provocand astfel o intarziere. Procesorul va scrie imediat instructiunea respectiva in memoria cache pentru a preveni aceasta intarziere sa mai aiba loc inca o data in viitor. Secventorul verifica memoria cache la fiecare accesare a memoriei de program. Daca instructiunea dorita se afla in memoria cache, atunci ea este apelata in paralel cu accesarea memoriei program, evitand astfel aparitia unei intarzieri.

1.3 Generatoarele de adrese de date DAG1 si DAG2

Generatoarele de adrese de date ale procesorului digital de semnal genereaza adrese pentru transferul datelor in si de la memoria de date si memoria de program. Prin aceasta generare de adrese, DAGurile ofera posibilitatea programelor sa se adreseze indirect, folosind registrul DAG in loc de o adresa absoluta.

Arhitectura generatoarelor de adrese de date, asa cum este prezentata si in figura 1.11, suporta mai multe functii care minimizeaza depasirile in rutinele de acces la date. Aceste functii includ:

livrarea adresei si modificarea acesteia; livreaza adresa in timpul unui transfer de date si auto-incrementeaza adresa stocata pentru urmatorul transfer;

livrarea adresei pre-mofidicate; livreaza o adresa modificata in timpul transferului datelor fara a incrementa adresa stocata;

modificarea adresei; incrementeaza adresa stocata fara a se realiza un transfer al datelor;

adresa cu inversie de biti; livreaza o adresa cu bitii inversati in timpul transferului datelor fara a inversa adresa stocata;

realizeaza transferuri de date simultane in registre complementare in fiecare element de procesare in SIMD;

Figura 1.11 Schema bloc a generatorului de adrese de date DAG

Figura 1.11 prezinta cele patru tipuri de registre de care dispune o unitate DAG. Aceste registre stocheaza valorile pe care DAG le foloseste pentru a genera adrese. Cele patru tipuri de registre sunt:

Registrele index (I0-I7 pentru DAG1 si I8-I15 pentru DAG2). Un registru index contine o adresa si se comporta ca un pointer catre memorie. De exemplu, unitatea DAG interpreteaza sintaxele dm(I0,0) si pm(I8,0) dintr-o instructiune ca pe niste adrese.

Registrele de modificare (M0-M7 pentru DAG1 si M8-M15 pentru DAG2). Un registru de modificare ofera pasul de incrementare cu care un registru index este pre sau post modificat in timpul transferului datelor. De exemplu, instructiunea dm(I0, M1) indica unitatii DAG sa puna adresa in registrul I0 si apoi sa modifice continutul lui I0 folosind registrul M1.

Registrele de lungime si registrele de baza (L0-L7 si B0-B7 pentru DAG1 si L8-L15 si B8-B15 pentru DAG2). Aceste registre determina intervalul de adrese si adresa de inceput pentru un buffer circular.

1.3.1 Setarea modurilor de lucru ale DAG

Registrul MODE1 controleaza de asemenea si functionarea unitatilor DAG. Astfel, modurile posibile de lucru ale DAG sunt:

Buffer circular activ; bitul 24 (CBUFEN) din registrul MODE1 activeaza (1) sau dezactiveaza (0) acest mod de lucru;

Incarcarea registrului de difuzare activ, DAG1-I1; bitul 23 (BDCST1) activeaza (1) sau dezactiveaza (0) acest mod de lucru;

Incarcarea registrului de difuzare activ, DAG2-I9; bitul 22 (BDCST9) activeaza (1) sau dezactiveaza (0) acest mod de lucru;

Mod SIMD activ; bitul 21 (PEYEN) activeaza calculele in PEy -mod SIMD – daca este 1 sau dezactiveaza PEy – mod SISD – daca este 0.

Adresarea cu inversie de bit activa, DAG1-I0; bitul 1 (BR0) activeaza acest mod de lucru (1) pe registrul index I0 sau il dezactiveaza (0);

Adresarea cu inversie de bit activa, DAG2-I8; bitul 1 (BR8) activeaza acest mod de lucru (1) pe registrul index I8 sau il dezactiveaza (0);

Registrele secundare pentru DAG2 lo, I, M, L, B8-B11; bitul 6 (SRD2L);

Registrele secundare pentru DAG2 hi, I, M, L, B12-B15; bitul 5 (SRD2H);

Registrele secundare pentru DAG1 lo, I, M, L, B0-B3; bitul 4 (SRD1L);

Registrele secundare pentru DAG1 hi, I, M, L, B4-B7; bitul 3 (SRD1H);

Acesti biti selecteaza setul de registre secundare corespunzatoare (1) sau setul de registre primare corespunzatoare (0).

1.3.2 Modul de lucru cu buffer circular si modul de difuzare

In modul de lucru cu buffer circular, generatorul de adrese de date furnizeaza adrese avand ca limita un buffer de lungime limitata (setat cu un registru L), incepand de la o adresa de baza (setata cu un registru B), incrementata la fiecare accesare cu o valoarea de modificare (setata cu un registru M). La modelele mai vechi de procesoare digitale de semnal SHARC, cum este familia ADSP-2106x, modul cu buffer circular este intotdeauna setat activ. Pentru a pastra compatibilitatea codurilor, programele importate pe un procesor ADSP-21160 trebuie sa contina si instructiunea: Bit Set Mode1 CBUFEN; Aceasta instructiune activeaza modul de lucru cu buffer circular.

Bitii BDCST1 si BDCST9 din registrul MODE1 activeaza modul de lucru cu difuzare. Acest mod presupune incarcarea mai multor registre cu date folosind o singura comanda de incarcare. Cand bitul BDCST1 este 1, generatorul de adrese de date efectueaza incarcarea de date duala pentru instructiunile care folosesc registrul I0 pentru adrese. Unitatea DAG incarca atat registrul specificat explicit dintr-un element de procesare cat si registrul complementar corespunzator din celalalt element de procesare (registrul implicit). Bitul BDCST9 din registrul MODE1 activeaza aceasta proprietate pentru registrul I9.

Activand acest mod de lucru cu difuzare pentru amandoua unitatile DAG nu se influenteaza cu nimic continutul registrelor universale. Bitul PEYEN, care selecteaza modul de lucru intre SISD sau SIMD, nu inflenteaza functionarea modului de lucru cu difuzare. Acest mod de lucru este folositor mai ales pentru aplicatiile SIMD, unde algoritmii necesita ca date identice ca fie incarcate simultan in ambele elemente de procesare.

1.3.3 Registrele DAG alternative (secundare)

Fiecare unitate DAG poseda un set de registre alterative. Pentru a facilita schimbul rapid de date, procesorul digital de semnal include niste seturi de registre alternative pentru date, rezultate si pentru registrele DAG. Accesibilitatea la registrele alternative este controlata de anumiti biti din registrul MODE1. Daca aceste registre alternative sunt setate ca inaccesibile, operatiile efectuate de procesor nu sunt influentate cu nimic. Cum am mai mentionat si anterior, exista o intarziere de un ciclu intre scrierea in registrul MODE1 si posibilitatea de a accesa setul de registre alternative. Figura 1.12 prezinta registrele primare si alternative ale unitatilor DAG1 si DAG2 si bitii de selectie corespunzatori din registrul MODE1:

Figura 1.12 Registrele primare si alternative ale DAG1 si DAG2

1.3.4 Modul de adresare cu ordinea bitilor inversata

Bitii BR0 si BR8 ai resigrului MODE1 activeaza modul de adresare cu bitii inversati. Aceasta inseamna ca adresa de iesire va avea ordinea bitilor inversata. Cand bitul BR0 este 1, DAG1 genereaza adrese de 32 de biti cu ordinea bitilor inversata de la I0. Cand bitul BR8 este 1, DAG2 genereaza adrese de 32 de biti cu ordinea inversata de la I8. Unitatile DAG pot genera adrese cu bitii cu ordinea inversata doar din registrele I0 si I8; continutul acestor registre nu este inversat. Inversarea ordini bitilor in adresa afecteaza atat operatia de pre-modificare cat si pe cea de post-modificare. In plus fata de modul de adresare cu bitii inversati, procesorul suporta si o instructiune cu bitii inversati. Aceasta inverseaza bitii din continutul unui registru selectat.

1.3.5 Operatiile DAG

Unitatile DAG pot efectua diferite tipuri de operatii pentru a genera adrese de date. Registrele DAG si registrele MODE1, MODE2 si STKYx contribuie la realizarea acestor operatii care sunt urmatoarele:

Adresarea cu DAG;

Adresarea cu buffer circular;

Modificarea registrelor DAG.

Unitatea DAG ajusteaza automat adresele de iesire in functie de dimensiunea cuvantului care reprezinta locatia adresei (scurt, normal sau lung). Ajustarea adreselor faciliteaza memoriei sa foloseasca adresele direct.

Adresarea cu DAG. Unitatile DAG suporta doua tipuri de adresari modificate – generand o adresa care este incrementata de o valoare sau de un registru. In adresarea pre-modificata, DAG adauga un modificator, care poate fi un registru M sau o valoare intermediara, unui registru I si genereaza la iesire o adresa. Adresarea pre-modificata nu schimba registrul I. Cel de al doilea tip de adresare modificata este adresarea post-modificata. In acest caz, DAG genereaza la iesire valoarea registrului I nemodificata si apoi aduna registrul M sau o valoare intermediara, actualizand totodata si valoarea registrului I. In figura 1.13 sunt prezentate cele doua tipuri de adresari modificate.

Figura 1.13 Adresarea pre-modificata si post-modificata

Diferenta dintre instructiunile pre-modificate si post-modificate in ansamblul sintaxei consta in pozitia indexului si a modificatorului in instructiune. Daca registrul I este plasat dupa modificator, instructiunea reprezinta o operatie pre-modificata. Daca modificatorul este plasat dupa registrul I, instructiunea este o operatie post-modificata cu actualizare. In urmatorul exemplu instructiunea acceseaza locatia din memoria de program indicate de valoarea din I15 si scrie valoarea I15+M12 in registrul I15:

R6 = PM(I15,M12); /* adresara post-modificata cu actualizare */

Pentru comparatie, urmatoarea instructiune acceseaza locatia din memoria de program indicate de valoarea I15+M12 si nu schimba valoarea aflata in registrul I15:

R6 = PM(M12,I15); /* adresare pre-modificata fara actualizare */

Registrele de modificare M pot lucra cu oricare din registrele index I din aceeasi unitate DAG. Instructiunile pot folosi si un numar (valoare imediata) in loc de valoarea din registrul M, ca si modificator. Marimea valorii imediate care poate modifica un registru I depinde de tipul instructiunii. Pentru toate operatiile de accesare a unei singure date valoarea imediata de modificare poate fi de maxim 32 de biti. Instructiunile care combina adresarea DAG cu calculele limiteaza marimea valorii imediate pentru modificare. In aceste instructiuni, valoarea imediata de modificare poate fi de maxim 6 biti.

Adresarea cu buffer circular. Aceasta adresare presupune un set de adrese care contin date pe care unitatea DAG le parcurge pas cu pas si pe care le repeta in momentul in care a ajuns la capat, formand astfel un traseu circular. Pentru a adresa un buffer circular, unitatea DAG introduce valoarea registrului index I in buffer, post-modificand si actualizand valoarea indexului la fiecare accesare cu o valoare (M sau imediata) pozitiva sau negativa. Daca valoarea pointerului index iese din buffer, unitatea DAG scade sau aduna lungimea bufferului valorii, aducand pointerul index la inceputul bufferului. Adresa de la care DAG incepe sa calculeze bufferul se numeste adresa bazei bufferului (registrul B). Nu sunt restrictii asupra valorii adresei bazei a unui buffer circular. Bufferul circular poate folosi numai adresarea post-modificata deoarece acesta necesita actualizarea indexului la fiecare accesare.

Pasii pe care trebuie sa ii urmeze un program pentru a seta un buffer circular sunt urmatorii:

activarea bufferului circular (Bit Set Mode1 CBUFEN;); aceasta operatie este necesara o singura data intr-un program;

incarcarea adresei bazei bufferului in registrul B; aceasta operatie incarca automat valoarea corespunzatoare registrului I;

incarcarea valorii lungimii bufferului in registru L;

incarcarea valorii de modificare intr-un registru M in DAGul corespunzator. Alternativ, programul poate folosi o valoarea imediata drept modificator.

Unitatea DAG foloseste toate cele patru tipuri de registre pentru adresarea cu buffer circular. Aceste registre au urmatoarele roluri in acest caz:

Registrul index I contine valoarea pe care DAG o va genera pe magistrala de adrese;

Registrul de modificare M contine valoarea de post-modificare (pozitiva sau negativa) pe care DAG o aduna la registrul I la sfarsitul fiecarei accesari de memorie. Registrul M poate fi oricare registru de modificare disponibil in DAG precum si registrul I nu trebuie neaparat sa aiba acelasi numar. Marimea valorii de modificare, fie ea o valoare din M sau o valoarea imediata, nu poate sa depaseasa lungimea bufferului circular (registrul L);

Registrul pentru lungimi L specifica marimea bufferului circular si intervalul de adrese pe care DAG il poate folosi pentru valorile din registrul I. L trebuie sa fie o valoare pozitiva si nu poate fi mai mare decat 231-1. Daca L are valoarea zero atunci bufferul circular este dezactivat;

Registrul de baza B, sau registrul B plus registrul L, reprezinta valoarea pe care DAG o compara cu I dupa fiecare accesare. Cand registrul B este incarcat, registrul I corspunzator este incarcat simultan cu aceeasi valoare. Cand I este incarcat valoarea lui B nu se schimba. Programele pot citi registrele I si B independent.

Modificarea registrelor DAG. DAG poseda doua operatii care pot modifica o adresa fara a genera la iesire alta adresa. Aceste doua operatii sunt inversarea de biti si modificarea adresei. Ele sunt folositoare pentru adresarea cu inversie de bit si pentru intretinerea pointerilor. Instructiunea Modify modifica adresele din orice registru index I al DAG (I0-I15) fara a accesa memoria. Daca registrele B si L corespunzatoare unui registru I sunt setate pentru a activa un buffer circular, atunci instructiunea Modify efectueaza o setare a bufferului (daca este necesara). Sintaxa pentru instructiunea Modify este asemanatoare cu cea pentru post-adresare, adica mai intai indexul si apoi modificatorul. Instructiunea Modify accepta ca modificator atat valori ale registrelor M dar si valori imediate pe 32 de biti. Exemplul urmator aduna 4 la valoarea lui I1 si salveaza rezultatul tot in I1:

Modify(I1,4);

Instructiunea Bitrev modifica si inverseaza bitii adreselor din orice registru index DAG (I0-I15) fara sa acceseze memoria. Aceasta instructiune este independenta de modul cu ordinea bitilor inversata. Bitrev aduna o valoare imediata de 32 de biti unui registru index DAG, inveseaza bitii rezultatului si scrie rezultatul inapoi in acelasi registru index. Urmatorul exemplu aduna 4 la registrul I1, face inversia de biti a rezultatului si actualizeaza I1 cu noua valoarea calculata:

Bitrev(I1,4);

1.4 Memoria

Procesorul digital de semnal dispune de o memorie interna cu doua porturi si ofera acces la o memorie externa prin intermediul portului extern. Aceasta memorie interna are capacitatea de 8Mbiti. In acest spatiu, procesorul ADSP-21160 are o memorie de 4Mbiti divizata in doua blocuri de cate 2Mbiti: Block0 si Block1. Restul de 4Mbiti sunt rezervati. Tabelul 1.1 arata numarul maxim de date sau de cuvinte instructiuni care intra intr-un bloc de 2Mbiti de memorie interna:

Tabelul 1.1

Memoria externa se conecteaza la procesorul digital de semnal prin portul extern care extinde adresele de 32 de biti si magistralele de 64 de biti ale procesorului. Acesta poate accesa memoria externa pe 32 sau pe 64 de biti pentru a schimba date sau instructiuni. Tabelul 1.2 arata tipurile de acces si cuvintele pe care le foloseste procesorul pentru a comunica cu memoria externa. Controlerul DMA al procesorului impacheteaza automat datele externe in cuvinte de dimensiuni corespunzatoare in timpul transferului de date.

Tabelul 1.2

Majoritatea microprocesoarelor folosesc o singura adresa si magistrala de date pentru accesarea memoriei. Acest tip de arhitectura a memoriei este cunoscuta sub numele de arhitectura Von Neumann. Dar procesoarele digitale de semnal necesita fluxuri de date mult mai mari decat poate sa ofere arhitectura Von Neumann. De aceea multe procesoare de semnal folosesc arhitecturi pentru memorie care au magistrale separate pentru program si pentru date. Cele doua magistrale ofera procesorului posibilitatea de a prelucra un cuvant de date si o instructiune simultan. Acest tip de arhitectura este cunoscuta sub numele de arhitectura Harvard.

Procesoarele SHARC merg un pic mai departe folosind o arhitectura Super Harvard. Aceasta arhitectura are magistrale de program si de date separate dar poseda un singur spatiu, unificat, pentru adrese, pentru stocarea programelor si a datelor. In timp ce magistrala de date DM doar transporta datele, magistrala de program PM accepta si date si instructiuni, permitandu-se astfel accesul simultan la doua date distincte.

1.4.1 Accesul magistralelor PM, DM si IO la memorie

Nucleul procesorului de semnal si procesorul I/O acceseaza memoria interna independent si transparent unul fata de celalalt. Fiecare bloc de memorie poate fi accesat atat de nucleul procesorului cat si de procesorul I/O in fiecare ciclu (nu sunt necesare alte cicluri daca procesorul I/O si nucleul procesorului acceseaza acelasi bloc de memorie). Un conflict de acces la memorie poate aparea cand nucleul procesorului incearca sa acceseze de doua ori acelasi bloc de memorie in acelasi ciclu. Cand acest lucru are loc, un ciclu suplimentar va fi necesar. Accesul pe magistrala DM se incheie primul iar accesul pe magistrala PM se incheie in urmatorul ciclu. Pe durata a unui singur ciclu in care nucleul procesorului acceseaza doua date simultan, vor fi folosite independent magistralele PM si DM pentru a accesa date din ambele blocuri ale memoriei. Prin aceasta posibilitate de a accesa in acelasi timp doua seturi de date, fluxul datelor de iesire creste. Este important de stiut limitarile pe care trebuie sa le respecte programele pentru a accesa doua seturi de date in acelasi ciclu. Acestea sunt:

cele doua portiuni de date trebuie sa provina din blocuri de memorie diferite; daca nucleul incearca sa acceseze doua cuvinte din acelasi bloc de memorie, pe aceeasi magistrala, pentru o singura instructiune, un ciclu suplimentar va fi necesar;

operatia de accesare a datelor sa nu intre in conflict cu operatia de apelare a instructiunilor; daca instructiunea care provoaca conflictul se gaseste in memoria cache, accesarea datelor se incheie intr-un singur ciclu iar secventorul foloseste instructiunea din cache; daca intructiunea care provoaca conflictul nu se gaseste in memoria cache, un ciclu suplimentar va fi necesar pentru a incheia accesarea datelor si pentru a introduce in cache instructiunea in cauza;

Utilizarea eficienta a memoriei este reflectata in modul in care programele si datele sunt aranjate in memorie si in variantele in care programele acceseaza datele.

Procesorul de semnal are trei magistrale interne conectate la memoria sa cu doua porturi: magistrala PM, magistrala DM si magistrala IO. Magistralele PM si DM impart acelasi port al memoriei iar magistrala IO se conecteaza la celalalt port. Accesul la memorie al nucleului procesorului (unitatile de calcul, DAG sau secventorul de program) se realizeaza pe magistralele PM si DM, in timp ce procesorul I/O acceseaza memoria pe magistrala IO. Folosind magistrala IO, procesorul I/O faciliteaza transferul datelor intre memoria interna si porturile de comunicatie ale procesorului (porturile de legatura – link ports, porturile seriale – serial ports si portul extern – external port) fara a obstructiona accesul nucleului procesorului la memorie.

Magistralele PM si DM si portul extern al procesorului IO (EP) pot incerca sa acceseze spatiul de memorie destinat pentru modul multiprocesor sau spatiul destinat memorie externe, in acelasi ciclu. Procesorul digital de semnal poseda un sistem cu doua nivele pentru arbitrarea conflictelor. Arbitrarea provine de la o conventie de prioritati si de starea bitilor EBPRx din registrul SYSCON. Magistrala DM are intotdeauna prioritate fata de magistrala PM. Intre acestea si portul extern prioritatea depinde de bitii EBPRx.

Figura 1.14 arata de asemenea ca magistralele PM, DM si procesorul I/O au acces la magistrala externa prin intermediul portului extern al procesorului de semnal. Portul extern furnizeaza acces la memoria de sistem si la alte periferice. Acest port lasa procesorul de care apartine sa acceseze memoria interna a altui procesor de semnal, daca este conectat intr-un sistem multiprocesor.

Aproape fara nici o exceptie, cele trei magistrale ale procesorului de semnal pot accesa toate spatiile de memorie, suportand date de toate marimile. Exista totusi trei restrictii in ceea ce priveste accesul magistralelor la memorie:

magistralele PM, DM si IO pot efectua accese la memoria externa sau la un sistem multiprocesor numai folosind adresarea cu cuvinte normale;

magistrala IO nu poate accesa registrele imprumutate ale procesorului I/O;

magistrala IO nu poate folosi adresarea cu cuvinte scurte pentru operatiile DMA.

Figura 1.14 Interconectarea magistralelor cu memoria in procesorul ADSP-21160

Memoria procesorului ADSP-21160 contine trei spatii distincte de memorie si anume:

– Spatiul de memorie interna; aceasta memorie se refera numai la memoria interna SRAM a procesorului si la registrele mappate de memorie; se intinde de la adresa 0x000 0000 pina la 0x0007 FFFF;

– Spatiul de memorie multiprocesor; acest spatiu se refera la memoriile interne ale altor procesoare de semnal ce fac parte din acelasi sistem multiprocesor; se intinde de la adresa 0x0010 0000 pana la 0x007F FFFF;

Figura 1.15 Spatiile de memorie ale procesorului ADSP-21160

– Spatiul de memorie externa; acest spatiu se refera la memoria neintegrata si care apartine altor periferice atasate procesorului de semnal; se intinde de la adresa 0x0080 0000 pana la 0xFFFF FFFF.

1.4.2 Accesarea memoriei

Modul de operare al memoriei procesorului de semnal ADSP-21160 este controlat de biti din registrele SYSCON, MODE1, MODE2 si WAIT. Acesti biti si modurile de acces la memorie corespunzatoare sunt:

Folosirea memoriei externe pentru start; bitul 1 (BS0) din registrul SYSCON indica ce memorie va fi folosita pentru start (boot): memoria interna (1) sau externa (0);

Plasarea vectorului de intreruperi; bitul 2 (IIVT) din registrul SYSCON precizeaza daca vectorul de intreruperi va incepe la adresa 0x0004 0000 indiferent de modul de initializare (1) sau daca acesta va incepe asa cum este precizat la start (boot) (0);

Largimea blocurilor memoriei interne; bitul 9 (IMDW0) si bitul 10 (IMDW1) din registrul SYSCON selecteaza modul de lucru cu cuvinte normale pentru blocurile de memorie 1 si 2;

Marimea bancurilor de memorie; bitii 12-15 (MSIZE) din registrul SYSCON selecteaza dimensiunea celor patru bancuri de memorie externa (3-0);

Prioritatea magistralei externe; bitii 17-18 (EBPRx) ai registrului SYSCON portului extern al procesorului I/O atunci cand arbitreaza portul extern al procesorului digital de semnal;

Utilizarea elementului secundar de procesare PEy; bitul 21 (PEYEN) din registrul MODE1 activeaza modul de lucru SIMD (1) sau modul SISD (0);

Incarcarea in registre a datelor de difuzare; bitul 22 (BDCST9) si bitul 23 (BDCST1) din registrul MODE1 activeaza acest mod de lucru folosind registrul index I1 sau I9;

Acces ilegal la registrul procesorului I/O; bitul 20 (IIRAE) din registrul MODE1 activeaza (1) sau dezactiveaza (0) detectia accesului ilegal la registrul procesorului I/O;

Modul de acces la memorie neregulat pe 64 biti; bitul 21 (U64MAE) din registrul MODE1 activeaza (1) sau dezactiveaza (0) detectia accesarilor accidentale la memorie;

Accesul la bancurile X de memorie externa; bitii 1-0 (EB0AM), 6-5 (EB1AM), 11-10 (EB2AM), 16-15 (EB3AM) si 21-20 (UBAM) din registrul WAIT selecteaza modurile de acces la bancurile de memorie externa;

Starile de asteptare ale bancurilor X de memorie externa; bitii 4-2 (EB0WS), 9-7 (EB1WS), 14-12 (EB2WS), 19-17 (EB3WS) si 24-22 (UBWS) din registrul WAIT selecteaza starile de asteptare ale bancurilor de memorie externa;

Marimea paginii bancului 0 de memorie externa; bitii 27-25 (PAGSZ) din registrul WAIT selecteaza marimea paginii pentru bancul 0 de memorie.

Lungimea cuvintelor cu care nucleul procesorului se adreseaza memoriei interne variaza tinand cont de urmatoarele reguli:

acces pe 48 de biti pentru cuvintele instructiuni, pentru date in cuvinte normale (40biti) sau pentru registrul PX;

acces pe 64 de biti pentru date in cuvinte lungi, date in cuvinte normale (32 biti) sau pentru date din registrul PX cu o menmonica LW (cuvinte lungi);

acces pe 32 de biti pentru date in cuvinte normale (32biti);

acces pe 16 biti pentru date in cuvinte scurte.

Procesorul determina daca accesul cu cuvinte normale este pe 32 sau pe 40 de biti in functie de valoarea setata in memorie interna in IMDWx. In timp ce accesarea mixata de cuvinte de 48 de biti si cuvinte de 16, 32 sau 64 de biti este interzisa la aceeasi adresa, citirea/scrierea mixata de cuvinte de 16, 32 sau 64 de biti la aceeasi adresa este permisa.

1.5 Procesorul I/O

Procesorul I/O al procesorului digital de semnal dirijeaza accesul direct la memorie DMA prin porturile extern, de legatura si seriale. Fiecare operatie DMA transfera un bloc intreg de date. Dirijand accesul direct la memorie, procesorul I/O ofera programelor posibilitatea de a transfera date ca operatiune secundara, si de a folosi nucleul procesorului pentru alte operatii simultane cu cea de transfer al datelor.

Arhitectura procesorului I/O este prezentata in figura 1.16. Operatiile DMA suportate includ transferurile urmatoare:

memorie interna memorie externa sau alte periferice;

memorie interna memoria interna a altui procesor de semnal;

memorie interna procesor gazda;

memorie interna port serial I/O;

memorie interna port de legatura I/O;

memorie interna periferice externe.

Figura 1.16 Schema bloc a procesorului I/O

Transferurile DMA intre memoria interna si memoria externa, memoria altui procesor sau a unei gazde, folosesc portul extern al procesorului digital de semnal. Pentru acest tip de transferuri, un program seteaza controlerul DMA cu marimea bufferului memoriei interne si cu adresa corespunzatoare, seteaza modificatorul de adresa si directia transferului. Parametrii unui transfer DMA sunt continuti in blocul pentru controlul transferului (TCB – Transfer Control Block). Dupa initializare, transferul DMA incepe cand programul activeaza canalul si continua pana cand procesorul I/O transfera tot bufferul in sau de la memoria procesorului digital de semnal.

Similar, tranferurile DMA intre memoria interna si porturile de legarura sau cele seriale au parametrii DMA de tip TCB. Cand procesorul I/O realizeaza un transfer DMA intre memoria interna si unul dintre aceste porturi, programul initializeaza parametrii si informatia este dirijata catre port in loc de magistrala externa. Directia unui port I/O (emisie sau receptie) determina directia in care se efectueaza un transfer. Cand pe acel port se receptioneaza date, procesorul I/O transfera automat date catre memoria interna. Cand portul trebuie sa transmita un cuvant, procesorul I/O va aduce automat din memorie datele necesare.

Procesorul I/O contribuie de asemenea la efectuarea transferurilor, de catre sistemul cu procesor digital de semnal, intre alte dispozitive periferice externe si memoria sa externa. Acest tip de transfer extern-extern foloseste numai portul extern si procesorul I/O.

Pentru a reduce numarul sarcinilor pe care trebuie sa le execute nucleul procesorului, procesorul I/O suporta efectuarea de operatii DMA inlantuite. In cazul acestor operatii DMA inlantuite, un program poate seta ca un transfer DMA sa initializeze automat cand se termina un alt transfer DMA urmator.

1.5.1 Registrele procesorului I/O

Registrele procesorului I/O sunt cele prezentate in figura 1.16 si anume: registrele buffer de date, registrele port, buffer si de control DMA si registrele pentru parametrii DMA.

Registrele buffer de date includ:

registre buffer pentru portului extern (EPx); aceste registre pe 64 de biti pentru portul extern au liste FIFO cu opt pozitii pentru transmiterea si receptionarea datelor catre alta unitate sau dispozitiv extern;

registre buffer pentru porturile de legatura (LBUFx); aceste registre pentru porturile de legatura au liste FIFO cu doua pozitii pentru transmiterea sau receptia datelor DMA cand este realizata conexiunea cu un alt port de legatura;

registre buffer pentru receptia pe porturile seriale (RXx); aceste registre pentru porturile seriale au liste FIFO cu doua pozitii pentru receptia datelor cand este realizata conexiunea cu un alt dispozitiv pe portul serial;

registre buffer pentru transmisia pe porturile seriale (TXx); aceste registre pentru porturile seriale au liste FIFO cu doua pozitii pentru transmisia datelor cand este realizata conexiunea cu un alt dispozitiv pe portul serial.

Registrele port, buffer si de control DMA includ:

registrul de configurare a sistemului (SYSCON); acest registru configureaza impachetarea, prioritatile si ordinea cuvintelor pentru portul extern;

registrul de asteptare si de mod de acces (WAIT); acest registru configureaza intercalarea, introducerea ciclurilor de asteptare (repaus) si starea de asteptare propriu-zisa pentru accesul DMA la memoria externa;

registrele pentru controlul DMA al portului extern (DMACx); aceste registre de control pentru fiecare canal DMA al portului extern selecteaza directia, formatul si activeaza inlatuirea, modul de transfer si inceputul DMA;

registrul comun pentru controlul portului de legatura (LCOM); acest registru precizeaza bufferul pentru impachetare si starea erorii pentru operatiile efectuate pe portul de legatura;

registrul comun de asignare a portului de legatura (LAR); acest registrul asigneaza buffere de legatura porturilor de legatura pentru efectuarea operatiilor pe aceste porturi;

registrele de control pentru porturile de legatura (LCTLx); aceste registre de control (fiecare controleaza cate trei buffere de legatura) selecteaza directia, dimensiunea cuvintelor si rata de transfer si activeaza inlantuirea, modul 2-D DMA si inceputul DMA;

registrele de control al receptiei pe porturile seriale (SRCTLx); aceste registre de control pentru fiecare port selecteaza formatul de receptie, monitorizeaza starea listei FIFO, si activeaza inlantuirea, modul 2-D DMA si inceputul DMA;

registrele de control al transmisiei pe porturile seriale (STCTLx); aceste registre de control pentru fiecare port selecteaza formatul de emisie, monitorizeaza starea listei FIFO, si activeaza inlantuirea, modul 2-D DMA si inceputul DMA;

Registrele pentru parametrii DMA functioneaza similar cu registrele DAG si includ:

registrele index interne (IIx); un registru index ofera o adresa interna de memorie, comportandu-se ca un pointer catre urmatoarea locatie de scriere sau citire DMA a memoriei interne;

regitrele de modificare interne (IMx); un registru de modificare ofera pasul de incrementare potrivit dupa care controlerul DMA post-modifica registrul index al memoriei interne corespunzator dupa citirea sau scrierea DMA;

registrele contor (Cx); un registru contor indica numarul de cuvinte ramas de a fi transferat inspre sau de la memoria interna pe canalul DMA corespunzator;

registrele pointer de inlantuire (CPx); un registru pointer de inlantuire contine adresa de inceput a TCB pentru urmatoarea operatie DMA pe canalul corespunzator; aceste registre controleaza de asemenea daca procesorul I/O va genera sau nu o intrerupere cand procesul DMA curent se incheie;

registrele generale (GPx); un registru general DMA contine o adresa sau o alta valoare;

registrele dimensiune A si B (DAx si DBx); registrele dimensiune tin numaratoarea pentru dimensiunile A si B ale 2-D DMA;

registrele index externe (EIx); aceste registre index ofera adrese de memorie externa, comportandu-se ca un pointer catre urmatoarea locatie de scriere sau citire DMA a memoriei externe;

registrele de modificare externe (EMx); un registru de modificare ofera pasul de incrementare potrivit dupa care controlerul DMA post-modifica registrul index al memoriei externe corespunzator dupa citirea sau scrierea DMA;

registrele contor externe (ECx); un registru contor indica numarul de cuvinte ramas de a fi transferat inspre sau de la memoria externa pe canalul DMA corespunzator;

1.5.2 Generarea adreselor DMA

Procesorul I/O genereaza adrese pentru canalele DMA asemanator cu modul in care generatoarele de adrese de date DAG1 si DAG2 genereaza adrese pentru accesul la memoria de date. Fiecare canal are un set de registre cu parametri care includ un registru index (IIx) si un registru de modificare (IMx) pe care procesorul I/O le foloseste pentru a adresa un buffer de date in memoria interna. Registrul index trebuie initializat cu valoarea adresei de start a bufferului de date. Ca parte a operatiei DMA, procesorul I/O pune adresa dintr-un registru index pe magistrala IO a procesorului digital de semnal si aplica aceasta adresa memoriei interne la fiecare ciclu DMA – un ciclu de ceas in care transferul DMA are loc.

Toate adresele din registrele index (IIx) au o valoare de plecare care se potriveste cu locatia de memorie RAM adresata cu cuvinte normale, inainte ca procesorul I/O sa foloseasca aceasta adresa. Pentru procesorul ADSP-21160 aceasta valoarea de plecare este 0x0004 0000. In timp ce adresele DMA trebuie sa fie cuvinte normale pe 32 de biti, transferurile de date din memoria interna pot fi pe 64, 48 sau 32 de biti. Transferurile de date din memoria externa pot fi pe 64, 32 sau 16 biti. Procesorul I/O poate efectua transferuri de date folosind cuvinte scurte de 16 biti, utilizand capacitatea de impachetare a canalelor DMA pe porturile extern si seriale.

Figura 1.17 Generatorul de adrese DMA

In figura 1.17 este prezentata schema bloc a generatorului de adrese DMA.

Secventele DMA incep in diferite feluri depinzand daca inlantuirea DMA este activa sau nu. Cand inlantuirea nu este activata, numai bitul de activare DMA (DEN) poate permite ca un transfer DMA sa aiba loc. O secventa DMA incepe atunci cand una din urmatoarele are loc:

inlantuirea este dezactivata iar bitul de activare DMA (DEN) trece de la starea jos la starea sus (01);

inlantuirea este activata, DEN=1 si registrul contor CPx contine o adresa diferita de zero. In acest caz, va avea loc mai intai incarcarea parametrilor TCB ai canalului;

inlantuirea este activata, registrul contor CPx contine o adresa diferita de zero si secventa DMA curenta se incheie.

O secventa DMA se incheie cand una din urmatoarele are loc:

– registrul contor ce se decrementeaza a ajuns la zero (atat C cat si EC pentru canalele portului extern);

– inlantuirea este dezactivata iar bitul de activare DMA (DEN) trece de la starea sus la starea jos (10);

Contorlerul DMA determina, pe un principiu ciclu-cu-ciclu, carui canal ii este permis accesul la magistrala interna IO si in consecinta care canal ar putea citi sau scrie in memoria interna. Cand transferul DMA are loc intre memoria interna a procesorului de semnal si o memorie externa, atunci memoria externa va avea de astepata unul sau mai multe cicluri. Aceasta asteptare totusi nu reduce rata globala de transfer intern daca alte canale au date gata pentru a fi transmise. Cu alte cuvinte magistrala interna IO a procesorului digital de semnal nu va fi blocata de un transfer extern incomplet.

1.6 Porturile procesorului ADSP-21160

Procesorul digital de semnal ADSP-21160 dispune de un port extern, sase porturi de legatura (link ports) si doua porturi seriale. Pe aceste portruri se pot conecta la sistemul cu procesor ADSP-21160 diverse dispozitive asa cum este prezentat in figura 1.18:

Figura 1.18 Sistem cu procesor ADSP-21160

1.6.1 Portul extern

Prin portul extern gama de adrese si chiar magistralele de date ale procesorului digital de semnal sunt extinse in afara celor oferite de chipul integrat. Folosind aceste magistrale si linii de control externe, sistemele pot interfata procesorul de care dispun cu memorii externe, cu alte procesoare pe 16 sau 32 de biti si chiar cu alte procesoare digitale de semnal. Cele mai multe operatii care privesc portul extern sunt strans legate de modul de acces la memoria externa si de procesarea datelor de I/O.

Exista un conflict cu rata de 3:1 la interfata pe care o reprezinta portul extern, deoarece de o parte datele circula pe trei magistrale iar pe partea cealalta numai pe una. Acest conflict se adauga celui cu rata de 2:1 provocat de faptul ca ceasul intern al procesorului digital de semnal este de doua ori mai rapid decat ceasul unui sistem extern. Astfel, sistemele care aduc instructiuni sau date prin intermediul portului extern trebuie sa tolereze o intarziere de cel putin un ciclu.

In afara memoriei interne SRAM procesorul digital de semnal mai poate adresa inca o memorie externa de pana la 4 giga-cuvinte cu ajutorul portului extern. Aceasta memorie externa poate contine instructiuni si date. Magistrala externa trebuie sa fie de minim 64 de biti pentru a putea trasporta instructiuni pe 48 de biti si date cu precizie extinsa de 40 de biti fara a necesita o compresare a acestora. Totusi se poate lucra si cu date compresate cu cuvinte de dimensiuni diferite.

Spre deosebire de procesoarele SHARC mai vechi, ADSP-21160 are o interfata pentru memoria externa (portul extern) mult mai performanta. Astfel, acesta suporta semnalele transmise in rafale si noua magistrala externa de 64 de biti. Interfata sincrona este mult mai performanta, cea asincrona ramanand la fel.

Memoria externa trebuie sa suporte dimensiunea maxima pentru magristrala de date (DATA63-0) pentru a atinge performante maxime. Procesorul ADSP-21160 nu poate transfera direct instructiuni sau date cu precizie extinsa la 40 de biti. Pentru a realiza aceasta, programele trebuie sa foloseasca un registru PX intermediar pe 64 de bit.

Memoria extinsa este divizata pe patru bancuri programabile de memorie de dimensiuni egale. Astfel se pot atasa la sistem diverse dispozitive periferice cu cerinte de timp diferite. Regiunea de memorie externa care se intinde dupa bancurile 0-3 nu mai este organizata pe bancuri de memorie. De regula, exista si o memorie externa separata din care procesorul de semnal isi citeste parametrii de initializare (boot). Aceasta memorie este constituita dintr-un EPROM si contine numai informatii necesare la pornirea sistemului. In sistemele multiprocesor spatiul de memorie extern este folosit numai utilizand protocolul de transfer sincron.

1.6.2 Porturile de legatura

Aceste porturi, in numar de sase la procesorul ADSP-21160, lucreaza pe 8 biti si folosesc la conectarea altor porturi de legatura din alte sisteme sau dispozitive periferice la sistemul curent.

Cele sase porturi de legatura sunt porturi bidirectionale si au opt linii de date (LxDAT7-0), o linie pentru confirmari (LxACK) si o linie de ceas (LxCLK). Porturile de legatura pot sa opereze la frecvente aproape egale cu cea a ceasului intern al procesorului de semnal, putand transfera astfel opt biti de date la fiecare ciclu de ceas. Conexiunea liniilor intre doua porturi de legatura de la doua procesoare de semnal diferite, unul transimtator si altul receptor, este prezentata in figura 1.19:

Figura 1.19 Conexiunea pinilor dintre doua porturi de legatura

Porturile de legatura au de asemenea urmatoarele caracteristici:

opereaza independent si simultan;

impacheteaza datele in cuvinte de 32 sau 48 de biti; aceste date pot fi citite direct de catre procesorul de semnal sau pot fi transferate memoriei interne prin DMA;

sunt accesibile de un procesor gazda extern, folosind scrieri si citiri directe;

au registre pentru transmiterea si receptionarea datelor cu buffere duble;

fiecare are propriul canal DMA dedicat; au sisteme de control programabile pentru transferuri;

ofera transferuri de date foarte rapide, punct-la-punct cu alte procesoare de semnal, permitand diferite tipuri de interconectari intre mai multe procesoare.

Exista sase buffere care memoreaza fluxul datelor ce trece prin porturile de legatura (LBUFO0-5). Acestea sunt independente de porturile de legatura si pot fi conectate la oricare dintre ele. Porturile de legatura transmit si receptioneaza date pe pinii de date LxDAT7-0. Oricare din cele sase buffere de legatura poate fi desemnat sa contribuie la realizarea transferului pe un port de legatura anume. Datele din bufferele de legatura pot fi accesate DMA sau sub controlul nucleului procesorului. Portul de legatura x nu se conecteaza neaparat la bufferul de legatura x. Un registru specializat LAR (link assignment register – registru pentru asignarea legaturilor) stabileste care port de legatura va fi conectat la care buffer de legatura. Transferurile memorie-memorie se pot realiza desemnand doua buffere pentru un singur port, realizandu-se astfel un mod de lucru in bucla. Desemnand mai mult de doua buffere pentru un singur port se va dezactiva portul respectiv. Schema bloc a porturilor de legatura si a bufferelor de legatura este prezentata in figura 1.20:

Figura 1.20 Porturile de legatura si bufferele de legatura

Modul de operare al porturilor de legatura este setat de biti din registrele SYSCON, LCOM, LAR si LCTLx. Acestia sunt:

bufferul de legatura pentru multiprocesare; bitul 20 (LMSP) din registrul LCOM activeaza (1) sau dezactiveaza (0) modul multiprocessor;

intarzierea pe cale de legatura; bitii 22-21 (LPATHD) din registrul LCOM seteaza intarzierea la schimbarea registrelor LPATH astfel: 00=nici o intarziere, 01=o intirziere suplimentara, 10=doua intarzieri suplimentare, 11=trei intarzieri suplimentare;

largimea caii de date a portului de legatura; bitii 9, 19 si 29 din registrul LCTL0 si bitii 9, 19 si 29 din registrul LCTL1 (LxDPWID) selecteaza largimea caii la 8 biti pentru 1 si 4 biti pentru 0.

Canalele DMA 4-9 suporta bufferele de legatura 0-5. O intrerupere mascabila este generata de fiecare data cand un transfer bloc DMA se incheie.

Erorile de transmisiune ce apar pe porturile de legatura pot fi detectate citind bitii LRERRx din registrul LCOM. Pentru a putea efectua acest control al erorii trebuie respectat urmatorul protocol:

protocolul transmitatorului: un cuvant aditional de control trebuie intotdeauna transmins la sfirsitul blocului de date. Transmitatorul trebuie apoi sa elibereze portul de legatura folosit si sa il utilizeze iar, dar in calitate de receptor, pentru a permite receptorului sa transmita inapoi un mesaj adecvat de confirmare transmitatorului;

protocolul receptorului: cand receptorul primeste un bloc de date, verifica daca a primit un mesaj suplimentar in bufferul de legatura si citeste bitul LRERR. Receptorul ar trebui apoi sa golesca, continutul bufferului de legatura (LxEN=0) si sa transmita mesajul adecvat inapoi la transmitator pe acelasi port de legatura sau pe unul diferit.

1.6.3 Porturile seriale

ADSP-21160 are doua porturi seriale independente, sincrone, SPORT0 si SPORT1, care reprezinta interfata de intrare/iesire cu o gama foarte larga de dispozitive periferice. Fiecare port serial are propriile sale registre si buffere de date.

Porturile seriale pot lucra la jumatate din rata de ceas a procesorului, fiecare dispunand astfel de un debit de date de (n/2) Mbiti/s, unde n este frecventa de ceas a procesorului. Functiile de transmisiune si receptie fiind independente se ofera astfel un grad mult mai mare de flexibilitate transmisiunilor seriale. Datele vehiculate pe porturile seriale pot fi transferate direct memoriei interne prin transferuri de date DMA. Fiecare port serial ofera un mod de lucru multicanal, realizat prin TDM (time division multiplexed). Ceasul de lucru si de sincronizare ale porturilor seriale pot fi generate chiar de procesorul digital de semnal insusi, sau pot fi obtinute de la o sursa externa. Cuvintele folosite au dimensiuni intre 3 si 32 de biti. Ele ofera posibilitati de selectie a sincronizarii si a modurilor de transmisiune.

Porturile seriale au urmatoarele caracteristici si capabilitati:

ofera functii independente pentru transmisiuni si receptionari;

transfera date in cuvinte de maxim 32 de biti, incepand ori de la MSB ori de la LSB;

buffere de date duble; atat functiile de transmisie cat si cele de receptie au un registru buffer de date si un registru de deplasare;

se genereaza intern frecventele ceasurilor seriale si ale celor de sincronizare, dar pot accepta si din afara valori pentru acestea de la diferite surse externe;

realizeaza trasferuri de cuvinte simple, cu ajutorul intreruperilor, inspre si de la memoria interna controlata de nucleul procesorului;

executa transferuri DMA inspre si de la memoria interna, fiecare port serial putand transmite sau receptiona automat un bloc intreg de date;

suporta inlantuirea de operatii DMA pentru blocuri de date multiple;

poseda un mod de lucru multicanal pentru interfetele TDM; fiecare port serial poate transmite sau receptiona siruri de biti seriale, transmise pe canale cu diviziune in timp TDM (mod de lucru adecvat pentru interfetele T1).

Porturile seriale receptioneaza date pe intrarile DR si transmint date serial pe iesirile DT. Pot lucra si in modul full-duplex transmitand si receptionand date simultan.

Comunicatiile seriale sunt sincronizate unui semnal de ceas – fiecare bit de date este acompaniat de un puls de ceas. Fiecare port serial isi poate genera sau primi propriul semnal de ceas de transmisie (TCLK) sau de receptie (RCLK). Semnalele de ceas generate intern sunt configurate in registrele TDIVx si RDIVx. In plus fata de semnalele de ceas, datele mai pot fi controlate si de inca un semnal suplimentar de sincronizare (frame sync signal). Acesta poate aparea ori la inceputul unui cuvant individual ori la inceputul unui bloc de cuvinte. Configurarea acestui semnal de sincronizare se face in functie de tipul dispozitivului care este conectat la procesorul digital de semnal pe portul serial. Fiecare port serial isi poate genera sau primi propriul semnal de sincronizare a transmisiei (TFS) sau de receptie (RFS). Semnalele de ceas generate intern sunt configurate in registrele TDIVx si RDIVx.

Schema bloc a unui port serial este prezentata in figura 1.21:

Figura 1.21 Schema bloc a portului serial SPORTx

Datele care urmeaza a fi transmise sunt scrie in registrul TX. Datele sunt apoi compresate optional si transmise automat registrului de deplasare de emisie. De aici, datele sunt transmise pe pinul DT in mod sincron cu ceasul TCLK. Daca se foloseste si un semnal de sincronizare suplimentar, TFS indica inceputul transmisiunii seriale a cuvintelor. Portiunea de receptie deplaseaza datele receptionate pe pinul DR sincron cu ceasul RCLK. Daca se foloseste si un semnal de sincronizare suplimentar, RFS indica inceputul receptionarii seriale a cuvintelor. Cand un cuvant intreg se gaseste in registrul de deplasare de receptie, datele sunt optional exapandate si apoi trimise automat bufferului RX.

Fiecare port serial are o intrerupere pentru transmisiunea DMA si o intrerupere pentru receptia DMA. Cand accesul DMA al portului serial nu este activ, intreruperile au loc in functie de lista FIFO de transmisie sau receptie. Daca in partea de transmisie lista FIFO este goala sau in partea de receptie lista FIFO este plina, atunci sunt generate intreruperi.

Resetarea porturilor seriale se poate face in doua moduri: hardware, folosind pinul RESET al procesorului, sau software, modificand bitul (SPEN) din registrele de control STCTLx si SRCTLx. Fiecare metoda are un efect diferit asupra portului serial. Resetarea hardware sterge complet valorile din registrele de control STCTLx si SRCTLx, inclusiv bitul (SPEN), si registrele TDIVx si RDIVx. Orice operatie care se afla in curs de desfasurare este oprita. Resetarea software face aproximativ acelasi lucru numai ca arbitrarea magistralei externe nu este afectata. Aceasta deoarece nu se face nici o sincronizare de magistrala la resetarea soft.

Bitii care controleaza diferitele moduri de lucru ale porturilor seriale se gasesc in registrele SRCTLx si STCTLx:

selectarea ceasului pentru transmisiunea interna; bitul 10 (ICLK) din registrul SRCTLx ;

selectarea frontului (sus/jos) pentru esantionare; bitul 12 (CKRE) din registrul SRCTLx selecteaza daca frontul pozitiv (1) sau cel negativ (0) va fi folosit pentru esantionarea datelor si pentru semnalul de sincronizare suplimentar;

selectarea necesitatii folosirii semnalului suplimentar de sincronizare la receptie; bitul 13 (RFSR) din registrul SRCTLx;

selectarea provenientei semnalului RFS; bitul 14 (IRFS) din registrul SRCTLx selecteaza daca semnalul RFS este generat intern sau provine de la o sursa externa;

selectarea dependentei de secventa de date a RFS; bitul 15 (DIRFS) din registrul SRCTLx;

selecteaza semnalul RFS jos/sus; bitul 16 (LRFS) din registrul SRCTLx;

selecteaza momentul de incepere al semnalului RFS; bitul 17 (LAFS) din registrul SRCTLx selecteaza daca semnalul RFS va incepe inaintea (0) sau dupa (1) primul bit la secventei de date. Acest bit trebuie sa fie zero pentru operatiile multicanal;

activarea modulului bucla proprie (loopback) a portului serial; bitul 22 (SPL) din registrul SRCTLx. Acest bit trebuie sa fie zero pentru operatiile multicanal;

activarea modului multicanal; bitul 23 (MCE) din registrul SRCTLx activeaza (1) sau dezactiveaza modul multicanal;

selectarea numarului de multicanale; bitii 28-24 (NCHN) din registrul SRCTLx selecteaza numarul multicanalului 0-31;

selectarea necesitatii folosirii semnalului suplimentar de sincronizare la transmisie; bitul 13 (TFSR) din registrul STCTLx;

selectarea provenientei semnalului TFS; bitul 14 (ITFS) din registrul STCTLx selecteaza daca semnalul TFS este generat intern sau provine de la o sursa externa;

selectarea dependentei de secventa de date a TFS; bitul 15 (DITFS) din registrul STCTLx;

selecteaza semnalul TFS jos/sus; bitul 16 (LTFS) din registrul STCTLx;

selecteaza momentul de incepere al semnalului TFS; bitul 17 (LAFS) din registrul STCTLx selecteaza daca semnalul TFS va incepe inainte (0) sau dupa (1) primul bit la secventei de date.

Procesorul ADSP-21160 dispune de un port de test compatibil cu standardul IEEE 1149.1 si anume portul JTAG.

2. FILTRE ADAPTIVE

Filtrele adaptive sunt foarte frecvent folosite in telecomunicatii, sisteme de control, sisteme radar si in alte sisteme unde informatia disponibila despre semnalul de intrare este minima.

Din cauza varietatii mari de metode de implementare ale filtrelor adaptive, multe aspecte ale proiectarii filtrelor adaptive ca si dezvoltarea unor algoritmi adaptivi, sunt guvernate de aplicatiile in sine.

Au fost dezvoltati mai multi algoritmi eficienti de calcul ai filtrelor adaptive in ultimii douazeci de ani. Acestia sunt bazati ori pe o apropiere statistica cum este algoritmul LMS (least mean-square), ori pe o apropiere determinista, cum este algoritmul RLS (recursive least-squares). Avantajul major al algoritmului LMS consta in simplitatea calculelor. Pe de alta parte, algoritmul RLS ofera o convergenta mult mai rapida cu costul unui grad mult mai ridicat de complexitate al calculelor.

2.1 Aplicatii ale filtrelor adaptive

Cateva aplicatii ale filtrelor adaptive bazate pe structuri de filtre FIR sunt prezentate in continuare.

2.1.1 Identificarea sistemului

Se pot proiecta metode de control pentru un sistem dinamic daca exista un model care descrie sistemul in miscare. Modelarea nu este usoara, fiind necesare luarea in considerare de fenomene fizice foarte complexe. Se pot strange informatii despre sistemul ce urmeaza a fi controlat colectand date experimentale provenite de la raspunsurile sistemului la excitatii cunoscute. Acest proces de construire a unor modele si de estimare a valorilor cele mai bune de parametri necunoscuti ai sistemului provenite din date experimentale se numeste identificarea sistemului.

Figura 2.1 prezinta o diagrama bloc a unui model de identificare a sistemului. Sistemul necunoscut este modelat de un filtru FIR cu coeficienti ajustabili. Atat sistemul necunoscut, variant in timp, cat si filtrul FIR sunt excitati de o secventa de intrare u(n). Iesirea filtrului FIR adaptiv y(n) este comparata cu iesirea sistemului necunoscut d(n) pentru a produce eroarea de estimare e(n). Eroarea de estimare reprezinta diferenta intre iesirea sistemului necunoscut si iesirea modelului estimat. Aceasta eroare de estimare e(n) este folosita apoi ca intrare pentru un algoritm adaptiv de control care corecteaza coeficientii individuali ai filtrului. Acest proces este repetat prin mai mult iteratii pana cand eroarea de estimare e(n) devine suficient de mica intr-un sens statistic. Raspunsul rezultat al filtrului FIR reprezinta acum chiar raspunsul sistemului necunoscut anterior.

Figura 2.1 Identificarea sistemului

2.1.2 Egalizor adaptiv pentru transmisiunile de date

Filtrele adaptive sunt larg folosite in egalizoarele din modemurile care transmit date pe canale vocale sau pe canale de benzi mai mari. Egalizorul adaptiv este folosit pentru a compensa distorsiunile cauzate de mediul de transmisiune si pentru a reduce interferenta simbolurilor. Modul de operare al acestuia implica mai intai o faza de initiere si apoi o faza de urmarire.

Egalizorul este initializat transmitadu-i-se o secventa cunoscuta de date de test u(n). Generand o versiune sincrona a semnalului de test in receptor, egalizorului adaptiv ii este data si o secventa de date care reprezinta raspunsul dorit d(n). Iesirea egalizorului y(n) este scazuta din acest raspuns dorit obtinandu-se o eroare de estimare care este folosita la randul ei pentru a ajusta coeficientii egalizorului spre valorile lor optime. Cand aceasta perioada de initializare este terminata, egalizorul adaptiv urmareste variatiile posibile in timp ale caracteristicilor canalului in timpul transmisiei folosind un estimant al secventei transmise ca si raspuns dorit. Acest estimant se obtine aplicand iesirea y(n) a egalizatorului la un bloc de decizie.

2.1.3 Compensarea ecoului pentru transimisiuni de date in

banda telefonica

Retelele telefonice cu comutatie sunt folosite pentru transmisiuni de date de volum mic ocazional. Un dispozitiv numit hibrid ofera posibilitatea de a transminte si receptiona in mod duplex pe o linie telefonica pe doua fire. Din cauza neadaptarii de impedanta intre hibrid si linia telefonica, va aparea un ecou care poate fi suprimat de compensatoare adaptive de ecou instalate in retea in pereche. Compensarea se face realizand un estimat al componentelor semnalului de ecou utilizand secventa transminsa u(n) ca date de intrare si scazand estimatul y(n) din semnalul receptionat d(n). Semnalul de eroare ce rezulta poate fi minimizat, prin metoda celor mai mici patrate, pentru a ajusta optim coefientii compensatorului de ecou.

2.1.4 Codarea liniara predictiva a semnalelor vocale

Aceasta metoda, cunoscuta sub numele de LPC (linear predictive coding), este un exemplu de algoritm utilizat pentru reprezentarea semnalelor vocale. Asa numitele coduri sursa sunt dependente de model: ele folosesc cunostinte despre felul in care au fost generate de catre sursa a semnalelor vocale. Codoarele sursa pentru voce sunt in general numite vocoders si pot functiona la debite de 4.8Kbits/s sau mai jos. In LPC, tractul vocal sursa este modelat ca filtru numai cu poli ai carui coeficienti sunt determinati adaptiv din esantioanele vorbirii prin mijloacele predictiei liniare. Esantioanele vocale u(n) reprezinta in acest caz raspunsul dorit pe cand u(n-1) sunt intrarile filtrului FIR cunoscut drept filtru de predictie a erorii. Semnalul de eroare dintre u(n) si iesirea filtrului FIR, y(n), este apoi minimizat cu metoda patratelor minime pentru a estima parametrii modelului. Semnalul de eroare si parametrii modelului sunt codati intr-o secventa binara si transmisi catre destinatie. In partea de receptie, semnalul vocal este sintetizat din parametrii modelului si din semnalul de eroare.

2.1.5 Sisteme de antene

Sistemele de antene adaptive folosesc tehnici de procesare care seamna foarte mult cu cele de la filtrele adaptive. Ele folosesc separarea spatiala dintre elementele antenei pentru a obtine un set paralel de esantioane ale semnalului, mai degraba decat versiunile intarziate in timp sau partial procesate ale semnalului de intrare unidimensional.

2.2 Structuri ale filtrelor FIR

Un sistem FIR prezinta un raspuns in impulsuri de durata finita care este zero in afara unui anume interval de timp. Astfel, un sistem FIR are o memorie finita de esantioane de lungime N. In continuare sunt descrie trei tipuri de baza de structuri utilizate pentru realizarea filtrelor FIR (transversal, simetric si lattice).

2.2.1 Structura transversala

In figura 2.2 este prezentata structura unui filtru FIR transversal cu N coeficienti (ajustabili in timpul procesului de adaptare) cu valorile:

w0(n), w1(n), …, wN-1(n).

Vectorul coeficientilor w(n) este notat:

w(n)=[w0(n) w1(n) … wN-1(n)]

vectorul u(n) de intrare:

u(n)=[u(n) u(n-1) …. u(n-N+1)]

Iesirea filtrului FIR poate fi astfel scrisa sub forma:

y(n)=wT(n) u(n)=wi(n) u(n-i)

unde T reprezinta transpusa, n este indexul timpului si N ordinul filtrului.

Figura 2.2 Filtru FIR transversal

2.2.2 Structura transversal simetrica

Caracteristica de raspuns cu faza liniara intr-un filtru este deseori preferata deoarece permite sistemului sa refuze sau sa modeleze benzile de energie ale spectrului si totusi sa mentina integritatea impulsului de baza cu o intarziere constanta de grup a filtrului. Imaginile si comunicatiile digitale sunt exemple de aplicatii in care aceasta caracteristica este preferata.

Un filtru FIR cu o simetrie in timp ca:

w0(n)=wN-1(n), w1(n)=wN-2(n) …

are faza raspunsului liniara in domeniul frecventa. In consecinta numarul de coeficienti este redus la jumatate intr-o structura simetrica asa cum este ilustrat in figura 2.3 cu un numar de N/2 coeficienti. Vectorul de intrare devine:

u(n)=[u(n)+u(n-N+1), u(n-1)+u(n-N+2), … , u(n-N/2+1)+u(n-N/2)]T

De aceea, iesirea y(n) a fitrului va avea expresia:

y(n)=wi(n)[u(n-i)+u(n-N+i)]

Figura 2.3 Filtru FIR transversal simetric

2.2.3 Structura lattice

Filtrul lattice are o structura modulara cu etape identice aranjate in cascada. Figura 2.4 prezinta o etapa a structurii lattice a unui filtru FIR:

Figura 2.4 O etapa a unui filtru FIR in structura lattice

Structura lattice ofera cateva avantaje fata de structura transversala:

Structura lattice are caracateristici numerice de rotunjire bune care fac ca sensibilitatea la erorile de rotunjire sa fie mai mica decat in cazul structurii transversale;

Diversele etape sunt decuplate una de cealalta astfel incat este relativ usor de crescut ordinul de predictie daca este necesar;

Filtrul lattice (predictorul) poate fi interpretat ca propagarea unei unde intr-un mediu stratificat. Acesta poate reprezenta un model de tub acustic asemanator tractului vocal uman, care este deosebit de folositor in procesarea digitala a vorbirii.

Aceste avantaje vin in schimb contra costului de a creste numarul de multiplicari si adunari necesare pentru realizarea unei anumite functii de transfer.

Urmatoarele ecuatii reprezinta dinamica etapei a m-a dintr-o structura lattice de ordinul M asa cum reiese din figura 2.4:

fm(n)=fm-1(n)-Km(n)bm-1(n-1), 0<m<M

bm(n)=bm-1(n-1)-Km(n)fm-1(n), 0<m<M

unde fm(n) reprezinta eroarea de predictie inainte, bm(n) reprezinta eroarea de predictie inapoi, Km(n) este coeficientul de reflexie, m este indexul etapelor si M este numarul de etape dispuse in cascada in cadrul structurii lattice. Km(n) este un numar subunitar. Termenii fm(n) si bm(n) sunt initializati astfel:

f0(n)=b0(n)=u(n)

unde u(n) este semnalul de intrare.

Analiza vorbirii este de obicei realizata folosind structura lattice si coeficientii de reflexie Km(n). Deoarece domeniul valorilor coeficientilor Km(n) este semnificativ mai mic decat cel al coeficientilor, w(n), ale unui filtru transversal, acesti coeficienti de reflexie necesita mai putini biti petru a fi reprezentati. De unde, Km(n) vor fi transmisi pe canal mai usor.

2.3 Algoritmi pentru filtre adaptive

Printre principalele tipuri de algoritmi folositi la realizarea filtrelor adaptive se numara algoritmul LMS (least-mean square) si algoritmul RLS (recursive least-squares). Algoritmii RLS ofera o convergenta mult mai rapida decat LMS, dar necesita calcule cu o complexitate marita.

2.3.1 Algoritmul LMS

Algoritmul LMS se initializeaza setand toti coeficientii la zero la momentul n=0. Coeficientii sunt reannoiti folosind relatia:

w(n+1)=w(n)+µe(n)u(n)

unde w(n) reprezinta coeficientii filtrului transversal, e(n) este eroarea, u(n) reprezinta valorile de intrare iar factorul µ parametrul de adaptare sau marimea pasului. Pentru a asigura convergenta, µ trebuie sa satisfaca conditia:

0<µ<(2/puterea totala de intrare)

unde puterea totala de intrare se refera la suma valorilor celor mai mici patrate ale valorilor de intrare u(n), u(n-1), … , u(n-N+1). Mai mult decat atat, timpul de convergenta la LMS depinde de valorile minime si maxime ale matricei de autocorelatie R a semnalului de intrare.

Pentru a asigura ca µ nu devine suficient de mare ca sa provoace instabilitatea filtrului, se poate implementa un algoritm LMS Normalizat. Acesta presupune o valoare dependenta de timp mu definita astfel:

unde x este pasul normalizat cu valori intre 0 si 2. Coeficientii iau valori dupa relatia:

Termenul x este noua constanta de adaptare normalizata, in timp ce r este un termen mic pozitiv inclus in relatie pentru a se asigura ca noile valori nu sunt excesiv de mari cand uT(n)u(n) devin temporar foarte mici.

O problema poate aparea cand matricea de autocorelatie asociata cu procesul de intrare are una sau mai multe valori proprii zero. In acest caz, filtrul adaptiv nu va converge spre o solutie unica. In plus, unii coeficienti pot creste fara limite. Aceasta problema se poate remedia prin metoda ‘leaky’ LMS care poate fi reprezentata astfel:

w(n+1)=(1-µr)w(n)+µe(n)u(n)

unde constanta de adaptare µ si coeficientul de scurgere r au valori pozitive mici.

2.3.2 Algoritmul RLS

Algoritmul RLS este cunoscut si sub numele de metoda recursiva a celor mai mici patrate. Aceasta poate fi privita ca o varianta de rezolvare a problemei de filtrare liniara deterministica. Unele filtrele reprezinta rezultatul unei medieri statistice (pe ansamblu) obtinandu-se un singur filtru (optim in sens statistic) pentru toate realizarile vectorului de intrare. Pe de alta parte pentru metoda celor mai mici patrate se obtine cate un filtru diferit pentru fiecare set al datelor de intrare . Algoritmul recursiv al celor mai mici patrate ( RLS – Recursive Least Squares) poate fi privit ca o varianta determinista a algoritmului Kalman.

In cazul filtrarii Kalman rezultatul obtinut este un singur filtru, optim in sensul mediei patratice, pentru orice realizare particulara a intrarii ; pentru algoritmul RLS – rezulta cate un filtru diferit pentru fiecare set de date la intrare.

Rezolvarea problemei de filtrare liniara se poate face fara a utiliza ipoteze statistice asupra intrarii. Pentru a ilustra ideea de baza a metodei se considera un set de valori reale u(1), u(2), … , u(N) luate la momentele de timp t1,t2, … , tN respctiv si se cere construirea unei curbe care sa corespunda cu setul de valori {u(n)} dupa un anumit criteriu optim. Se noteaza aceasta curba cu f(ti). In conformitate cu metoda celor mai mici patrate " cea mai buna " corespondenta este obtinuta prin minimizarea sumei patratelor diferentei dintre f(ti ) si u(i) pentru i = 1, 2, … , N.

2.3.2.1 Definirea problemei de filtrare cu metoda celor mai mici patrate

Se considera doua seturi de variabile {d(i)} si {u(i)}. Variabila d(i) este observata la momentul i si reprezinta un raspuns la subsetul de variabile u(i), u(i-1) , … , u(i-M+1) aplicat la intrare. Se face ipoteza ca dependenta lui d(i) in raport cu u(i) , u(i-1) , …. , u(i-M+1) este liniara deci:

d(i) = w0k u(i-k+1) + e0(i) (1)

unde w0k reprezita parametrii necunoscuti ai modelului , iar e0(i) reprezinta eroarea de masura.

Modelul descris de ecuatia (1) se numeste modelul de regresie liniara multipla (multiple liniar regression model) si este reprezentat prin graful din figura 2.5.

Figura 2.5 Modelul de regresie liniara multipla

Eroarea e0(i) este o variabila aleatoare neobservabila care este introdusa in model pentru a evidentia imprecizia de determinare a secventei d(i) folosind M esantioane anterioare ale intrarii u(i) ,u(i-1) , …. , u(i-M+1). Ecuatia (1) se rescrie in forma echivalenta:

E [d(i)] = w0k u(i-k+1) (2)

deoarece w0k sunt constante iar {u(i-k+1)} este o secventa cunoscuta (determinata). Cu alte cuvinte media statistica a raspunsului d(i) este, in teorie, determinata de model.

Problema de filtrare este aceea de a determina parametrii modelului de regresie multipla, w0k, k = 1, 2, …. , M, daca se dau 2 seturi de variabile observabile {u(i)} si {d(i)} , i=1,2,…, N. Modelul de filtru este cel de filtru transversal unde u(i), u(i-1), …, u(i-M+1) reprezinta intrarea si intrarea intarziata, iar w1, w2, …, wM reprezinta coeficientii filtrului; d(i) este raspunsul dorit. Eroarea reziduala (eroarea de estimare) este:

e(i) = d(i) – wk u(i-k+1) (3)

Prin aplicarea unui criteriu de optimizare se determina coeficientii optimi ai filtrului {w*0k}. Pentru metoda celor mai mici patrate criteriul de optimizare este dat de:

E (w1 ,w2 ,…, wM ) = |e(i)|2 (4)

Se minimizeaza suma patratelor erorii reziduale calculata intre 2 indici i1 =M si i2 = N.

Se fac notatiile w – vectorul coeficientilor , u – vectorul de intrare astfel:

wT = [ w1 ,w2 , … , wM ] (5)

si

uT(i) = [ u(i) , u(i-1) , …. , u(i-M+1) ] (6)

Utilizand (5) si (6) in (3) se obtine:

e(i) = d(i) – wT u(i) , M ≤ i ≤ N (7)

Se introduc vectorul erorii de estimare (vectorul rezidual), e, astfel:

eT = [ e(M) , e(M+1) , … , e(N) ]

si vectorul raspunsului dorit b astfel:

dT = [ d(M) , d(M+1) , …. , d(N) ]

Ecuatia (7) se rescrie in forma echivalenta:

eT = bT – wT [ u(M) , u(M+1) , … , u(N) ] = dT – wTAT (8)

unde

AT = [ u(M) , u(M+1) , … , u(N) ]

adica:

Ecuatia (8) este echivalenta cu:

e = d – w A (9)

Ecuatia (4) se poate scrie in forma echivalenta: E(w) = eT e. Utilizand ecuatiile (8) si (9) in relatia (5) rezulta:

E(w) = dT d – dT wA – wT AT d + wT AT Aw

Derivand relatia astfel obtinuta in raport cu w se obtine:

E / w = – 2AT d + 2AT Aw sau E / w = – 2AT e

Se noteaza cu w^ valoarea lui w pentru care suma erorilor patratice E este minima sau echivalent E / w = 0; rezulta:

AT Aw = AT b (ecuatia normala determinista).

Se introduc vectorul de intercorelatie intre intrarea filtrului si raspunsul dorit, , definit de =AT b si matricea deterministica de corelatie a intrarii, , definita de =AT A. Utilizand aceste definitii rezulta o noua forma a ecuatiei normale deterministe:

w^ = (10)

2.3.2.2 Implementarea filtrelor transversale adaptive utilizand algoritmul recursiv al celor mai mici patrate

In implementarea recursiva a metodei celor mai mici patrate se pleaca de la conditii initiale cunoscute si se utilizeaza informatia data de noile esantioane ale intrarii pentru a actualiza coeficientii filtrului. Lungimea setului de date observabile este variabila. Prin urmare indexul de performanta E devine dependent de timp adica va fi exprimat ca E(n). Se introduce si un factor de ponderare n-i care asigura faptul ca datele de intrare din trecutul indepartat sunt "uitate" – nu mai au pondere ridicata in procesul de actualizare a coeficientilor filtrului.

S-a notat cu y(n) iesirea filtrului adaptiv transversal, cu u(i) vectorul de intrare la momentul i, uT(i) = [ u(i) , u(i-1) , … , u(i-M+1) ], iar w(n) vectorul coeficientilor filtrului la momentul n,

wT(n) = [ w1 (n) , w2 (n) ,…. , wM (n) ]. Vectorul coeficientilor w(n) ramane fix pe intervalul de observatie i =1, n.

Indexul de performanta este:

E(n) = λn-1| e(i) |2 (11)

Valoarea optima a vectorului coeficientilor, w^(n), pentru care E(n) este minima este data de ecuatia normala:

(n) w^(n) = (n) (12)

unde (n) este matricea de corelatie a intrarii ponderate definita de:

(n) = λn-i u(i)uT(i) (13)

iar vectorul de intercorelatie (n) este dat de:

(n) = λn-i u(i)d*(i) (14)

Din ecuatia (13) se obtine:

(n)= λn-1-iu(i)uT(i) ]+u(n)uH(n) = (n-1)+u(n) uT(n) (15)

Similar din ecuatia (14) se obtine:

(n) = (n-1) + u(n)d(n) (16)

Relatiile (15) si (16) vor fi utilizate pentru determinarea recursiva a vectorului coeficientilor optimi w^(n) – evitandu-se utilizarea directa a ecuatiei (12) care presupune calcule laborioase.

2.3.2.3 Lema de inversiune a unei matrici

Fie A si B doua matrici M x M, pozitiv definite intre care exista relatia:

A = B-1 + CD-1 CT (17)

unde D este o matrice N x N, pozitiv definita, iar C este o matrice M x N. Matricea inversa a lui A este exprimata de:

A-1 = B – BC (D + CTBC)-1 CTB (18)

Lema de inversiune poate fi aplicata pentru a obtine o ecuatie recursiva pentru calculul vectorului w^(n).

Introducem notatiile : A = (n), B-1 = (n-1), C = u(n) si D = 1

Putem calcula (n) cu ecuatia (18) deoarece sunt indeplinite conditiile lemei de inversiune – (n) este o matrice de corelatie deci este pozitiv definita.

Se obtine:

, (19)

Notand:

P(n) = (n) (20)

(21)

si folosind ecuatia (19) rezulta:

P(n) = λn-1 P(n-1) – λn-1k(n)uT(n)P(n-1) (22)

Din ecuatia (21) rezulta:

k(n) = P(n-1)u(n) – k(n)uT(n)P(n-1)u(n) adica

k(n) = [n-1P(n-1) – n-1k(n)uT (n)P(n-1)]u(n) (23)

Se substituie ecuatia (22) in relatia (23) si se obtine:

k(n) = P(n)u(n) (24)

sau k(n) = (n)u(n) (25)

Din ecuatiile (12), (16) si (20) rezulta:

w^(n) = (n)(n) = P(n)(n) = P(n)(n-1) + P(n)u(n)d(n) (26)

Se substituie relatia (22) in ecuatia (26) si se obtine:

w^(n) = P(n-1)(n-1)-k(n)uH(n)P(n-1)(n-1) + P(n)u(n)d(n)=

= (n-1)(n-1) – k(n)uT(n)(n-1)(n-1) + P(n)u(n)d(n)=

= w^(n-1) – k(n)uT(n)w^(n-1) + P(n)u(n)d(n)

Utilizand si ecuatia (24) se obtine forma finala:

w^(n) = w^(n-1)+k(n)[d(n)-uT(n)w^(n-1)] = w^(n-1) + k(n)(n) (27)

S-a introdus notatia (n), ca informatie de innoire, data de:

(n) = d(n) – uT(n)w^(n-1) = d(n) – wT(n-1)u(n) (28)

Produsul scalar wT(n-1)u(n) reprezinta o estimare a raspunsului dorit d(n) bazata pe estimarea dupa metoda celor mai mici patrate a vectorului coeficientilor la momentul (n-1), w^(n-1), utilizand intrarea observata pana la momentul n inclusiv. Din acest motiv (n) se mai numeste si eroare de estimare a priori. Aceasta eroare este in general diferita de eroarea de estimare a posteriori, e(n), data de relatia e(n)= d(n)-w^(n)u(n), care caracterizeaza estimarea curenta (la pasul n) a vectorului coeficientilor w^(n).

Ecuatiile (21), (28) , (27) si (22), in aceasta ordine, constituie algoritmul recursiv al celor mai mici patrate (RLS).

Conditiile initiale ale algoritmului RLS sunt alese astfel incat matricea (n) sa fie nesingulara; se poate modifica relatia de definitie a lui (n) astfel:

(n) = n-iu(i)uT(i) + nI unde I este matricea unitate, iar constanta pozitiva mica. Aceasta modificare nu afecteaza rezultatele obtinute anterior. Intr-adevar exista relatia:

(n)=[n-i-1u(i)uT(i)+n-1I]+u(n)uT(n)=(n-1)+u(n)uT(n)

deci algoritmul RLS nu se modifica. Pentru n foarte mare (set de observatii foarte lung) alegerea lui nu este importanta ( < 1).

Pentru n = 0 rezulta:

(0) = I (29)

si P(0) = -1 I (30)

Pentru vectorul w^(n) se alege:

w^(0) = 0 (31)

Algortimul RLS poate fi implementat cu un filtru FIR transversal. Ordinea operatiilor pe care le presupune algoritmul este:

Calculeaza vectorul Kalman de castig (definit mai jos);

Calculeaza iesirea filtrului (coeficientii sunt zero la inceput);

Gaseste semnalul de eroare;

Reactualizeaza valorile matricii de corelatie inverse;

Reactualizeaza coeficientilor.

Vectorul castig Kalman este bazat pe rezultatele autocorelarii datelor de intrare, pe datele de intrare insele si pe un factor numit factor de uitare. Acest factor ia valori intre 0 si 1 si ofera o compensare in timp a datelor de intrare asa incat cele mai recente date conteaza mai mult decat datele mai vechi. Aceasta ofera coeficientilor filtrului capacitatea de a se adapta caracteristicilor statistice variante in timp ale semnalului de intrare.

Etapele de calcul care trebuie parcurse sunt urmatoarele:

x=s*P(n-1)*u unde s-1 factorul de uitare, n este indexul timpului, u={u(n u(n-1) … u(n-N+1)} sunt esantioanele de intrare in linia de intarziere, P este o matrice N pe N care la inceput este egala cu P(0)=δ-1*I, unde I este matricea unitate iar δ este un numar mai mare ca zero si care trebuie sa fie cat mai mic pentru un raport semnal zgomot cat mai redus, si N este numarul de coeficienti ai filtrului;

k=x/[1+u*x] unde k este un vector (Kalman) de lungime N;

P(n)=s*P(n-1)-k*xT unde xT este transpusa vectorului x;

e(n)=d(n)-w(n-1)*u unde e(n) este semnalul de eroare, w=[w0 w1 … wN-1)] sunt coeficientii filtrului si d(n) este semnalul de iesire dorit;

w(n)=w(n-1)+k*e(n) unde k este vectorul Kalman de castig; actualizarea coeficientilor se face pe baza erorii si a vectorului castig Kalman.

2.3.2.4 Concluzii

Algoritmul LMS are ca principal avantaj simplitatea calculelor, dar cu pretul unei rate de convergenta mai mica. Algoritmul LMS are un singur parametru ajustabil care influenteaza rata de convergenta, si anume pasul µ, care de altfel are si o raza restransa de valori pe care le poate lua, pentru a asigura stabilitatea. Pentru a obtine rate mai rapide de convergenta trebuie folositi algoritmi mai complecsi cu mai multi parametri. Algoritmul RLS foloseste metoda celor mai mici patrate (least-squares) pentru a estima corelatia direct din semnalul de date de intrare.

Convergenta rapida a algoritmului RLS este obtinuta prin cresterea complexitatii calculelor necesare pentru fiecare iteratie. Pentru algoritmul RLS numarul de operatii pe iteratie este proportional cu N x N unde N este numarul de intarzieri ale filtrului transversal adaptiv; complexitatea algoritmului LMS este de ordinul a N operatii pe iteratie, dar rata de convergenta este cu un ordin de marime mai scazuta ca a algoritmului RLS.

Reducerea complexitatii algoritmului RLS se poate realiza prin modificarea algoritmului de baza avand in vedere faptul ca la pasul (n+1) se utilizeaza si datele de intrare de la pasul anterior, n. Cu aceasta modificare se obtine o clasa de algoritmi, derivati din algoritmul RLS de baza, numita clasa algoritmilor RLS rapizi. Complexitatea acestor algoritmi este proportionala cu N operatii pe iteratie (deci comparabila cu algoritmul LMS) in conditiile in care rata de convergenta ramane ridicata (aceeasi cu a algoritmului RLS de baza) .

O alta limitare a algoritmului RLS este aceea a instabilitatii numerice; datorita erorilor de reprezentare binara algoritmul poate deveni instabil; solutia este, in practica, marirea numarului de biti pe care se reprezinta numerele in structura numerica de prelucrare.

Rezulta urmatoarele concluzii:

1. Algoritmul RLS converge in aproximativ 2N iteratii, unde N este numarul de intarzieri ale filtrului adaptiv. Rata de convergenta a algoritmului RLS este cu un ordin de marime mai mare decat a algoritmului LMS.

2. Spre deosebire de algoritmul LMS rata de convergenta pentru algoritmul RLS nu depinde de imprastierea valorilor proprii ale matricii de corelatie a intrarii.

Aceste concluzii sunt valabile atunci cand eroarea reziduala e(n) este mica in comparatie cu raspunsul dorit si factorul 1/s este unitar (intrarile intarziate sunt utilizate cu aceeasi pondere).

3. IMPLEMENTAREA ALGORITMILOR ADAPTIVI

Rutinele folosite pentru a implementa filtrele adaptive au de regula doua variabile de intrare:

semnalul de intrare;

raspunsul dorit;

si trei de iesire:

iesirea filtrului;

semnalul de eroare;

coeficientii filtrului.

Figura 3.1 Filtru adaptiv general

Structurile de filtre FIR transversale si simetrice necesita folosirea unei linii de intarziere pentru esantioanele de intrare u(n). Esantioanele u(n), u(n-1) … u(n-N+1) sunt stocate intr-un buffer circular in memoria de date in ordine inversa. Coeficientii filtrului w0, w1 … wN-1 sunt memorati intr-un buffer circular din memoria de program in ordine normala. Este de notat ca u(n+1) inlocuieste esantionul u(n-N+1) la momentul n+1; de aceea, indexul bufferului din linia de intarziere trebuie sa indice esantionul u(n-N+1) inainte de urmatoarea iteratie.

3.1 Organigramele generale

Organigrama 1: Implementarea algoritmul RLS

Organigrama 2: Implementarea algoritmul NLMS

Organigrama 3: Implementarea algoritmul LLMS

3.2 Listing-urile programelor

3.2.1 RLS.ASM

/*RLS.ASM realizeaza algoritmul RLS implementat pe o structura de filtru

FIR transversal

********************************************************

* 1) x= s*P(n-1)*u unde s= 1/(factorul de uitare) n=index de timp *

* u= [u(n) u(n-1) … u(n-N+1)] esnatioanele de intrare din * * linia de intarziere, P este o matrice NxN, N=nr. de coeficienti *

* 2) k= x/[1+u*x] k este un vectior Nx1 *

* 3) P(n)= s*P(n-1) – k*xT , xT este vectorul x transpus *

* 4) e(n)= d(n) – w(N-1).u , e(n)= semnalul de eroare *

* w= [w0 w1 … wN-1]= coeficientii filtrului, *

* d(n)= semnalul dorit la iesire *

* 5) w(n)= w(n-1) + k*e(n) *

********************************************************

Parametrii de intrare:

f0= u(n)= esantioanele de intrare

f9= d(n)= semnalul dorit

Registrele utilizate:

f0, f1, f2, f3, f4, f5, f8, f9, f10, f11, f12, f13, f14

Cicluri de calcul:

rls_alg: 3N**2+9N+20 pe iteratie, rls_init: N**2+3N+25

Rezultatele de iesire:

f13= y(n)= iesirea filtrului

f1= e(n)= semnalul de eroare

i0 -> bufferul de date din DM pentru coeficientii filtrului

Utilizarea memoriei:

pm code= 81 cuvinte, pm data= 2N cuvinte, dm data= N**2+2N cuvinte

*/

#define TAPS 5

#define FORGET_FACT 0.9

#define INIT_FACT 1000.

#include "macros.h"

.GLOBAL rls_init, rls_alg;

.section/DM seg_dmda;

.VAR weights[TAPS];

.VAR Pmatrix[TAPS*TAPS];

.VAR xvector[TAPS];

.section/PM seg_pmda;

.VAR deline_data[TAPS];

.VAR kvector[TAPS];

.section/PM seg_pmco;

rls_init: b0=weights;

l0=TAPS;

b1=Pmatrix;

l1=TAPS*TAPS;

b3=b1;

l3=l1;

b2=xvector;

l2=TAPS;

m0=1;

m2=0;

m3=-3;

b8=deline_data;

l8=TAPS;

b9=kvector;

l9=TAPS;

m8=-1;

m9=1;

m11=3;

f10=2.0;

f14=1.0;

f5=1/FORGET_FACT;

f0=0.0;

f1=INIT_FACT;

lcntr=TAPS, do clear_bufs until lce;

dm(i0,m0)=f0, pm(i8,m9)=f0;

clear_bufs: dm(i2,m0)=f0, pm(i9,m9)=f0;

dm(i1,m0)=f1;

lcntr=TAPS-1, do init_Pmatrix until lce;

lcntr=TAPS, do clear_Pel until lce;

clear_Pel: dm(i1,m0)=f0;

init_Pmatrix: dm(i1,m0)=f1;

rts;

rls_alg: f4=dm(i0,m0), pm(i8,m8)=f0;

// f4=w0(n-1), memoreaza u(n)

f8=f0*f4, f4=dm(i0,m0), f0=pm(i8,m8);

// f8=u(n)*w0(n-1), f4=w1(n-1), f0=u(n-1)

f12=f0*f4, f4=dm(i0,m0), f0=pm(i8,m8);

// f12=u(n-1)*w1(n-1), f4=w2(n-1), f0=u(n-2)

lcntr=TAPS-3, do mac1 until lce;

mac1: f12=f0*f4, f8=f8+f12, f4=dm(i0,m0), f0=pm(i8,m8);

// f12=u(n-i)*wi(n-1), f8=suma de produse,

// f4=wi+1(n-1), f0=u(n-i-1)

f12=f0*f4, f8=f8+f12, f4=dm(i1,m0), f0=pm(i8,m8);

// f12=u(n-N+1)*wN-1(n-1), f4=P0(0,n-1), f0=u(n)

f8=f0*f4, f13=f8+f12, f4=dm(i1,m0), f0=pm(i8,m8);

// f13=y(n), f8= u(n)*P0(0,n-1), f4=P0(1,n-1), f0=u(n-1)

f12=f0*f4, f1=f9-f13, f4=dm(i1,m0), f0=pm(i8,m8);

// f1=e(n), f12=u(n-1)*P0(1,n-1), f4=P0(2,n-1),f0=u(n-2)

lcntr=TAPS, do compute_xn until lce;

lcntr=TAPS-3, do mac2 until lce;

mac2: f12=f0*f4, f8=f8+f12, f4=dm(i1,m0), f0=pm(i8,m8);

// f12=u(n-i)*Pk(i,n-1), f8=suma de produse,

// f4=Pk(i+1,n-1), f0=u(n-i-1)

f12=f0*f4, f8=f8+f12, f4=dm(i1,m0), f0=pm(i8,m8);

// f12=u(n-N+1)*Pk(N-1,n-1), f4=Pk+1(0,n-1), f0=u(n)

f8=f0*f4, f2=f8+f12, f4=dm(i1,m0), f0=pm(i8,m8);

// f2=xk(n),f8=u(n)*Pk+1(0,n-1),f4=Pk+1(1,n-1),

// f0=u(n-1)

f12=f0*f4, f4=dm(i1,m0), f0=pm(i8,m8);

// f12=u(n-1)*Pk+1(1,n-1), f4=Pk+1(2,n-1), f0=u(n-2)

compute_xn: dm(i2,m0)=f2; // memoreaza xk(n)

f4=dm(i1,m3), f0=pm(i8,m11); // i1 -> P0(0,n-1), i8 -> u(n)

f4=dm(i2,m0), f0=pm(i8,m8); // f4= x0(n), f0= u(n)

f8=f0*f4, f4=dm(i2,m0), f0=pm(i8,m8);

// f8=x0(n)*u(n), f4=x1(n), f0=u(n-1)

f12=f0*f4, f8=f8+f14, f4=dm(i2,m0), f0=pm(i8,m8);

//f12=x1(n)*u(n-1), f8=1+x0(n)*u(n), f4=x2(n),f0=u(n-2)

lcntr=TAPS-3, do mac3 until lce;

mac3: f12=f0*f4, f8=f8+f12, f4=dm(i2,m0), f0=pm(i8,m8);

//f12=xi(n)*u(n-i), f8=1+suma de produse, f4=xi+1(n),

//f0=u(n-i-1)

f12=f0*f4, f8=f8+f12, f4=f14; // f12=u(n-N+1)*xN-1(n), f4=1.

f12=f8+f12, f3=dm(i2,m0); // f12=1+u.x, f3= x0(n)

DIVIDE(f2,f4,f12,f10,f0); // f2=1/(1+u.x)

f0=f2*f3, modify(i8,m9); // f0=k0(n),

// i8 -> u(n+1) locatia din linia de intarziere

lcntr=TAPS-1, do comp_kn_wn until lce;

f8=f0*f1, f12=dm(i0,m2), pm(i9,m9)=f0;

// f8= ki(n)*e(n), f12=wi(n-1), memoreaza ki(n)

f8=f8+f12, f3=dm(i2,m0); // f8=wi(n), f3=xi+1(n)

comp_kn_wn: f0=f2*f3, dm(i0,m0)=f8; // f0=ki+1(n) memoreaza wi(n)

f8=f0*f1, f12=dm(i0,m2), pm(i9,m9)=f0;

// f8=kN-1(n)*e(n), f12=wN-1(n-1), memoreaza kN-1(n)

f11=f8+f12, f2=dm(i2,m0), f4=pm(i9,m9);

// f11= wN-1(n), f2= x0(n), f4= k0(n)

f12=f2*f4, f8=dm(i1,m0), f4=pm(i9,m9);

// f12= x0(n)*k0(n), f8=P0(0,n-1), f4= k1(n)

lcntr=TAPS-1, do update_Pn until lce;

f12=f2*f4, f0=f8-f12, f8=dm(i1,m0);

lcntr=TAPS-2, do update_Prow until lce;

f3=f0*f5, f0=f8-f12, f8=dm(i1,m0), f4=pm(i9,m9);

update_Prow: f12=f2*f4, dm(i3,m0)=f3;

f3=f0*f5, f0=f8-f12, f2=dm(i2,m0);

f0=f0*f5, dm(i3,m0)=f3, f4=pm(i9,m9);

f12=f2*f4, dm(i3,m0)=f0, f4=pm(i9,m9);

update_Pn: f8=dm(i1,m0);

f12=f2*f4, f0=f8-f12, f8=dm(i1,m0);

lcntr=TAPS-2, do update_Plastrow until lce;

f3=f0*f5, f0=f8-f12, f8=dm(i1,m0), f4=pm(i9,m9);

update_Plastrow: f12=f2*f4, dm(i3,m0)=f3;

f3=f0*f5, f0=f8-f12, dm(i0,m0)=f11;

rts(db);

f0=f0*f5, dm(i3,m0)=f3;

dm(i3,m0)=f0;

3.2.2 TESTAFA.ASM folosit pentru implementarea RLS

/* TESTAFA.ASM Acest program este un mediu de testare pentru algoritmii filtrelor adaptive cum sunt RLS sau LMS si variantele lui. ****************************************************** * Acest program genereaza o secventa de esantioane reale *

* si simuleaza folosirea unui filtru adaptiv pentru o aplicatie *

* de Identificare de Sistem folosind un filtru FIR cu o *

* structura transversala. Modelul de generare este descris *

* de urmatoarea ecuatie: *

* y(n)= x(n-1)-0.5x(n-2)-x(n-3) *

* unde impulsul de raspuns este 0, 1, -0.5, -1, 0, 0, … . *

* Filtrul are cinci coeficienti pe linia de intarziere. Secventa *

* de intrare va fi un zgomot introdus dintr-un fisier de date. *

* Semnalul de eroare la iesire este stocat in buferul de date numit *

* [flt_err] pentru a putea realiza o comparare intre diversi algoritmi*

******************************************************

*/

#include “def21160.h”

#define SAMPLES 200

.EXTERN rls_init, rls_alg;

.section/DM seg_dmda;

.VAR flt_err[SAMPLES];

.VAR input_data[200] /*= 0.038, -0.901, 0.01, -0.125, -1.275, 0.877, -0.881,

0.930, 1.233, -1.022, 1.522, -0.170, 1.489, -1.469,

1.068, -0.258, 0.989, -2.891, -0.841, -0.355;*/

.GLOBAL flt_err;

.section/PM seg_pmda;

.VAR plant_hn[3]= -1.0, -0.5, 1.0;

.section/PM seg_rth;

nop;nop;nop;nop;nop;

dmwait=0x21;

pmwait=0x21;

jump begin;

.section/PM seg_pmco;

begin: b6=flt_err;

l6=0;

b7=input_data;

l7=200;

b15=plant_hn;

l15=3;

m15=1;

m7=1;

m6=-3;

bit set MODE1 CBUFEN; // valideaza bufferele circulare

call rls_init;

lcntr=SAMPLES, do adapt_filter until lce;

// se genereaza date prin plant_hn

f0=dm(i7,m7), f4=pm(i15,m15); // f0= x(n-3), f4= -1.0

f8=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f8= -x(n-3), f0= x(n-2), f4= -0.5

f12=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f12= -0.5x(n-2), f0= x(n-1), f4= 1.0

f12=f0*f4, f8=f8+f12, f0=dm(i7,m7);

// f12= x(n-1), f8= -x(n-3)-0.5x(n-2), f0= x(n)= u(n)

f9=f8+f12, modify(i7,m6);

// f9= y(n)= d(n), i7 -> x(n-3) pentru iteratia urmatoare

call rls_alg;

dm(i6,m7)=f1; // memoreaza eroarea

nop;

adapt_filter: nop;

idle;

3.2.3 MACROS.H

Acest program este folosit pentru toate cele trei implementari software realizate in proiectele VisualDSP (RLS, NLMS si LLMS). In continuare va fi listata din programul macros.h singura subrutina folosita in proiect si anume DIVIDE:

/*

DIVIDE – Divide Macro

Register Usage:

q = f0-f15 Quotient

n = f4-f7 Numerator

d = f12-f15 Denominator

two = f8-f11 must have 2.0 pre-stored

tmp = f0-f3

Indirectly affected registers:

ASTAT,STKY

Looping: none

Special Cases:

q may be any register, all others must be distinct.

*/

#define DIVIDE(q,n,d,two,tmp)

n=RECIPS d, tmp=n; //Get 8 bit seed R0=1/D

d=n*d; //D(prime) = D*R0

tmp=tmp*n, n=two-d; //N=2-D(prime), TMP=N*R0

d=n*d; //D=D(prime)=D(prime)*R1

tmp=tmp*n, n=two-d; //TMP=N*R0*R1, N=R2=2-D(prime)

d=n*d; //D=D(prime)=D(prime)*R2

tmp=tmp*n, n=two-d; //TMP=N*R0*R1*R2, N=R3=2-D(prime) q=tmp*n

Fisierul care specifica arhitectura procesorului ADSP-21160_ASM.LDF este continut in pachetul de programe VisualDSP++ 3.5 cu ajutorul caruia a fost elaborat proiectul si este acelasi pentru fiecare algoritm adaptiv implementat.

3.2.4 NLMS.ASM

/* NLMS.ASM Realizeaza algoritmul NLMS implementat pe o structura de filtru FIR transversal

********************************************************

* 1) y(n)= w*u unde y(n)= iesirea filtrului FIR *

* w= [w0(n) w1(n) … wN-1(n)]= coeficinetii filtrului *

* u=[ u(n) u(n-1) … u(n-N+1)]= esantioane de intrare * * n= index de timp, N=numarul de coeficienti ai filtrului *

* 2) e(n)= d(n)-y(n), e(n)= eroarea & d(n)= semanlul dorit *

* 3) wi(n+1)= wi(n)+normalized_stepsize*e(n)*u(n-i), 0 =<i<= N-1*

* 4) normalized_stepsize= ALPHA/(GAMMA+E(n)) *

* unde E(n)= u*u = energia din linia de intarziere *

* E(n) este calculat recursiv dupa relatia 5): *

* 5) E(n)= E(n-1)+u(n)**2-u(n-N)**2 * ********************************************************

Parametrii de intrare:

f0= u(n) = semnalul de intrare

f1= d(n) = semnalul dorit

Registrele folosite:

f0, f1, f2, f4, f5, f6, f7, f8, f9, f11, f12, f13, f14

Cicluri de calcul:

nlms_alg: 3N+16 pe iteratie, nlms_init: 14+N

Rezultatele la iesire:

f2= y(n)= semnalul de iesire

f6= e(n)= semnalul de eroare

i8 -> bufferul de date din memorie PM pentru coeficientii filtrului

Utilizarea memoriei:

pm code= 32 cuvinte, pm data= N cuvinte, dm data= N cuvinte

*/

#define TAPS 5

#define ALPHA 0.1

#define GAMMA 0.1

#include "macros.h"

.GLOBAL nlms_init, nlms_alg;

.section/DM seg_dmda;

.VAR deline_data[TAPS];

.section/PM seg_pmda;

.VAR weights[TAPS];

.section/PM seg_pmco;

nlms_init: b0=deline_data;

m0=-1;

l0=TAPS; // bufer de intarziere circular

b8=weights;

b9=weights;

m8=1;

l8=TAPS; // buffer circular pentru coeficienti

l9=TAPS;

f5=ALPHA;

f11=GAMMA; // f11= E(0)= GAMMA

f9= 2.0; // f9= 2.0 pentru DIVIDE_ macro

f13=0.0;

lcntr=TAPS, do clear_bufs until lce;

clear_bufs: dm(i0,m0)=f13, pm(i8,m8)=f13;

// sterge linia de intarziere si coeficientii

rts;

nlms_alg: f14=f0*f0, dm(i0,m0)=f0, f4=pm(i8,m8);

//f14= u(n)**2, memoreaza u(n) in linia de intarziere, f4= w0(n)

f8=f0*f4, f11=f11+f14, f0=dm(i0,m0), f4=pm(i8,m8);

// f11= E(n-1)+u(n)**2, f8=u(n)*w0(n)

f12=f0*f4, f11=f11-f13, f0=dm(i0,m0), f4=pm(i8,m8);

// f12= u(n-1)*w1(n), f11= E(n), f0= u(n-2), f4= w2(n)

lcntr=TAPS-3, do macs until lce;

macs: f12=f0*f4, f8=f8+f12, f0=dm(i0,m0), f4=pm(i8,m8);

//f12= u(n-i)*wi(n), f8= suma de produse, f0= u(n-i-1), f4= wi+1(n)

f12=f0*f4, f8=f8+f12, f14=f11;

//f12= u(n-N+1)*wN-1(n),f14= E(n)

f2=f8+f12; // f2= y(n)

f6=f1-f2, f4=dm(i0,m0); // f6= e(n), f4= u(n)

f7=f6*f5; // f7= ALPHA*e(n)

DIVIDE(f1,f7,f14,f9,f0); // f1= normalized_stepsize*e(n)

f0=f1*f4, f12=pm(i8,m8); // f0= f1*u(n), f12= w0(n)

lcntr=TAPS-1, do update_weights until lce;

f8=f0+f12, f4=dm(i0,m0), f12=pm(i8,m8); // f8= wi(n+1)

// f4= u(n-i-1), f12= wi+1(n)

update_weights: f0=f1*f4, pm(i9,m8)=f8;

// f0=normalized_stepsize*e(n)*u(n-i-1) memoreaza wi(n+1)

rts(db);

f8=f0+f12, f0=dm(i0,1); // f8= wN-1(n+1)

// i0 -> u(n+1) locatia din linia de intarziere

f13=f4*f4, pm(i9,m8)=f8;

// f13= u(n-N)**2,memoreaza wN-1(n+1)

3.2.5 TESTAFA.ASM folosit pentru implementarea NLMS

/* TESTAFA.ASM Acest program este un mediu de testare pentru algoritmii filtrelor adaptive cum sunt RLS sau LMS si variantele lui. ****************************************************** * Acest program genereaza o secventa de esantioane reale *

* si simuleaza folosirea unui filtru adaptiv pentru o aplicatie *

* de Identificare de Sistem folosind un filtru FIR cu o *

* structura transversala. Modelul de generare este descris *

* de urmatoarea ecuatie: *

* y(n)= x(n-1)-0.5x(n-2)-x(n-3) *

* unde impulsul de raspuns este 0, 1, -0.5, -1, 0, 0, … . *

* Filtrul are cinci coeficienti pe linia de intarziere. Secventa *

* de intrare va fi un zgomot introdus dintr-un fisier de date. *

* Semnalul de eroare la iesire este stocat in buferul de date numit *

* [flt_err] pentru a putea realiza o comparare intre diversi algoritmi*

******************************************************

*/

#include “def21160.h”

#define SAMPLES 1000

.EXTERN nlms_init, nlms_alg;

.section/DM seg_dmda;

.VAR flt_err[SAMPLES];

.VAR input_data[1000];

.GLOBAL flt_err;

.section/PM seg_pmda;

.VAR plant_hn[3]= -1.0, -0.5, 1.0;

.section/PM seg_rth;

nop;nop;nop;nop;nop;

dmwait=0x21;

pmwait=0x21;

jump begin;

.section/PM seg_pmco;

begin: b6=flt_err;

l6=0;

b7=input_data;

l7=1000;

b15=plant_hn;

l15=3;

m15=1;

m7=1;

m6=-3;

bit set MODE1 CBUFEN; // valideaza bufferele circulare

call nlms_init;

lcntr=SAMPLES, do adapt_filter until lce;

// se genereaza date prin plant_hn

f0=dm(i7,m7), f4=pm(i15,m15); // f0= x(n-3), f4= -1.0

f8=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f8= -x(n-3), f0= x(n-2), f4= -0.5

f12=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f12= -0.5x(n-2), f0= x(n-1), f4= 1.0

f12=f0*f4, f8=f8+f12, f0=dm(i7,m7);

// f12= x(n-1), f8= -x(n-3)-0.5x(n-2), f0= x(n)= u(n)

f1=f8+f12, modify(i7,m6);

// f1= y(n)= d(n), i7 -> x(n-3) pentru iteratia urmatoare

call nlms_alg;

dm(i6,m7)=f6; // memoreaza eroarea

nop;

adapt_filter: nop;

idle;

3.2.6 LLMS.ASM

/* LLMS.ASM Realizeaza algoritmul LLMS implementat pe o structura de filtru FIR transversal

*************************************************************

* 1) y(n)= w*u , y(n)= iesirea filtrului FIR *

* w= [w0(n) w1(n) … wN-1(n)]= coeficientii filtrului *

* u= [u(n) u(n-1) … u(n-N+1)]= esantioane de intrare *

* n= index de timp, N= nr de coeficienti ai filtrului *

* 2) e(n)= d(n)-y(n), e(n)= eroarea & d(n)= semnalul dorit *

* 3) wi(n+1)= LEAK_COEF*wi(n)+STEPSIZE*e(n)*u(n-i), 0 =<i<= N-1 *

*************************************************************

Parametrii de intrare:

f0= u(n)= esantioanele de intrare

f1= d(n)= semnalul dorit

Registrele utilizate:

f0, f1, f2, f4, f6, f7, f8, f9, f12, f13

Cicluri de calcul:

llms_alg: 3N+8 pe iteratie, llms_init: 13+N

Rezultatele de iesire:

f13= y(n)= iesirea filtrului

f6= e(n)= semnalul de eroare

i8 -> bufferul de date din PM pentru coeficientii filtrului

Utilizarea memoriei:

pm code= 30 cuvinte, pm data= N cuvinte, dm data= N cuvinte

*/

#define TAPS 5

#define STEPSIZE 0.045

#define LEAK_COEF 0.9995

.GLOBAL llms_init, llms_alg;

.section/DM seg_dmda;

.VAR deline_data[TAPS];

.section/PM seg_pmda;

.VAR weights[TAPS];

.section/PM seg_pmco;

llms_init: b0=deline_data;

m0=-1;

l0=TAPS; // bufer de intarziere circular

b8=weights;

b9=b8;

m8=1;

l8=TAPS; // buffer circular pentru coeficienti

l9=l8;

f7=STEPSIZE;

f2=LEAK_COEF;

f0=0.0;

lcntr=TAPS, do clear_bufs until lce;

clear_bufs: dm(i0,m0)=f0, pm(i8,m8)=f0;

// sterge linia de intarziere si coeficientii

rts;

llms_alg: f9= pass f1, dm(i0,m0)=f0, f4=pm(i8,m8);

// memoreaza u(n) in linia de intarziere, f4= w0(n), f9= d(n)

f8=f0*f4, f0=dm(i0,m0), f4=pm(i8,m8);

// f8= u(n)*w0(n), f0= u(n-1), f4= w1(n)

f12=f0*f4, f0=dm(i0,m0), f4=pm(i8,m8);

// f12= u(n-1)*w1(n), f0= u(n-2), f4= w2(n)

lcntr=TAPS-3, do macs until lce;

macs: f12=f0*f4, f8=f8+f12, f0=dm(i0,m0), f4=pm(i8,m8);

// f12= u(n-i)*wi(n), f8= suma de produse,

// f0= u(n-i-1), f4= wi+1(n)

f12=f0*f4, f8=f8+f12; // f12=u(n-N+1)*wN-1(n)

f13=f8+f12, f4=pm(i8,m8); // f13= y(n), f4= w0(n)

f12=f2*f4, f6=f9-f13, f4=dm(i0,m0);

// f12= LEAK_COEF*w0(n) f6= e(n), f4= u(n)

f0=f6*f7; // f0= STEPSIZE*e(n)

f9=f0*f4, f4=dm(i0,m0);

// f9= STEPSIZE*e(n)*u(n),f4= u(n-1)

lcntr=TAPS-1, do update_weights until lce;

f9=f0*f4, f8=f9+f12, f4=dm(i0,m0), f12=pm(i8,m8);

// f9=STEPSIZE*e(n)*u(n-i-1), f8=wi(n+1),

// f4=u(n-i-2),f12=wi+1(n)

update_weights: f12=f2*f12, pm(i9,m8)=f8;

// f12= LEAK_COEF*wi+1(n) memoreaza wi(n+1)

rts(db);

f8=f9+f12, f0=dm(i0,2); // f8= wN-1(n+1)

// i0 -> u(n+1) locatia din linia de intarziere

pm(i9,m8)=f8; // memoreaza wN-1(n+1)

3.2.7 TESTAFA.ASM folosit pentru implementarea LLMS

/* TESTAFA.ASM Acest program este un mediu de testare pentru algoritmii filtrelor adaptive cum sunt RLS sau LMS si variantele lui. ****************************************************** * Acest program genereaza o secventa de esantioane reale *

* si simuleaza folosirea unui filtru adaptiv pentru o aplicatie *

* de Identificare de Sistem folosind un filtru FIR cu o *

* structura transversala. Modelul de generare este descris *

* de urmatoarea ecuatie: *

* y(n)= x(n-1)-0.5x(n-2)-x(n-3) *

* unde impulsul de raspuns este 0, 1, -0.5, -1, 0, 0, … . *

* Filtrul are cinci coeficienti pe linia de intarziere. Secventa *

* de intrare va fi un zgomot introdus dintr-un fisier de date. *

* Semnalul de eroare la iesire este stocat in buferul de date numit *

* [flt_err] pentru a putea realiza o comparare intre diversi algoritmi*

******************************************************

*/

#include “def21160.h”

#define SAMPLES 1000

.EXTERN llms_init, llms_alg;

.section/DM seg_dmda;

.VAR flt_err[SAMPLES];

.VAR input_data[1000];

.GLOBAL flt_err;

.section/PM seg_pmda;

.VAR plant_hn[3]= -1.0, -0.5, 1.0;

.section/PM seg_rth;

nop;nop;nop;nop;nop;

dmwait=0x21;

pmwait=0x21;

jump begin;

.section/PM seg_pmco;

begin: b6=flt_err;

l6=0;

b7=input_data;

l7=1000;

b15=plant_hn;

l15=3;

m15=1;

m7=1;

m6=-3;

bit set MODE1 CBUFEN; // valideaza bufferele circulare

call llms_init;

lcntr=SAMPLES, do adapt_filter until lce;

// se genereaza date prin plant_hn

f0=dm(i7,m7), f4=pm(i15,m15); // f0= x(n-3), f4= -1.0

f8=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f8= -x(n-3), f0= x(n-2), f4= -0.5

f12=f0*f4, f0=dm(i7,m7), f4=pm(i15,m15);

// f12= -0.5x(n-2), f0= x(n-1), f4= 1.0

f12=f0*f4, f8=f8+f12, f0=dm(i7,m7);

// f12= x(n-1), f8= -x(n-3)-0.5x(n-2), f0= x(n)= u(n)

f1=f8+f12, modify(i7,m6);

// f1= y(n)= d(n), i7 -> x(n-3) pentru iteratia urmatoare

call llms_alg;

dm(i6,m7)=f6; // memoreaza eroarea

nop;

adapt_filter: nop;

idle;

4. MEDIUL DE DEZVOLTARE VisualDSP

VisualDSP este un mediu de dezvoltare care permite proiectarea si simularea diferitelor aplicatii folosind procesoare digitale de semnal. Pentru a incepe o noua sesiune de lucru, se procedeaza ca in figura 4.1:

alegand optiunea New Session din meniul Session. Pe ecran va fi afisat un meniu (figura 4.2) cu optiuni pentru a alege procesorul digital de semnal cu care se va lucra in continuare si simulatorul corespunzator pentru familia de procesoare din care acesta face parte:

Vom alege simulatorul corespunzator pentru familia ADSP-2116x si procesorul digital de semnal ADSP-21160.

Programele prezentate in capitolul 3.2 vor fi organizate sub forma unui proiect VisualDSP, iar pentru aceasta vom proceda asa cum este prezentat in continuare, incepand cu figura 4.3, alegand optiunea New din meniul Project:

Daca proiectul exista deja, se va alege optiunea Open dupa care numele proiectului din fereastra care tocmai a aparut pe ecran, similara cu cea prezentata in figura 4.4 pentru salvarea unui nou proiect:

In mod similar vor fi adaugate si fisierul linker ADSP-21160_ASM.ldf , care specifica arhitectura procesorului folosit, in directorul Linker Files si fisierul header MACROS.h in directorul Header Files astfel incat fereastra proiect va arata ca in figura 4.9:

Fisierele nou adaugate pot fi deschise intr-o fereastra separata, pentru a fi vizualizate sau modificate. Acest lucru se realizeaza ca in figura 4.10.

optiuni va fi afisata (figura 4.13), din care vom putea selecta bufferul (adresa acestuia) unde vor fi introduse datele, memoria in care se gaseste acesta, numarul de esantioane pe care vor fi luate in considerare si calea unde se gaseste fisierul de date din care va fi citita aceasta informatie. Formatul datelor este pe 32 de biti in virgula mobila, drept pentru care vom alege ca in figura 4.14:

Inainte de a porni executarea proiectului, se poate introduce optional prin apasarea tastei F9 in dreptul liniei de program dorite, un break point care sa opreasca executia programului in momentul in care acesta a terminat de calculat coeficientii filtrului prin algoritmul adaptiv corespunzator, ca in figura 4.15.

Atat semnalele de intrare cat si cele de iesire (erorile etc) pot fi vizualizate grafic utilizand o fereastra specializata. Aceasta se deschide urmand pasii prezentati in figura 4.17 si anume View > Debug Windows > Plot > New :

O fereastra pentru afisarea graficelor trebuie mai intai configurata. Pe un astfel de grafic se pot afisa mai multe curbe simultan, care sa reprezinte semnalele stocate in diferite locatii de memorie (in memoria program PM, in memoria de date DM, intr-o memorie externa etc). In figura 4.18 este prezentata fereastra de configurare a graficelor. Fiecare noua curba care se vrea a fi afisata trebuie introdusa in setul de date prin butonul Add. Inainte de a aduga o noua curba trebuie aleasa zona de memorie, vectorul care va fi afisat (in campul Address), numarul de puncte (Count) si tipul datelor (Data): char, short, long, float, double etc. In exemplul nostru vom

Datele utilizate la afisarea graficelor pot fi exportate din VisualDSP cu ajutorul comenzii Dump din meniul Memory (figura 4.19):

In figurile 4.21÷4.29 sunt prezentate grafice rezultate in urma compilari si executarii celor trei proiecte corespunzatoare implementarilor algoritmilor RLS, NLMS si LLMS. Pentru fiecare algoritm sunt ilustrate grafic semnalul de intrare (200 de esantioane pentru RLS si 1000 esantioane pentru NLMS si LLS), eroarea reziduala luata pe 200 esantioane la RLS si 1000 esantioane la NLMS si LLMS si pentru o vizualizare mai buna, aceeasi eroare reziduala luata pe 50 de esantioane pentru algoritmul RLS si pe 250 esantioane pentru algoritmii NLMS si LLMS. Aceste reprezentari grafice sunt prezentate mai in detaliu in capitolul urmator, realizarea lor fiind posibila cu ajutorul fisierelor de date ce contin eroarea reziduala ce au fost exportate pentru fiecare algoritm adaptiv separat.

Figura 4.21 Semnalul de intrare considerat pentru algoritmul RLS

Figura 4.22 Eroarea reziduala pentru algoritmul RLS (200 esantioane)

Figura 4.23 Eroarea reziduala pentru algoritmul RLS (50 esantioane)

Figura 4.24 Semnalul de intrare considerat pentru algoritmul NLMS

Figura 4.25 Eroarea reziduala pentru algoritmul NLMS (1000 esantioane)

Figura 4.26 Eroarea reziduala pentru algoritmul NLMS (250 esantioane)

Figura 4.27 Semnalul de intrare considerat pentru algoritmul LLMS

Figura 4.28 Eroarea reziduala pentru algoritmul LLMS (1000 esantioane)

Figura 4.29 Eroarea reziduala pentru algoritmul LLMS (250 esantioane)

5. REZULTATELE SIMULARILOR

Tabelul 5.1

Timpii de executie masurati cu ajutorul VisualDSP sunt:

Tabelul 5.2

Tinand cont ca un ciclu de procesare dureaza 15ns vom avea:

Tabelul 5.3

Graficele din figurile 5.1.a, 5.1.b, 5.2.a, 5.2.b, 5.3.a si 5.3.b prezinta eroarea reziduala pentru algoritmii RLS, NLMS si respectiv LLMS precum si timpii de convergenta calculati la 10% din valoarea maxima a erorii pentru NLMS si LLMS si la 5% pentru RLS:

Figura 5.1.a Eroarea reziduala si timpul de convergenta pentru algoritmul RLS

Figura 5.1.b Eroarea reziduala si timpul de convergenta pentru algoritmul RLS

Figura 5.2.a Eroarea reziduala si timpul de convergenta pentru algoritmul NLMS

Figura 5.2.b Eroarea reziduala si timpul de convergenta pentru algoritmul NLMS

Figura 5.3.a Eroarea reziduala si timpul de convergenta pentru algoritmul LLMS

Figura 5.3.b Eroarea reziduala si timpul de convergenta pentru algoritmul LLMS

Tinand cont de rezultatele obtinute, putem afirma ca algoritmul RLS este mai performant decat NLMS sau LLMS din punctul de vedere al timpului de convergenta si al erorii reziduale, dar acest lucru obtinandu-se cu pretul unui timp de executie mai mare decat la ceilalti algoritmi adaptivi studiati datorat volumului mult mai mare de calcule necesare.

Deoarece timpii de calcul obtinuti sunt mai mici decat perioada de 125μs dintre doua esantioane (pentru o esantioanare a semnalului de intrare cu o frecventa de 8kHz), algoritmii RLS, NLMS si LLMS pot fi implementati in timp real cu ajutorul procesorului ADSP-21160.

Bibliografie:

Procesoare digitale de semnal. Aplicatii, Sorin Zoican, editura Matrix Romania Bucuresti 2002, ISBN 973-685-422-1;

ADSP-21160 SHARC® DSP Hardware Reference, Revision 3.0, November 2003, Part Number 82-001966-01, Analog Devices, Inc.

ADSP-21160 EZ-KIT LITE™ Evaluation System Manual, Edition: Release 3.0, January 2003, Part Number 82-000513-01, Analog Devices, Inc.;

ADSP-21160 SHARC® DSP Instruction Set Reference, Revision 2.0, November 2003, Part Number 82-001967-01, Analog Devices, Inc.

www.analog.com

Similar Posts