28.3 Arhitectura procesorului de semnal digital

Unul dintre cele mai mari blocaje în executarea algoritmilor DSP este transferul de informații către și de la memorie. Acesta include date, cum ar fi eșantioane din semnalul de intrare și coeficienții de filtrare, precum și instrucțiuni de program, coduri binare care intră în secvențiatorul programului. De exemplu, să presupunem că trebuie să multiplicăm două numere care se află undeva în memorie. Pentru a face acest lucru, trebuie să preluăm trei valori binare din memorie, numerele care trebuie multiplicate, plus instrucțiunea programului care descrie ce trebuie făcut.

Figura 28-4a arată cum se face această sarcină, aparent simplă, într-un microprocesor tradițional. Aceasta este numită arhitectură von Neumann, după strălucitul matematician american John Von Neumann (1903-1957). Von Neumann a ghidat matematica multor descoperiri importante de la începutul secolului al XX-lea. Multele sale realizări includ: dezvoltarea conceptului de computer cu program stocat, formalizarea matematicii mecanicii cuantice și lucrul la bomba atomică. Dacă era ceva nou și interesant, Von Neumann era acolo!

După cum se arată în (a), o arhitectură Von Neumann conține o singură memorie și o singură magistrală pentru transferul datelor în și din unitatea centrală de procesare (CPU). Înmulțirea a două numere necesită cel puțin trei cicluri de ceas, unul pentru a transfera fiecare dintre cele trei numere pe magistrală din memorie către CPU. Nu contorizăm timpul pentru a transfera rezultatul înapoi în memorie, deoarece presupunem că rămâne în CPU pentru manipulare suplimentară (cum ar fi suma produselor dintr-un filtru FIR). Modelul Von Neumann este destul de satisfăcător când sunteți mulțumit să executați toate sarcinile necesare în serie. De fapt, majoritatea computerelor de astăzi sunt de model Von Neumann. Avem nevoie doar de alte arhitecturi când este necesară o procesare foarte rapidă și suntem dispuși să plătim prețul unei complexități sporite.

Aceasta ne conduce la arhitectura Harvard, prezentată în (b). Acest lucru este numit pentru munca făcută la Universitatea Harvard în anii 1940, sub conducerea lui Howard Aiken (1900-1973). După cum se arată în această ilustrație, Aiken a insistat asupra memoriei separate pentru date și instrucțiuni de program, cu magistrale separate pentru fiecare. Deoarece magistralele operează independent, instrucțiunile de program și datele pot fi preluate în același timp, îmbunătățind viteza față de modelul cu o singură magistrală. Cele mai multe DSP-uri din prezent utilizează această arhitectură dual bus.

Figura (c) ilustrează următorul nivel de sofisticare, Arhitectura Super Harvard. Acest termen a fost inventat de Analog Devices pentru a descrie funcționarea internă a ADSP-2106x și a noilor familii ADSP-211xx de procesoare de semnal digital. Acestea se numesc SHARC® DSP-uri, o contracție a termenului mai lung, Super Harvard ARChitecture. Ideea este de a construi pe arhitectura Harvard prin adăugarea de caracteristici pentru îmbunătățirea capacității de producție. În timp ce DSP-urile SHARC sunt optimizate în zeci de moduri, două domenii sunt suficient de importante pentru a fi incluse în figura 28-4c: o memorie cache de instrucțiuni și un controler I/O.

În primul rând, să examinăm modul în care cache-ul de instrucțiuni îmbunătățește performanța arhitecturii Harvard. Un handicap al modelului de bază Harvard este că magistrala memoriei de date este mai ocupată decât magistrala memoriei de program. Atunci când se înmulțesc două numere, două valori binare (numerele) trebuie să fie transmise pe magistrala memoriei de date, în timp ce o singură valoare binară (instrucțiunea programului) este transmisă pe magistrala memoriei de program. Pentru a îmbunătăți această situație, începem prin relocarea părții de "date" în memoria programului. De exemplu, am putea plasa coeficienții de filtrare în memoria programului, păstrând în același timp semnalul de intrare în memoria de date. (Aceste date mutate se numesc "date secundare" în ilustrație). La prima vedere, acest lucru nu pare să ajute situația; acum trebuie să transferăm o valoare pe magistrala memoriei de date (eșantionul semnalului de intrare), dar două valori pe magistrala memoriei de program (instrucțiunea programului și coeficientul). De fapt, dacă executam instrucțiuni aleatorii, această situație nu ar fi deloc mai bună.

Dar, algoritmii DSP petrec, în general, cea mai mare parte a timpului lor de execuție în bucle, cum ar fi instrucțiunile 6-12 din Tabelul 28-1. Aceasta înseamnă că același set de instrucțiuni de program va trece continuu din memoria programului către CPU. Arhitectura Super Harvard profită de această situație prin includerea unui cache de instrucțiuni în CPU. Aceasta este o mică memorie care conține aproximativ 32 din cele mai recente instrucțiuni de program. Prima dată printr-o buclă, instrucțiunile de program trebuie să fie transmise pe magistrala de memorie program. Acest lucru duce la o operare mai lentă din cauza conflictului cu coeficienții care trebuie, de asemenea, să fie extrași de-a lungul acestei căi. Dar, la execuțiile suplimentare ale buclei, instrucțiunile programului pot fi extrase din cache-ul de instrucțiuni. Aceasta înseamnă că transferurile de informație memorie către CPU pot fi realizate într-un singur ciclu: eșantionul de la semnalul de intrare vine pe magistrala memoriei de date, coeficientul vine pe magistrala memoriei program și instrucțiunea programului vine din cache-ul de instrucțiuni. În jargonul domeniului, acest transfer eficient de date se numește o lățime de bandă mare de acces-la-memorie.

Figura 28-5 prezintă o vedere mai detaliată a arhitecturii SHARC, prezentând controlerul I/O conectat la memoria de date. Acesta este modul în care semnalele intră și ies din sistem. De exemplu, DSP-urile SHARC oferă atât porturi de comunicații seriale, cât și paralele. Acestea sunt conexiuni de extrem de mare viteză. De exemplu, la o viteză de tact de 40 MHz, există două porturi seriale care operează la 40 Mb/sec fiecare, în timp ce șase porturi paralele oferă câte un transfer de date de 40 Mbytes/secundă. Când toate cele șase porturi paralele sunt utilizate împreună, rata de transfer de date este un incredibil 240 Mbytes/secundă.

Acest lucru este suficient de rapid pentru a transfera întregul text al acestei cărți în numai 2 milisecunde! La fel de important, hardware-ul dedicat permite ca aceste fluxuri de date să fie transferate direct în memorie (Direct Memory Access, sau DMA), fără a trebui să treacă prin registrele CPU. Cu alte cuvinte, sarcinile 1 și 14 de pe lista noastră se desfășoară independent și simultan cu alte sarcini; nici un ciclu nu este sustras din CPU. Magistralele principale (magistrala de memorie program și magistrala de memorie de date) sunt de asemenea accesibile din afara cip-ului, oferind o interfață suplimentară pentru memoria off-chip și periferice. Acest lucru permite DSP-urilor SHARC să utilizeze o memorie de patru Gigaword (16 GByte), accesibilă la 40 Mwords/secundă (160 Mbytes/secundă), pentru date de 32 biți. Wow!

Acest tip de intrări/ieșiri (I/O) de mare viteză este o caracteristică cheie a DSP-urilor. Obiectivul prioritar este de a muta datele în, de a efectua matematica și de a muta datele afară înainte ca eșantionul următor să fie disponibil. Totul este secundar. Unele DSP-uri au convertoare analogic- digitale și digital-analogice on-bord, o caracteristică numită semnal mixt. Dar, toate DSP-urile pot interfața cu convertoare externe prin porturi seriale sau paralele.

Acum, să ne uităm în interiorul CPU. În partea de sus a diagramei sunt două blocuri etichetate Generator de adrese de date (DAG), unul pentru fiecare dintre cele două memorii. Acestea controlează adresele trimise către program și memoriile de date, specificând unde trebuie citite sau scrise informațiile. În microprocesoarele mai simple, această sarcină este tratată ca o parte inerentă a secvențiatorului de programe și este destul de transparentă pentru programator. Dar, DSP-urile sunt concepute să opereze cu buffere circulare și să beneficieze de hardware-ul suplimentar pentru a le gestiona eficient. Acest lucru evită necesitatea utilizării unor cicluri de tact prețioase ale CPU pentru a urmări cum sunt stocate datele. De exemplu, în DSP-urile SHARC, fiecare dintre cele două DAG-uri poate controla opt buffere circulare. Aceasta înseamnă că fiecare DAG deține 32 de variabile (4 per buffer), plus logica necesară.

De ce atât de multe buffere circulare? Unii algoritmi DSP sunt cel mai bine efectuați în etaje. De exemplu, filtrele IIR sunt mai stabile dacă sunt implementate ca o cascadă de biquad-uri (un etaj care conține doi poli și până la două zerouri). Mai multe etaje necesită buffere circulare multiple pentru o funcționare cât mai rapidă. DAG-urile din DSP-urile SHARC sunt de asemenea concepute pentru a efectua eficient transformata Fast Fourier. În acest mod, DAG-urile sunt configurate pentru a genera adrese reversibile de biți în buffer-ele circulare, o parte necesară a algoritmului FFT. În plus, o abundență de buffere circulare simplifică foarte mult generarea de coduri DSP - atât pentru programatorul uman, cât și pentru compilatoarele de limbaj de nivel înalt, cum ar fi C.

Secțiunea de registru a datelor din CPU este utilizată în același mod ca și în microprocesoarele tradiționale. În DSP-urile ADSP-2106x SHARC, există 16 registre de uz general de 40 biți fiecare. Acestea pot să conțină calcule intermediare, să pregătească date pentru procesorul matematic, să servească ca buffer pentru transferul de date, să dețină indicatori pentru controlul programului și așa mai departe. Dacă este necesar, aceste registre pot fi utilizate și pentru a controla buclele și contoarele; totuși, DSP-urile SHARC au registre hardware suplimentare pentru a îndeplini multe din aceste funcții.

Procesarea matematică este împărțită în trei secțiuni, un multiplicator, o unitate logică aritmetică (ALU) și un barrel shifter. Multiplicatorul ia valorile din două registre, le multiplică și plasează rezultatul într-un alt registru. ALU efectuează adunare, scădere, valoare absolută, operațiuni logice (AND, OR, XOR, NOT), conversie între formate de virgulă fixă și virgulă mobilă și funcții similare. Operațiile binare elementare sunt efectuate de barrel shifter cum ar fi schimbarea, rotirea, extragerea și depozitarea segmentelor și așa mai departe. O caracteristică puternică a familiei SHARC este aceea că multiplicatorul și ALU pot fi accesate în paralel. Într-un singur ciclu de tact, datele din registrele 0-7 pot fi transmise multiplicatorului, datele din registrele 8-15 pot fi transmise către ALU, iar cele două rezultate reîntoarse la oricare dintre cele 16 registre.

Figura 28-5 Arhitectură DSP tipică.

Procesoarele de semnal digital sunt destinate pentru implementarea sarcinilor în paralel. Această diagramă simplificată este a lui Analog Devices SHARC DSP. Comparați această arhitectură cu sarcinile necesare pentru a implementa un filtru FIR, cum este listat în tabelul 28-1. Toți pașii din buclă pot fi executați într-un singur ciclu de tact.

Există, de asemenea, multe caracteristici importante ale arhitecturii familiei SHARC care nu sunt prezentate în această ilustrare simplificată. De exemplu, un acumulator de 80 biți este încorporat în multiplicator pentru a reduce eroarea de rotunjire asociată mai multor operațiuni matematice cu virgulă fixă. O altă interesantă caracteristică este utilizarea registrelor umbră (shadow registers) pentru toate registrele cheie ale CPU. Acestea sunt registre duplicate care pot fi comutate cu omologii lor într-un singur ciclu de tact. Ele sunt folosite pentru comutarea rapidă a contextului, capacitatea de a gestiona rapid întreruperile. Când apare o întrerupere în microprocesoarele tradiționale, toate datele interne trebuie să fie salvate înainte ca întreruperea să poată fi gestionată. Aceasta implică, de obicei, adăugarea tuturor registrelor ocupate pe stivă, unul câte unul. În comparație, o întrerupere în familia SHARC este tratată prin mutarea datelor interne în registrele umbră într-un singur ciclu de tact. Când rutina de întrerupere este finalizată, registrele sunt restaurate la fel de repede. Această caracteristică permite ca pasul 4 din lista noastră (gestionarea întreruperii pregătirii eșantionului) să fie tratată foarte rapid și eficient.

Acum ajungem la performanța critică a arhitecturii, câte operațiuni din cadrul buclei (pașii 6-12 din Tabelul 28-1) pot fi efectuate în același timp. Datorită naturii extrem de paralele, SHARC DSP poate realiza simultan toate aceste sarcini. În mod specific, într-un singur ciclu de tact, poate efectua o multiplicare (pasul 11), o adunare (pasul 12), două mișcări de date (pașii 7 și 9), actualizarea a două indicatoare de buffer circular (pașii 8 și 10) și controlul buclei (pasul 6). Vor exista cicluri suplimentare de tact asociate cu începutul și încheierea buclei (pașii 3, 4, 5 și 13, plus valorile inițiale de mișcare); totuși, aceste sarcini sunt, de asemenea, tratate foarte eficient. Dacă bucla este executată mai mult de câteva ori, această cheltuială va fi neglijabilă. De exemplu, să presupunem că scrieți un program eficient de filtrare FIR utilizând 100 de coeficienți. Vă puteți aștepta ca acesta să necesite circa 105 până la 110 cicluri de tact pe fiecare eșantion pentru a executa (adică, 100 bucle de coeficienți, plus cheltuieli generale). Acest lucru este foarte impresionant; un microprocesor tradițional necesită multe mii de cicluri de tact pentru acest algoritm.

Secțiunea următoare: Virgulă fixă versus mobilă