Sunteți pe pagina 1din 76

Capitolul 7

Setul de instructiuni

Setul de instructiuni al unui procesor este un factor cheie care determina nu numai ce
operatii sunt posibile, dar si ce operatii sunt naturale si eficiente. Instructiunile controleaza modul in
care datele circula pe calea de date a procesorului, modul in care sunt citite si scrise in memorie, si
asa mai departe. De aici rezulta ca setul de instructiuni al unui procesor are o influenta determinanta
asupra sarcinilor la care un procesor este potrivit.
In acest capitol sunt trecute in revista diverse aspecte ale setului de instructiuni. Vom vedea
diferite tipuri de instructiuni (si, in stransa relatie, tipurile de registri) intalnite la procesoarele DSP
si vom analiza suportul setului de instructiuni pentru deplasarea datelor in paralel cu operatiile
aritmetice si de multiplicare. Vom analiza ortogonalitatea setului de instructiuni si usurinta in
programare si vom incheia prin examinarea executiei conditionate si a instructiunilor cu functii
speciale.

7.1 Tipuri de instructiuni


In paragrafele urmatoare sunt prezentate tipurile de instructiuni (pentru transferul datelor,
aritmetice, logice, de salt, etc.) existente pe circuitele programabile DSP. Este de retinut ca un
procesor cu un set de instructiuni mai bogat nu inseamna neaparat un procesor mai capabil. Intr-
adevar, instructiunile specializate pot fi si un dezavantaj, deoarece necesita o suprafata de siliciu
mai mare si pot sa nu fie folosite in aplicatia dorita. Aceasta sectiune va evidentia si ce tipuri de
instructiuni sunt utile intr-o anumita aplicatie.

 Instructiuni aritmetice
Dupa cum a fost evidentiat anterior, instructiunile de adunare, multiplicare si multiplicare cu
acumulare sunt operatii absolut necesare in aplicatii DSP. Majoritatea procesoarelor pun la
dispozitie un set bogat de instructiuni aritmetice (adunare, scadere, incrementare, decrementare,
negare, rotunjire, valoare absoluta) si multiplicare. Cu exceptia procesoarelor Texas Instruments -
TMS320C1x, toate procesoarele moderne implementeaza instructiuni de multiplicare cu acumulare.
De obicei aceste instructiuni se executa intr-un singur ciclu de instructiune.
Unele procesoare (cum ar fi PineDSPCore si OakDSPCore - DSP Group sau TMS320C5x -
Texas Instruments) ofera instructiuni de ridicare la patrat. Instructiunile de multiplicare de pe aceste
procesoare utilizeaza de obicei date din memorie adresate indirect drept operanzi. Alte procesoare
care utilizeaza regiștri pentru operatia de multiplicare nu necesita instructiuni speciale pentru
ridicarea la patrat. De exemplu la DSP5600x (Motorola) operatia de ridicare la patrat se
implementeaza printr-o instructiune „MPY X0,X0,A”.
1
Unele procesoare au instructiuni pentru aritmetica cu precizie extinsa. De exemplu,
instructiuni de inmultire a valorilor cu semn si fara semn sunt disponibile la D950-CORE (SGS-
Thomson), TMS320C54x (TI) si ZR3800x (Zoran). Multe procesoare executa adunarea cu transport
si scaderea cu imprumut, ambele fiind extrem de importante pentru aritmetica cu precizie extinsa.

 Operatii logice
Majoritatea procesoarelor DSP ofera instructiuni pentru efectuarea operatiilor logice,
incluzand operatiile logice SI, SAU, SAU-EXCUSIV si NEGARE. Acestea sunt utile in corectii de
erori si in aplicatiile cu procesare a deciziilor care sunt din ce in ce mai intalnite la DSP-uri. De
remarcat faptul ca procesoarele pot avea si instuctiuni de manipulare a bitilor (sau a campurilor de
biti), care vor fi discutate in continuare.

 Deplasari
Operatiile de deplasare sunt de doua categorii: aritmetice si logice. O deplasare logica spre
stanga cu un bit insereaza un zero in pozitia celui mai putin semnificativ bit, in timp ce o deplasare
logica spre dreapta cu un bit insereaza un zero in pozitia celui mai semnificativ bit. Pe de alta parte,
o deplasare aritmetica la dreapta copiaza bitul de semn (un unu sau un zero, in functie de semnul
numarului) in cel mai semnificativ bit. Chiar daca se utilizeaza termenul „deplasare aritmetica spre
stanga”, deplasarile la stanga aritmetice si logice sunt identice: ambele deplaseaza cuvantul la
stanga si insereaza un zero in pozitia celui mai putin semnificativ bit.
Deplasarile aritmetice ofera o modalitate de a scala datele fara a utiliza instructiunea de
multiplicare a procesorului. Scalarea este deosebit de utila pentru procesoarele cu virgula fixa unde
este necesara o scalare corespunzatoare pentru a obtine rezultate precise la efectuarea operatiilor
matematice. De asemenea operatia de deplasare pote fi privita si ca o inmultire cu o data care este o
putere a lui 2.
Practic toate DSP-urile pun la dispozitie instructiuni de deplasare in diverse variante. Unele
procesoare ofera doar un set minim, respectiv instructiuni pentru efectuarea deplasarilor aritmetice
spre stanga si spre dreapta cu un bit. Alte procesoare pot oferi in plus instructiuni de deplasare cu
doi sau patru biti. Acestea se pot combina cu deplasarile cu un singur bit pentru a forma deplasari
cu n biti, dar cu mai multe cicluri de instructiune.
Din ce in ce mai multe procesoare DSP pun la dispozitie un registru de deplasare reversibil
si instuctiuni care il utilizeaza pentru a realiza deplasari aritmetice sau logice cu orice numar de biti
(denumite barell shifter). Exemplele includ DSP16xx (AT&T), ADSP-21xx si ADSP-210xx
(Analog Devices), OakDSPCore (DSP Group), DSP563xx (Motorola), D950-CORE (SGS-
Thomson) si TMS320C5x si TMS320C54x (Texas Instruments).

2
 Rotatii
Rotatia poate fi considerata drept o deplasare circulara: o deplasare in care bitii de la un
capat sunt deplasati la celalalt capat. De exemplu, la o rotatie spre stanga cu un bit, bitul cel mai
semnificativ este dus pe pozitia bitului cel mai putin semnificativ, iar ceilalti biti sunt deplasati cate
o pozitie la stanga. Rotatia este utila in diverse cazuri, cum ar fi la codarea cu corectie a erorilor
(care foloseste „intreteserea bitilor”). De asemenea operatia mai poate fi utilizata la generarea
adreselor cu bitii inversati de catre procesoarele care nu accepta operatia de inversare a bitilor
implementata in unitatea de generare a adreselor.
Majoritatea procesoarelor au instructiuni pentru rotirea unui cuvant la stanga sau la dreapta
cu un bit. Exceptiile includ DSP16xx (AT&T), PD7701x (NEC), Z893xx (Zilog) si ZR3800x
(Zoran).

 Comparatii
Multe procesoare pun la dispozitie un set de biti de stare care dau informatii despre
rezultatele operatiilor aritmetice. De exemplu, bitii de stare includ un bit de zero (setat daca
rezultatul ultimei operatii aritmetice a fost zero), un bit de minus (setat daca rezultatul ultimei
operatii aritmetice a fost negativ), un bit de depasire si asa mai departe. Acesti biti de stare sunt
setati ca rezultat al unei operatii aritmetice si pot fi apoi utilizati in salturi conditionate sau in
instuctiuni cu executie conditionata (discutate mai jos).
Intr-o instructiune in care se iau decizii un procesor poate avea nevoie sa compare rapid o
serie de valori cunoscute cu o data dintr-un registru. O modalitate de a face acest lucru este de a
scadea valoarile ce urmeaza a fi comparate din valoarea de referinta pentru a seta bitii de stare. La
unele procesoare aceasta operatie modifica valoarea referintei in timp ce pe altele rezultatul ei poate
fi stocat intr-un alt registru. La procesoarele cu puțini regiștri (incluzand majoritatea procesoarelor
DSP in virgula fixa), nici una dintre acestea nu poate fi o solutie. Drept alternativa, unele
procesoare ofera instructiuni de comparare a valorilor care efectueaza aceasta scadere fara a
modifica valoarea referinta si fara a utiliza un alt registru pentru stocarea rezultatului. O
imbunatatire interesanta a operatiei normale de comparare este compararea in valoare absoluta care
permite determinarea rapida a incadrarii unei valori intr-un domeniu.

 Executarea buclelor
Majoritatea aplicatilor DSP necesita executarea repetata a unui numar mic de operatii
aritmetice sau de multiplicare. Deoarece numarul de instructiuni dintr-o bucla este de obicei mic,
instructiunile de decrementare a unui contor, de testare a acestuia si de salt la inceputul buclei pot
adauga o cantitate relativ mare de operatii suplimentare. Astfe, practic toate procesoarele DSP ofera
instructiuni de efectuare a buclelor implementate hardware. Aceste instructiuni permit repetarea
3
unei instructiuni sau a unui bloc de instructiuni fara a adauga operatiile suplimentare ale secventei
de decrementare, test sau de salt de la sfarsitul buclei.
Facilitatiile buclelor hardware sunt discutate detaliat in Capitolul 8.

 Salturi, apeluri de subrutine si reveniri


Toate procesoarele ofera variante de instructiuni de salt, si majoritatea pun la dispozitie
instructiuni de salt in subrutine si de revenire. Formele suportate de diverse procesoare includ:
- Conditionat/neconditionat. Un salt neconditionat se executa la adresa specificata
mereu, in timp ce un salt conditionat se executa doar daca o anumita conditie (sau conditii, la unele
procesoare) este indeplinita.
- Intarziat/multiciclu. Un salt multiciclu necesita cateva cicluri de instructiune pentru a
fi executat, in acest timp procesorul nu poate efectua o alta operatie. Un salt intarziat permite
procesorului sa execute un numar de instructiuni aflate imediat dupa instructiunea de salt inainte de
a efectua saltul la adresa destinatie. Aceasta reduce numarul de cicluri de instructiune necesare
executarii saltului. Salturile intarziate sunt discutate in detaliu in Capitolul 8.
- Salt intarziat cu anulare. Familia de TMS320C4x (Texas Instruments) ofera un salt
intarziat conditionat pentru care instructiunile aflate dupa instructiunea de salt si care se executa
inaintea saltului pot fi executate conditionat in functie de executia sau neexecutia saltului.
- Relativ la PC. Un salt relativ la PC sare la o locatie determintata de un offset relativ
la locatia instructiunii curente. Acest aspect este important in aplicatiile ce necesita cod independent
de pozitia ocupata in memorie, adica programe ce pot fi rulate indiferent la adresa de la care sunt
incarcate. Acest tip de salturi este discutat in Capitolul 8.

 Instructiuni cu executie conditionata


Instructiunile cu executie conditionata permit programatorului sa specifice faptul ca o
instructiune va fi executata numai daca o anumita conditie este indeplinita. Executia conditionata
poate fi foarte utila in implementarea codului care trebuie sa ia o cantitate mare de decizii, deoarece
elibereaza programatorul de sarcina de a folosi instructiuni de salt pentru executia unei simple
instructiuni parte a unei constructii de tip if-then-else. Executia conditionata este deosebit de utila
pe procesoare cu un pipeline cu multe etaje deoarece evita golirea pipeline-ului pe care o implica un
salt.
Unele procesoare implementeaza executia conditionata doar cu unele instructiuni. De
exemplu, majoritatea instructiunilor de pe familiile ADSP-21xx si ADSP-210xx (Analog Devices)
permit specificarea de catre programator a conditiilor in care se executa. Alte procesoare, cum ar fi
DSP16xx (AT&T) si PineDSPCore (DSP Group), pun la dispozitie mult mai putine instructiuni cu
executie conditionata. De obicei, aceste instructiuni sunt cele ce modifica acumulatorul, cum ar fi
4
incrementarea, decrementarea, deplasarea, rotunjirea etc. Deoarece codurile de conditie sunt
incorporate in codul instructiunii, nu exista o penalizare in timp de executie la folosirea
instructiunilor conditionate.
In contrast, TMS320C5x si TMS320C54x (TI) au o instructiune speciala de executie
conditionata, XC. Daca conditia specificata drept argument pentru XC este adevarata, urmatoarea
instructiune sau urmatoarele doua instructiuni de lungime un cuvant (sau urmatoarea instructiune de
doua cuvinte) se executa. Instructiunea XC necesita un ciclu pentru executie, dar pune la dispozitie
un mod mai general de executie conditionata.

 Instructiuni cu functii speciale


Exista o varietate de instructiuni specializate disponibile pe anumite DSPuri. Urmatoarele
reprezinta cazurile cel mai des intalnite:
- Instructiuni pentru virgula mobila pe bloc
Dupa cum a fost discutat in Capitolul 3, operatiile pentru reprezentarea in virgula mobila pe
bloc reprezinta o forma de aritmetica in virgula mobila care este uneori folosita pe procesoarele in
virgula fixa. Exemplele de aplicatii ce folosesc instructiunile pentru virgula mobila pe bloc includ
codarea vorbirii si unele implementari ale transformatei Fourier rapida.
Acest tip de instructiuni utilizeaza masiv doua operatii: detectia exponentului si
normalizarea. Detectia exponentului determina numarul de biti de semn redundanti intr-o valoare.
Normalizarea consta dintr-o operatie de detectie a exponentului urmata de o deplasare stanga care
scaleaza datele astfel incat sa nu contina biti de semn redundanti. Detectia exponentului este uneori
folosita separat de normalizare pentru a determina exponentul maxim intr-un bloc de numere. Dupa
ce exponentul maxim a fost gasit, se poate efectua o deplasare stanga cu acel numar de biti asupra
fiecarui numar din bloc pentru a le scala pe toate la acelasi exponent. Pentru detalii referitor la
aritmetica in virgula flotanta, revedeti Capitloul 3.
Procesoarele DSP care suporta detectia exponentului si normalizarea se impart in trei
categorii de baza:
a) Detectia exponetului in bloc. Detectia exponentului in bloc se foloseste
(de obicei intr-o bucla hardware) pentru a determina exponentul maxim intr-un bloc de date.
Aceasta instructiune este foarte utila la manipularea tablourilor de date in virgula flotanta. ADSP-
21xx (Analog Devices) si ZR3800x (Zoran) sunt singurele procesoare DSP care poseda instructiuni
de detectie a exponentului in bloc.
b) Detectia exponentului. Multe procesoare ofera instructiuni care pot calcula
exponentul unei valori intr-un singur ciclu instructiune. Procesoarele cu astfel de instructiuni includ
ADSP-21xx (Analog Devices), OakDSPCore (DSP Group), PD7701x (NEC), D950-CORE (SGS-
Thomson), TMS320C54x (Texas Instruments) si ZR3800x (Zoran).
5
c) Normalizarea. Multe procesoare executa de asemenea normalizarea (detectia
exponentului combinata cu deplasarea), dar forma acestei operatii variaza de la procesor la
procesor. Procesoarele DSP16xx (AT&T) (in afara DSP1602 si DSP1605) sunt singurele
procesoare care pun la dispozitie o instructiune de normalizare intr-un singur ciclu. Majoritatea
procesoarelor ce efectueaza detectia exponentului intr-un singur ciclu pot executa dupa aceasta o
instructiune de deplasare rezultand o operatie de normalizare executata in doua cicluri. In fine, alte
procesoare, cum ar fi PineDSPCore (DSP Group), DSP5600x si DSP561xx (Motorola),
TMS320C2x si TMS320C5x (TI), pun la dispozitie instructiuni de normalizare iterative. Aceste
instructiuni normalizeaza un numar de n biti in n cicluri instructiune. Aceste instructiuni de obicei
calculeaza si exponentul valorii respective si il stocheaza intr-un registru.

- Instructiuni de manipulare a bitilor


Instructiunile de manipulare a bitilor sunt utile atat in procesul de luare a deciziilor, cat si in
corectia erorilor. Acestea se pot imparti in doua categorii: instructiuni de manipulare a unui singur
bit si instructiuni de manipulare multibit (sau al campurilor de biti).
Instructiunile de manipulare a unui singur bit includ setarea bitului, resetarea bitului,
inversarea bitului si testarea bitului. Familia DSP5600x (Motorola), este una din primele care a
introdus instructiuni pentru aceste operatii, chiar daca aceste se executa in doua cicluri.
Procesoarele Motorola ofera instructiuni de salt in functie de valoarea unui bit, utile in aplicatiile de
control.
Instructiunile de manipulare a campurilor de biti opereaza pe mai multi biti odata. De
exemplu, TMS320C5x (TI) are instructiuni care folosesc unitatea sa logica paralela pentru a executa
operatii logice (SI, SAU, negare, SAU-EXCLUSIV) asupra unei locatii de memorie specificata. In
mod similar familia DSP561xx (Motorola) are instructiuni de testare, setare, resetare a campurilor
de biti.
Procesoarele DSP16xx (AT&T) au o unitate speciala de manipulare a bitilor care pune la
dispozitie instructiuni de extragere si inlocuire (inserare, in exprimarea AT&T). Prima instructiune
extrage un numar de biti consecutivi de la o pozitie specificata dintr-un cuvant si ii depune aliniati
la dreapta intr-un registru. A doua instructiune ia un numar specificat de biti, aliniati la dreapta,
aflati intr-un registru si ii insereaza la o anumita pozitie in cuvantul destinatie. Aceste instructiuni
sunt foarte utile la „procesarea protocoalelor” in aplicatii de comunicatii.

- Alte instructiuni cu functii speciale


Exista o mare varietate de alte instructiuni cu functii speciale, dintre care o parte vor fi
enumerate in continuare.

6
Unele procesoare pun la dispozitie instructiuni de impartire iterativa care calculeaza doar un
bit al rezultatului la fiecare executie.
ADSP-210xx (Analog Devices) si TMS320C4x (TI) ofera o instructiune de aflare a valorii
aproximative a radacinii patrate, care poate fi folosita ca o baza la aflarea mai exacta a valorii
radacinii patrate a unui numar.
Multe procesoare pun la dispozitie instructiuni specializate de implementare a operatiilor cu
stive, push si pop fiind cele mai intalnite instructiuni.
Instructiunile de activare si dezactivare a intreruperilor sunt utilizate de unele procesoare
pentru controlul intreruperilor.

7.2 Regiștri
Registrii principali dintr-un procesor sunt strans legate de setul sau de instructiuni, deoarece
instructiunile folosesc deseori registri drept operanzi sursa sau destinatie, sau le folosesc pentru a
genera adrese pentru operanzii lor sursa sau destinatie. In paragrafele ce urmeaza vom trece in
revista tipurile de registri ce se gasesc pe DSP-urile programabile si functiile acestora. La fel ca in
cazul altor facilitati ale procesoarelor, un numar mare de registri face programarea mai usoara, dar
mareste dimensiunea instructiunilor si a pastilei de siliciu a procesorului, rezultand un chip mai
scump.
 Regiștri acumulatori
Fiecare procesor DSP de pe piata are cel putin un registru acumulator, cu toate ca la anumite
procesoare poate avea alta denumire. Un registru acumulator este cel putin suficient de larg pentru a
cuprinde cel mai mare rezultat aflat pe calea de date, produs de ALU sau de multiplicator. Unele
procesoare, cum ar fi TMS320C1x, TMS320C2x si TMS320C5x (TI) au un singur acumulator.
Altele, ca DSP16xx (AT&T), PineDSPCore si OakDSPCore (DSP Group), DSP5600x si DSP561xx
(Motorola) si TMS320C54x (TI) au doua sau mai multi registri acumulatori, ceea ce simplifica
codarea algoritmilor ce folosesc numere complexe. Unele procesoare ce opereaza in virgula mobila
au numar mare de registri cu precizie extinsa, din care o parte se pot folosi drept registri
acumulatori.
 Regiștri de uz general si special
Unele procesoare, cum ar fi ADSP-210xx (Analog Devices), DSP32xx (AT&T), PD7701x
(NEC), TMS320C3x si TMS320C4x (TI), si ZR3800x (Zoran), pun la dispozitie un grup de registri
de uz general. De obicei acestea se pot utiliza ca operanzi pentru majoritatea operatiilor aritmetice si
de multiplicare.
La polul opus se gasesc procesoarele ce au registri dedicati anumitor unitati de executie din
cadrul procesorului. De exemplu, la familia ADSP-21xx (Analog Devices), ALU, multiplicatorul si
unitatea de deplasare au fiecare propriile registri dedicati de intrare si iesire. Multe DSPuri, cum ar
7
fi DSP16xx (AT&T), Z893xx (Zilog) si PineDSPCore (DSP Group) au registri dedicati de iesire a
unitatii de multiplicare.
La unele procesoare registrii de intrare/iesire a unitatii de executie pot servi de asemenea
drept registri de uz general. De exemplu, DSP5600x (Motorola) foloseste registri X0, X1, Y0, Y1
drept intrari pentru multiplicare, dar si ca intrari pentru ALU sau in alte scopuri. Aceasta abilitate
mareste flexibilitatea procesorului.
Majoritatea programatorilor prefera procesoarele cu registri de uz general ce pot fi folosite
pentru sarcini variate fata de procesoarele cu registri specializati, dedicate unei singure functii de pe
calea de date. Totusi procesoarele cu registri generale au si dezavantaje: implementarea acestor
registri este mai costisitoare.

 Registri pentru adresa


Dupa cum am discutat in Capitolul 6 despre adresare, registrii pentru adresa (si registri
modificatori si de offset asociate) sunt folosite la generarea adreselor in cazul adresarii indirecte
prin registru. Numarul de registri pentru adresa intalnite la procesoare variaza de la 2 (in cazul
Texas Instruments - TMS20Cx1) la 22 (AT&T - DSP32xx).
Multi programatori de DSP-uri reclama faptul ca anumite procesoare au prea putini registri
adresa, in acest caz un numar mai mare de registri este de obicei de preferat.

 Alte regiștri
Alti registri intalnite la DSP-uri includ:
- Pointerul de stiva. De obicei se gaseste la procesoarele ce suporta stive software, un
pointer de stiva este un registru dedicat indicarii varfului curent al stivei.
- Numaratorul de program. Numaratorul de program stocheaza adresa urmatoarei
instructiuni ce urmeaza a fi decodata.
- Registri de bucla. Aceste contin informatii despre buclele hardware, cum ar fi adresa
de start, ce de sfarsit si numarul de repetari.
In majoritatea cazurilor interactiunea programatorului cu acesti registri este mult mai
limitata decat cea cu registrii principali ai procesorului.

7.3 Suportul pentru transfer paralel


Dupa cum am discutat in Capitolul 5, una dintre cele mai importante facilitati a unui DSP
este abilitatea de a efectua accesari multiple la memorie intr-un singur ciclu instructiune. Aceste
accesari ale memoriei se numesc deseori operatii de transfer paralel deoarece au loc deseori in
paralel cu o intructiune aritmetica sau de multiplicare.

8
Instructiunile pentru transfer paralel utilizate de DSP-uri pot sa aiba doua forme, dupa cum
datele deplasate sunt sau nu in relatie directa cu operanzii instructiunii care se refera la ALU sau la
multiplictor.
Setul de instructiuni de pe PineDSPCore (DSP Group) este tipic pentru operatia de transfer
paralel in relatie directa cu operanzii. La acest procesor, doar instructiunile care au operanzi din
surse multiple pot efectua accesari multiple de date din memorie intr-un ciclu instructiune si accesul
este limitat la datele necesare unei operatii aritmetice sau de multiplicare. De exemplu, o
instructiune de inmultire poate fi:
MPY (R0), (R4)
Aceasta instructiune ia continutul locatiilor de memorie la care indica R0 si R4, inmulteste aceste
valori si depune rezultatul in registrul produs. De remarcat ca pentru a obtine operanzii instructiunii
MPY sunt executate doua accesari la memorie.
In contrast, un exemplu de transfer paralel care nu este in relatie directa cu operanzii este
prezenta la familia DSP5600x (Motorola). La acest procesor, operatiile ALU si de multiplicare iau
operanzii din registri ce au fost in prealabil incarcate cu valori de intrare si depun rezultatul in
registri acumulatoari. In paralel cu o instructiune ALU sau de multiplicare, DSP5600x poate accesa
(pentru scriere sau citire) doua locatii de memorie care pot sa nu se afle in relatie directa cu
operanzii instructiunii. O posibila instructiune de inmultire pe DSP5600x:
MPY X0, Y0, A X:(R0)+,X0 Y1,Y:(R4)+
Aceasta instructiune inmulteste X0 cu Y0 si depune rezultatul in acumulatorul A. In paralel
incarca continutul locatiei din blocul de memorie X indicat de R0 in X0, si stocheaza Y1 in blocum
de memorie Y indicata de R4.
Transferul paralel care nu este in relatie directa cu operanzii permite programatorului sa
foloseasca mai eficient latimea de banda a memoriei oferita de procesor. In cazul anterior, daca
instructiunea nu necesita doua accesari ale memoriei, cele doua accesari sunt pierdute, chiar daca
componenta hardware are latimea de banda necesara executarii lor. Transferul paralel care nu este
in relatie directa cu operanzii permite utilizatorului sa utilizeze aceste doua accesari pentru a stoca
rezultate de la instructiunea anterioara sau pentru a incarca date pentru instructiunea urmatoare.
Transferul paralel care nu este in relatie directa cu operanzii este util pentru executia algoritmilor
care necesita acces frecvent, nesecvential, la memorie, cum ar fi transformarea Fourier rapida.
Procesoarele ce pun la dispozitie acest al doilea tip de acces includ DSP16xx (AT&T), toate
procesoarele Analog Devices, toate procesoarele Motorola, PD7701x (NEC), D950-CORE (SGS-
Thomson) si ZR3800x (Zoran). Procesoarele ce folosesc primul tip de acces includ DSP32C si
DSP32xx (AT&T), PineDSPCore si OakDSPCore (DSP Group), TMS320C2x si TMS320C5x (TI),
si familia Z893xx (Zoran). Alte procesoare, cum ar fi TMS320C3x, TMS320C4x si TMS320C54x

9
suporta ambele tipuri de acces pentru instructiuni diferite. TMS320C1x nu ofera transfer paralel de
nici un fel, permitand doar un acces la memorie pe ciclu instructiune.
Cele doua tipuri de transfer paralel sunt corelate cu tipurile de codare in limbaj de
asamblare, stationare temporal si cu stationare in date, discutate in Capitolul 9.

7.4 Ortogonalitatea setului de instructiuni


Ortogonalitatea se refera la consistenta setului de instructiuni al unui procesor. In general, cu
cat setul de instructiuni al uni procesor este mai ortogonal, cu atat este acesta mai usor de
programat, deoarece exista mai putine inconsistente si cazuri speciale pe care programatorul trebuie
sa le retina. Ortogonalitatea este subiectiva si nu poate fi masurata. Acest aspect trebuie avut in
vedere la formulare unei critici a ortogonalitatii unui procesor.
Cei doi parametri ce influenteaza cel mai mult ortogonalitatea setului de instructiuni al unui
procesor sunt consistenta, precum si gradul in care in care modurile de adresare sunt disponibile in
mod uniform pentru diverse operatii. De exemplu, in primul caz, programatorii considera un
procesor ce are o instructiune de adunare, dar nu si una de scadere drept neortogonal. In cel de al
doilea caz, un procesor ce permite adresarea indirecta prin registru pentru instructiunea de adunare,
dar nu si pentru cea de scadere este considerat de asemenea neortogonal.
Procesoarele cu o dimensiune a cuvantului de instructiune mai mare tind sa fie mai
ortogonale decat cele cu o dimensiune a cuvantului de instructiune mai mica. In principiu, acest
lucru se intampla deoarece ortogonalitatea rezulta din codarea independenta a operatiilor si
operatorilor in cuvantul de instructiune. Cu cat sunt disponibili mai multi biti intr-un cuvant
instructiune, cu atat este mai usor de proiectat un procesor ortogonal.
Drept exemplu, se poate considera un procesor ipotetic cu 32 de instructiuni ce suporta trei
operanzi (de exemplu „ADD R0,R1,R2”, care ar putea efectua operatia de adunare intre R0 si R1 si
ar plasa rezultatul in R2). Fiecare operand poate fi unul din cele opt registri (R0-R7). In plus, sa
presupunem ca procesorul suporta doua deplasari de date in paralel cu oricare instructiune, si ca
procesorul are opt registri pentru adresare ce se pot utiliza pentru a genera adrese indirecte prin
registru pentru aceste deplasari. Procesorul poate de asemenea executa actualizarea registrii de
adrese in trei moduri (fara actualizare, cu postincrementare cu unu sau cu postdecrementare cu unu).
Tabelul 7-1 arata repartizarea bitilor pentru codarea instructiunii. Un set de instructiuni
codat in acest mod ar fi destul de ortogonal, deoarece fiecare aspect al setului de instructiuni este
codat independent. Totusi, aceasta modalitate de codare necesita cuvinte de instructiuni de 30 de
biti. Cu toate ca utilizand cuvinte instructiune cu mai multi biti se poate obtine o ortogonalitate mai
mare si care permite programatorului sa controleze mai multe operatii pe instructiune, este insa
necesar un bus si o memorie mai mare, ceea ce mareste costul sistemului. In plus, doar putine
aplicatii vor putea sa exploateze toate posibilitatile si flexibilitatea fiecarei instructiuni. Fiecare

10
instructiune executata care nu utilzeaza toata puterea setului de instructiuni constituie un argument
pentru un set de instructiuni mai mic, mai putin ortogonal, mai greu de programat dar mult mai
eficient din punct de vedere al utilizarii memoriei.

Exista cateva modalitati frecvent folosite pentru a obtine o functionalitate mai mare cu un
set de instructiuni cu latime a cuvantului de instructiune mai mic la procesoarele DSP cu
instructiuni codate cu 16 biti:
- Reducerea numarului de operatii. Executind mai putine operatii se elibereaza biti din
cuvantul de instructiune pentru alte scopuri. De exemplu, DSP16xx (AT&T) nu are instructiuni de
rotatie.
- Reducerea numarului de moduri de adresare. Procesoarele cu lungimi ale cuvantului
instructiune mai mare pun la dispozitie o mare varietate de moduri de adresare disponibile pentru
toate instructiunile. Procesoarele cu o lungime mai mica a cuvantului instructiune au mai putine
moduri de adresare si un numar limitat de moduri de actualizare pentru adresarea indirecta prin
registri. De asemenea pot fi limitate combinatiile valide de operatii si moduri de adresare.
- Restrictii asupra operanzilor sursa/destinatie. Familia DSP561xx (Motorola) este
tipica pentru justificarea acestei solutii. De exemplu, a doua deplasare paralela intr-o instructiune
poate folosi doar un anumit registru (R3) pentru generarea adreselor. Similar, alegerea sursei
operanzilor la o instructiune de multiplicare determina cate scrieri sau citiri paralele sunt permise.
- Utilizarea bitilor de mod. Texas Instruments foloseste aceasta abordare la familiile
TMS320C1x si TMS320C2x, dar mai ales la TMS320C5x. Aceste procesoare folosesc bitii de mod
stocati in registri dedicati pentru a determina partial ce face o instructiune. De exemplu,
TMS320C5x nu are instructiuni separate de deplasare aritmetica si logica. In schimb un bit de
deplasare intr-un registru de control determina daca instructiunea de deplasare este aritmetica sau

11
logica. Similar, instructiunea de deplasare a acumulatorului ia numarul de biti cu care are loc
deplasarea dintr-un registru special si nu dintr-o valoare codata in cuvantul instructiune.
Majoritatea acestor optiuni cresc dificultatea de programare, dar cuvantul instructiune este mai scurt
ceea ce reduce pretul total al procesorului si sistemului.

7.5 Formatul limbajului de asamblare


Exista doua variante principale de limbaj de asamblare pentru procesoare DSP: cel
traditional- opcode-operand si cel asemanator functional limbajului C, sau algebric. In prima
varianta instructiunile sunt codate sub forma de mnemonice (un cod scurt ce indica instructiunea, de
exemplu MPY) impreuna cu operanzii sai, de exemplu:
MPY X0, Y0
ADD P, A
MOV (R0), X0
JMP LOOP
In cealalta varianata, cea a limbajului de asamblare asemanator limbajului C, se foloseste
sintaxa limbajului de nivel inalt si conventiile sale aritmetice. Fragmentul de cod de mai sus se
poate scrie astfel:
P = X0 * Y0
A=P+A
X0 = *R0
GOTO LOOP
Fiecare varianta de scriere are adeptii lui care sustin ca abordarea lor este mai naturala, clara
sau productiva. Un avantaj al sintaxei asemanatoare C-ului este acela ca algoritmii se exprima in
limbaj de asamblare intr-o forma asemanatoare celei matematice. Dezavantajul acestei sintaxe este
faptul ca limbajul de asamblare nu este cod C propriu-zis, oricat de mult ar semana superficial cu
acesta. Drept urmare, programatorii obisnuiti cu limbajul C pot gasi programarea in acest mod
frustranta, deoarece sintaxa poate sugera disponibilitatea unor operatii posibile in C dar imposibile
in limbajul assembler.
In final, trebuie remarcat faptul ca sintaxa limbajului de asamblare folosit la programarea
unui procesor DSP este de fapt nelegata de setul de instructiuni. Astfel, nu exista nici un motiv
pentru care un procesor nu poate avea doua limbaje de asamblare, unul care foloseste metoda
opcode-operands si unul care foloseste sintaxa asemanatoare C. Atata timp cat ambele coduri
genereaza acelasi cod binar, cele doua sintaxe sunt echivalente din punct de vedere al procesorului.

12
Capitolul 8

Mecanisme de control a functionarii procesorului

Controlul functionarii procesorului se refera la regulile sau mecanismele folosite intr-un


procesor pentru determinarea modului de secventiere a instructiunilor unui program. In acest
capitol, sunt analizate cateva din particularitatile transferului controlului executiei care sunt
importante pentru procesoarele DSP. Aceste caracteristici sunt legate de: executia hardware a
buclelor, controlul intreruperilor, mecanismele pentru stiva si suportul pentru salturi relative.
Controlul executiei este strans legat de functionarea pipe-line-ului, care este analizata in detaliu in
Capitolul 9.

8.1 Mecanismele hardware pentru executarea buclelor

Algoritmii DSP implica adesea executia repetata a unui numar mic de instructiuni numite
cicluri interne (kernels). Filtrele FIR si IIR, FFT, inmultirea matricilor si o multime de alte aplicatii
elementare sunt toate realizate prin executarea repetata a unei instructiuni sau a unei secvente de
instructiuni. Procesoarele DSP au evoluat pentru a include caracteristici care sa le permita
manevrarea eficienta a acestor tipuri de activitati repetate. Pentru a intelege aceasta evolutie,
trebuie analizate problemele asociate abordarilor traditionale ale acestor forme de executie repetata
a instructiunilor.
In primul rand, o abordare naturala a ciclului foloseste o instructiune de salt (branch
instruction) pentru a reveni la punctul de inceput a ciclului. Cum este mentionat in Capitolul 7 si
discutat in amanuntime in Capitolul 9, de obicei instructiunile de salt necesita cateva cicluri de tact
pentru fi executate. In special pentru cicluri mici incarcarea buclei (respectiv cresterea timpului de
executie) datorata instructiunilor de salt poate fi considerabila.
In al doilea rand, deorece majoritatea ciclurilor sunt executate de un numar fix de ori,
procesorul trebuie sa foloseasca un registru index pentru a contoriza numarul de instructiuni din
bucla si un registru index pentru a contoriza numarul de parcurgeri a ciclului. Calea de date a
procesorului trebuie folosita pentru a incrementa/decrementa indexul si pentru testarea valorii sale,
pentru a stabili daca au fost executate toate instructiunile si pentru a aduce procesorul la inceputul
buclei. Toate aceste activitati sporesc incarcarea buclei si folosesc in plus registri care ar putea fi
utilizate in alte scopuri.
Procesoarele DSP au evoluat, pentru a evita problemele datorate ciclurilor asistate software,
spre tehnici cunoscute sub numele “zero-overhead looping”. Mecanismele hardware de control a
1
buclelor sunt unitati speciale de control hardware care repeta de un anumit numar de ori o singura
instructiune sau un grup de instructiuni. Principala diferenta intre ciclurile hardware si cele software
este aceea ca ciclurile hardware nu consuma timp pentru incrementarea sau decrementarea
contoarelor si pentru a verifica daca ciclul este incheiat, pentru a reveni la inceputul ciclului. De
exemplu, figurile 8.1 (a) si 8.1 (b) prezinta un filtru FIR implementat in limbaj de ansamblare pe
doua procesoare DSP, unul cu cicluri asistate software si celalalt cu cicluri executate hardware.
Ciclul software necesita in general de trei ori mai mult timp pentru a fi executat, presupunand ca
toate instructiunile sunt executate intr-un singur ciclu de tact. De fapt, instructiunile de salt necesita
cateva cicluri de tact pentru a fi executate, deci avantajul ciclurilor hardware este si mai evident.

Cu exceptia nucleelor DSP CD24xx si CD245x (Clarkspur Design), MDSP2780 (IBM),


TMS 3201x (Texas Instruments), Z893xx (Zilog), toate procesoarele DSP ofera un anumit suport
pentru cicluri hardware. Forma exacta a acestui suport poate varia foarte mult de la un procesor
DSP la altul. Paragrafele urmatoare analizeaza cateva din caracteristicile cele mai importante ale
ciclurilor hardware.

 Cicluri hardware mono si multi-instructiune


Majoritatea procesoarelor DSP ofera doua tipuri de cicluri hardware: cicluri cu o singura
instructiune si cicluri multi-instructiune. Un ciclu hardware mono-instructiune repeta o singura
instructiune de un anumit numar de ori in timp ce un ciclu multi-instructiune repeta un grup de
instructiuni de un anumit numar de ori. Dintre procesoarele care suporta cicluri hardware, toate, in
afara de TMS320C2x (Texas Instruments) si variantele sale , ofera cicluri hardware mono si multi-
instructiune (TMS320C2x executa doar cicluri hardware mono-instructiune). Unele procesoare, ca
de exemplu ADSP21xx (Analog Devices) permit folosirea ciclurilor hardware multi-instructiune
pentru a repeta o singura instructiune.
Procesoarele familiei TMS320C5x ofera suport atit pentru cicluri mono-instructiune cit si
pentru cicluri multi-instructiune. Registrul numarator RPTC poate fi incarcat cu ajutorul
instructiunilor de repetare RPT/RPTZ cu valoarea N (cu valoarea maxima 65.536), pentru a stabili
2
executia de N+1 ori a instructiunii care urmeaza. Pot fi repetate doar anumite instructiuni cum sunt:
instructiunile de multiplicare si acumulare (MAC/MACD), pentru transfer de blocuri
(BLDD/BLPD), pentru transferuri I/O (IN/OUT), pentru citirea/scrierea tablourilor (TBLR/TBLW),
etc. Executarea buclelor multi-instructiune asigura o incarcare zero a buclei pentru implementarea
ciclurilor for si do. Operatia este controlata cu ajutorul a trei registri (PASR, PAER si BRCR) si a
bitului BRAF din registrul PMST. Registrul BRCR este contorul pentru numarul de repetari a
ciclului (maximum 65.535 ori). Instructiunea RPTB (repeat block) incarca in registrul PASR adresa
instructiunii care urmeaza si care reprezinta adresa de inceput a blocului si in registrul PAER adresa
de sfirsit a blocului reprezentata ca un operand lung imediat al instructiunii. Blocul repetat contine
cel putin trei cuvinte instructiune. Executia instructiunii RPTB seteaza automat activ bitul BRAF
(Block Active Repeat Flag).
Deoarece o bucla hardware mono-instructiune executa in mod repetat o singura instructiune,
instructiunea este citita o singura data din memoria pentru program. Pentru executarile ulterioare in
ciclul de repetare, magistrala de program poate fi folosita pentru accesarea memoriei si pentru alte
scopuri decat aducerea unei instructiuni; de exemplu, pentru transferul datelor sau a coeficientilor
stocati in memoria de progam. Cateva procesoare (TMS320C2x si TMS320C5x) folosesc acest
mecanism pentru a castiga in plus posibilitati de acces a memoriei in cadrul ciclului instructiune.
In contrast, pentru un procesor care executa cicluri hardware multi-instructiune, de fiecare
data cand procesorul reia ciclul trebuie sa readuca din memoria de program instructiunile care sunt
repetate. Din aceasta cauza, bus-ul de program al procesorului nu mai poate accesa alte date. O
exceptie o constituie procesorul DSP16xx (AT&T) care poseda un buffer special de 15 cuvinte care
este folosit pentru a retine instructiunile care sunt repetate. La prima iteratie a ciclului, instructiunile
sunt copiate in acest buffer. La trecerile ulterioare prin ciclu, procesorul aduce instructiunile din
buffer-ul de 15 cuvinte, eliberand bus-ul programului pentru accesul datelor.
Majoritatea procesoarelor permit ca un numar arbitrar de instructiuni sa fie repetate intr-un
ciclu hardware multi-instructiune. De exemplu, ciclul hardware al procesorului DSP16xx suporta
maximum 15 instructiuni, iar procesorul DSP32C (AT&T) suporta maximum 32 de instructiuni.
Dupa cum s-a mentionat, majoritatea ciclurilor interne tind sa contina un numar mic de instructiuni,
astfel incit asemenea limitari sunt acceptabile pentru multe aplicatii.

 Contorizarea numarului de repetari a ciclului


O alta caracteristica care diferentiaza posibilitatile de executare a ciclurilor hardware de
catre procesoarele este numarul de minim si maxim de cicluri care pot fi repetate. Aproape toate
procesoarele accepta ca numar minim de repetari o singura repetare, iar limita superioara de 65536
este una obisnuita. Exista si procesoare (DSP16xx - AT&T sau PineDSPCore - DSP Group) care
au limite superioare relativ mici (127 si respectiv 256). Frecvent, numarul maxim cicluri care pot fi

3
repetate este mai scazut daca contorizarea numarului de repetari este specificata folosind datele
imediate (alta solutie ar consta in folosirea unui contor de repetare mapat in memorie).
O varianta a ciclurilor hardware, intalnita la unele procesoare (de exemplu, Motorola-
DSP5600x si Zoran - ZR3800x) este urmatoarea: un ciclu numarat ca zero determina procesorul sa
repete ciclul de un numar maxim de ori. Atata timp cat dimensiunea buclelor este fixa aceasta nu ar
fi o problema; poate fi o problema daca in timpul rularii programul determina dinamic numarul de
repetitii. Daca zero este o numarare posibila a repetitiilor (adica nu se repeta deloc ciclul), un test
conditional si o instructiune de salt trebuiesc plasate inainte de startul ciclului pentru a evita
executia buclei daca numararea executiei ar fi zero.

 Efectele executarii ciclurilor asupra latentei intreruperilor


Pe durata executiei, ciclurile hardware mono-instructiune dezactiveaza intreruperile. In
consecinta, proiectantii de sistem care folosesc atat ciclurile hardware mono-instructiune cat si
intreruperile trebuie sa aiba in vedere timpul maxim de intrerupere pe care il pot accepta si sa
modifice corespunzator codul ciclului mono-instructiune. Alternativele includ folosirea ciclurilor
multi-instructiune asupra unei singure instructiuni si divizarea unui ciclu mono-instructiune intr-un
numar de cicluri mai mici, unul dupa altul, fiecare cu un numar mai mic de repetari.
Trei familii de procesoare DSP ( DSP32C, DSP32xx, DSP16xx - AT&T) dezactiveaza
intreruperile chiar si in timpul executiei ciclurilor hardware multi-instructiune. Programatorii
acestor dispozitive trebuie sa aiba in plus grija sa determine maximul timpului de intrerupere in
aplicatiile lor si sa organizeze ciclurile hardware in functie de aceasta.

 Adancimea de intrepatrundere
Un ciclu imbricat (nested loop) este un ciclu plasat in interiorul altui ciclu. Majoritatea
aplicatiilor care folosesc cicluri hardware au nevoie doar de unul singur. In unele aplicatii,
introducerea unui ciclu in altul poate fi eficienta si convenabila. De exemplu, calculul transformatei
Fourier rapide are nevoie de trei cicluri imbricate.
Cele mai comune abordari pentru executia ciclurilor hardware imbricate sunt:
- Imbricare directa. Unele procesoare, inclusiv toate procesoarele DSP de la
Motorola, Analog Devices si NEC - PD7701x, permit ca ciclurile hardware sa fie imbricate prin
introducerea instructiunilor unui ciclu hardware in interiorul altui ciclu. Adancimea de intre-
patrundere variaza de la trei (NEC - PD7701x) pana la sapte nivele (procesoarele Motorola).
Procesoarele care pot executa cicluri hardware direct imbricate folosesc cite o stiva separata (doar
pentru ciclurile hardware) care contine adresa de inceput a ciclului, adresa de sfarsit si numarul de
repetitii.

4
- Imbricare partiala. Procesoarele care executa cicluri hardware mono si multi-
instructiune permit ca un ciclu mono-instructiune sa fie introdus intr-un ciclu multi-instructiune,
chiar daca ciclurile multi-instructiune nu pot fi imbricate.
- Imbricare software. La procesoarele TMS320C3x si TMS320C5x (TI) ciclurile
hardware pot fi imbricate salvand starea diversilor registri ai ciclului ( startul, sfarsitul ciclului si
indexul ciclului) si apoi executand o noua instructiune din ciclu. In functie de numarul de cicluri
interioare si exterioare, aceasta ar fi o abordare mai buna decat folosirea unei instructiuni de salt
pentru ciclul interior. Reamintim ca o instructiune de ramificare produce o incarcare suplimentara la
fiecare iteratie in timp ce salvarea restaurarea registrilor ciclului trebuie facuta doar odata la fiecare
parcurgere a ciclului.
- Lipsa imbricarii. Exista procesoare DSP (TMS320C2x, DSP16xx, DSP32xx –
AT&T) care nu accepta cicluri hardware imbricate .

 Cicluri hardware asistate software


O alternativa pentru ciclurile hardware imbricate este introducerea unui singur ciclu
hardware in interiorul unuia software care foloseste instructiuni specializate pentru cicluri software.
De exemplu, procesoarele DSP16xx, TMS320C3x si TMS320C4x accepta o instructiune de tip
“decrement-and-branch-if-not-zero“. Chiar daca aceasta instructiune necesita doar un singur ciclu
de tact (la TMS320C3x, TMS320C4x) si trei cicluri instructiune la DSP16xx, numarul de cicli de
tact este mai mic decat cel consumat pentru a executa o decrementare individuala, a testa si a face
un salt.
De multe ori acesta este un compromis rezonabil intre costul hardware-ului necesar pentru a
realiza ciclurile hardware imbricate si costul timpului de executie pentru implementarea numai prin
software a ciclurilor.

8.2. Sistemul de intreruperi

Sistemul de intreruperi permite sincronizarea functionarii procesorului cu evenimente


externe sau interne. O intrerupere este un generata de un eveniment extern/intern care determina
procesorul sa opreasca executia programului curent si sa execute un salt la o subrutina de servire a
evenimentului care a generat-o, denumita subrutina de intreruperi. De exemplu, daca un dispozitiv
periferic doreste initierea unui transfer de date cu sistemul cu microprocesor, el comanda printr-o
cerere de intrerupere suspendarea programului in curs si executarea unei subrutine care, in acest
caz, este programul de executare a transferului de date. Dupa executarea subrutinei de intrerupere
este reluat programul suspendat la primirea cererii de intrerupere. Toate procesoarele DSP poseda

5
un sistem propriu de intreruperi, folosit ca mijloc principal de dialog cu dispozitivele periferice sau
pentru tratarea unor situatii anormale de functionare.
In continuare vor fi analizate aspecte privind functionarea sistemului de intreruperi la
procesoarele DSP.

 Sursele de intreruperi
Intreruperile provin din surse variate, incluzind:
- perifericele incorporate. Majoritatea procesoarelor poseda o varietate de periferice
incorporate (on-chip peripheral) cum ar fi porturi seriale, paralele, timere, etc., care genereaza
intreruperi cand sunt indeplinite anumite conditii.
- Linii de intreruperi externe. Sunt linii de comanda care pot fi utilizate de elementele
externe pentru a comanda o intrerupere.
- Intreruperi software. Numite si exceptii sau capcane (traps), acestea sunt intreruperi
generate sub control software sau datorate unei operatii initiate prin software. Exemplele includ:
capcanele pentru cod ilegal, exceptiile pentru functionarea in virgula mobila (division by zero,
overflow, underflow, etc.) si altele
Atat perifericele incorporate cat si liniile de intrerupere sunt discutate in detaliu in Capitolul
10.

 Vectorii de intrerupere
Fiecarei surse de intrerupere ii este asociat un vector de intrerupere cu ajutorul caruia
microprocesorul stabileste legatura intre sursa intreruperii si subrutina de tratare asociata. Dupa cum
am mentionat mai sus, o intrerupere face ca procesorul sa inceapa executia de la o anumita locatie
de memorie, alta decit cea indicata de valoarea curenta a PC. De fapt, toate procesoarele asociaza o
adresa diferita de memorie cu fiecare intrerupere. Intreruperile vectorizate simplifica programarea
deoarece programatorul nu mai trebuie sa cunoasca care sursa de intreruperi a generat intreruperea;
aceasta informatie este continuta implicit in vectorul de intrerupere. Fara vectorizarea intreruperilor
programatorul trebuie sa verifice fiecare sursa posibila de intrerupere pentru a vedea cine a generat
respectiva intrerupere, crescand timpul de raspuns la intrerupere.
Vectorii de intrerupere tipici au o lungime de unul sau doua cuvinte si sunt localizati in zona
inferioara de memorie (low memory). Locatia accesata cu vectorul de intrerupere contine de obicei
un salt sau o instructiune de apel a unei subrutine care poate fi plasata oriunde in memoria de
program. La unele procesoare locatiile corespunzatoare vectorilor de intrerupere sunt distantate la
cateva cuvinte. Aceasta permite ca scurte rutine de intreruperi sa fie localizate direct la adresa
indicata de vectorul de intrerupere, eliminand instructiunile de salt si de revenire. La alte

6
procesoare, locatia indicata de vectorul de intrerupere nu contine de fapt o instructiune; ea contine
doar adresa rutinei de intrerupere.

 Activarea intreruperilor
Toate procesoarele ofera mecanisme pentru activarea/dezactivarea globala a intreruperilor.
Pe anumite procesoare aceasta s-ar putea face prin instructiuni de speciale de activare sau
dezactivare, in timp ce pe altele ar implica scrierea intr-un registru special de control. Majoritatea
procesoarelor permit activarea individuala a intreruperilor pentru fiecare sursa de intreruperi.

 Prioritatea intreruperilor si intreruperi imbricate automat


Procesoarele cu mai multe surse de intrerupere folosesc conceptul de priorizare a
intreruperilor. Definitia data prioritatatii este similara la toti furnizorii: daca doua intreruperi apar
simultan (in acelasi ciclu de ceas), cea cu prioritate mai mare va fi executata, iar cea cu prioritate
mai mica trebuie sa astepte ca procesorul sa incheie executarea intreruperii cu prioritata mai mare.
Conform acestei definitii prioritatile intreruperilor sunt folosite pentru a arbitra intreruperile
simultane. Ele nu sunt folosite pentru a permite unei intreruperi mai importante sa intrerupa
realizarea unei intreruperi mai putin importanta. Cand procesorul permite unei intreruperi cu
prioritate mai mare sa intrerupa executia unei intreruperi cu prioritate mai mica numim aceasta
operatie imbricare automata a intreruperilor. Majoritatea DSP-urilor nu accepta intreruperi
imbricate automat; procesoarele de la Analog Devices si Motorola sunt exceptii. La unele
procesoare, o rutina de intrerupere poate reactiva explicit intreruperi pentru a permite altor
intreruperi sa acceseze rutina de intrerupere.

 Latenta intreruperilor
Latenta intreruperii este timpul de raspuns al procesorului la aparitia unei intreruperi.
Latenta intreruperilor poate varia semnificativ de la o familie de procesoare la alta. Latenta mica a
intreruperii poate fi un factor important in special pentru controlul aplicatiilor in timp real. Aceasta
deoarece furnizorii de procesoare folosesc definitii gresite, vagi sau contradictorii ale latentei
intreruperilor (sau a conditiilor in care este masurata). Definitia formala a latentei intreruperii
precizeaza timpul minim garantat in anumite conditii de la aparitia unei cereri de intrerupere externa
si pana la executia primului cuvant din vectorul de intrerupere. Acest timp este masurat in cicluri
instructiune. Citeva detalii legate de aceasta definitie:
- Majoritatea procesoarelor testeaza starea liniilor externe de intrerupere la sfirsitul
fiecarui ciclu instructiune. Pentru a recunoaste aparitia unei intreruperi intr-un anumit ciclu
instructiune, linia de intreruperi trebuie sa fie activata un anumit cu un anumit timp inainte de
inceputul ciclului instructiune, acest timp fiind numit timp de stabilire (set-up). Deoarece

7
dispozitivul de intrerupere nu are cum sa garanteze ca va indeplini conditiile timpului de set-up al
procesorului, presupunem ca aceste conditii de set-up nu sunt indeplinite. Aceasta mareste latenta
intreruperii cu un ciclu.
- Dupa ce o linie de intreruperi a fost testata cu tactul procesorului este tipic trecuta
prin cateva etape de retinere pentru a evita problemele de metastabilitate. Aceasta etapa este numita
sincronizare. In functie de procesor, aceasta poate adauga unul pana la trei cicluri instructiune
latentei intreruperii.
- Din acest moment intreruperea este tipic recunoscuta ca valida si nerezolvata
depinzind de procesor. Daca procesorul nu este intr-o stare intreruptibila, procesarea intreruperii
este intarzaiata pana cand procesorul intra intr-o stare intreruptibila. Exemplele de stari
neintreruptibile includ dezactivarea unei intreruperi sub control software, executia de catre procesor
a unei alte intreruperi, executia unui ciclu hardware care dezactiveaza intreruperile, executia unui
ciclu multi-instructiune sau procesorul este intarziat datorita starilor de asteptare cand acceseaza
memoria externa. In definitia data latentei intreruperii s-a presupus ca procesorul se afla intr-o stare
intreruptibila care tipic inseamna ca poate executa instructiunea cea mai scurta.
- Procesorul trebuie apoi sa termine executia instructiunilor care sunt deja procesate in
pipeline. Presupunem ca aceste instructiuni reprezinta toate instructiunile care se executa intr-un
singur ciclu instructiune. In paralel cu aceasta, procesorul poate incepe sa incarce si procese din
primul cuvant al vectorului de intrerupere. Definitia data latentei intreruperii include timpul in care
primul cuvant al vectorului de intrerupere este trecut prin prima etapa de executie a pipeline-ului.
Conform descrierii de mai sus unele procesoare nu stocheaza un cuvant instructiune chiar in
locatia vectorului de intrerupere. La aceste procesoare, locatia vectorului de intrerupere contine mai
degraba numai adresa rutinei de intrerupere, iar procesorul executa salt la aceasta adresa. Pe aceste
tipuri de procesoare, definitia latentei de intrerupere include timpul de salt la rutina de intreruperi.
Acest timp nu este inclus pentru procesoarele care contin instructiuni la vectorul de intrerupere,
aceasta deoarece rutina de intreruperi poate in unele situatii sa se afle chiar la locatia indicata de
vectorul de intrerupere. In alte situatii acest lucru nu este posibil si timpul necesar procesorului
pentru a executa o instructiune de salt trebuie luat in consideratie in calculul latentei intreruperii.
Unele procesoare (AT&T - DSP32C si DSP32xx) ofera intreruperi rapide (fast). La
procesoarele Motorola o intrerupere este clasificata ca fiind rapida daca primele doua instructiuni
de la locatia vectorului de intrerupere nu sunt inserate direct in pipeline si executate fara salt,
reducand latenta intreruperii. Latenta intreruperii este strans legata de managementul si adancimea
pipeline-ului.

8
 Mecanisme pentru reducerea intreruperilor
Unele procesoare, ca cele din familia DSP-21xx (Analog Devices) sau TMS 320C54x
(Texas Instruments) poseda etaje tampon (autobuffering) la porturile lor seriale. Aceasta
caracteristica permite portului serial sa-si salveze direct in memoria procesorului datele primite, fara
a-l intrerupe. Dupa ce un anumit numar de date a fost transferat, portul serial intrerupe procesorul.
De fapt aceasta este o forma specializata de DMA.

8.3 Stiva

Stiva procesorului este strans legata de controlul executiei. De exemplu, apelurile


subrutinelor isi plaseaza in stiva, de obicei, adresele de revenire, in timp ce intreruperile folosesc
stiva si pentru informatiile de stare (astfel incat schimbarile facute de rutina de intreruperi asupra
cuvantului de stare al procesorului nu va afecta codul intrerupt).
Procesoarele DSP folosesc de obicei unul din urmatoarele tipuri de stiva:
- Shadow registers. Shadow registers sunt registri dedicati de backup care retin
continutul registrilor cheie ai procesorului in timpul procesarii intreruperii.
- Stiva hardware. O stiva hardware este un bloc special situat pe chip-ul de memorie,
de obicei avand o lungime de cateva cuvinte. Aceasta stiva contine starea registrilor selectati in
timpul procesarii intreruperilor sau a apelurilor subrutinelor.
- Stiva software. O stiva software este o stiva conventionala care foloseste memoria
procesorului pentru a stoca date in timpul executiei intreruperilor sau la apelurile de subrutine.
Dintre cele trei tipuri de mai sus, in general cele mai folositoare sunt stivele software si
shadow registers. Shadow registers pot fi folosite pentru a oferi o incarcare redusa a manipularii
intreruperii, deoarece ele salveaza automat registrii cheie ai procesorului intr-un singur ciclu.
Avantajul principal al stivei software fata de stiva hardware este ca adancimea ei poate fi
configurata de programator rezervand o regiune adecvata de memorie. In contrast, stivele hardware
sunt relativ mai putin adanci si programatorul trebuie sa aiba grija ca stiva sa nu fie depasita.

8.4 Facilitatile pentru executarea salturilor relative

Toate procesoarele DSP poseda instructiuni de salt ca una dintre cele mai simple forme de
control al executiei. In unele aplicatii (calculatoarele personale multimedia multitasking) o forma de
salt, cunoscuta ca saltul relativ la PC, poate fi extrem de utila. In salturile relative la PC, adresa la
care procesorul executa saltul este specificata ca offset la adresa curenta. Adresarea relativa la PC

9
este utila pentru crearea programelor independente de pozitie. Un program independent de pozitie
este acela care poate fi localizat oriunde in memorie. Daca toate referintele la memorie sunt
specificate relativ la alte locatii din codul programului, atunci nu este nici o greutate daca programul
este incarcat in alta parte a memoriei de fiecare data cand este rulat. Pe de alta parte, daca un
program contine referinte absolute la o alta locatie de memorie atunci programul nu mai pote fi
realocat fara a modifica aceste referinte.
In plus, prin folosirea codului independent de pozitie, saltul relativ la PC poate economisi
memorie de program in anumite situatii. In majoritatea programelor, salturile tind sa fie neglijabil
de scurte. Ca rezultat, frecvent offset-ul de la instructiunea curenta la instructiunea destinatie nu are
nevoie sa fie reprezentat de o instructiune cu lungime maxima. Ca urmare, offset-ul, poate fi
continut chiar in instructiunea de salt, rezultand o semnatura de offset de lungime redusa. De
exemplu, OakDSPCore (DSP Group) ofera o instructiune de salt cu o valoare a semnaturii de offset
de 7-biti.

10
Capitolul 9
Functionarea pipeline

Pentru a obtine o productivitate ridicata procesoarele de semnal combina avantajele


arhitecturii Harvard cu folosirea tehnicii pipeline de functionare. Pipeline-ul este o tehnica de
crestere a performantei unui procesor (sau a altor dispozitive electronice) prin impartirea unei
secvente de operatii in parti mai mici si executarea in paralel a acestora, pe unitati functionale
distincte, reducand astfel timpul necesar pentru a executa aceste operatii. Astazi aproape toate
procesoarele DSP de pe piata folosesc intr-o anumita masura tehnica pipeline. Totusi, folosirea
tehnicii de functionare pipeline din dorinta de imbunatati performantele, complica frecvent
programarea. De exemplu, pe anumite procesoare pipeline-ul conduce, in unele cazuri, la executia
mai lenta a unor instructiuni. Pe alte procesoare, anumite secvente de instructiuni trebuie evitate
pentru o executie corecta a programului. Cu toate acestea, tehnica pipeline reprezinta un
compromis intre eficienta si usurinta in utilizare.
Acest capitol prezinta conceptele tehnicii pipeline si explica un numar de probleme legate
de aceasta, furnizand exemple legate de modul in care sunt utilizate aceste concepte la
procesoarele DSP.

9.1 Principiul functionarii pipeline. Performante


Pentru a ilustra modul in care tehnica pipeline spereste nivelul de performanta, sa
consideram un procesor ipotetic care foloseste unitati de executie separate pentru a executa
secvential urmatoarele actiuni pentru o singura instructiune:
 Aducerea codului instructiunii din memoria de program
 Decodarea instructiunii (determinarea operatiei pe care trebuie sa o execute)
 Citirea operandului/operanzilor din memoria de date
 Executia instructiunii
Presupunand ca fiecare din cele patru etape de mai sus necesita pentru a fi executate
aproximativ 20 ns si ca ele trebuie realizate secvential, in Figura 9.1 este aratata executia unei
secvente de citorva instructiuni pe un procesor fara pipeline. Din figura putem observa ca folosind
aceasta abordare procesorul poate executa o instructiune la fiecare 80ns. Putem constata de
asemenea ca hardware-ul asociat fiecarei etape de executie (citirea codului, decodarea, incarcarea
operandului, executia instructiunii) este nefolosit 75 la suta din timp (presupunand ca pentru
fiecare etapa este folosit un hardware diferit). Aceasta pentru ca procesorul nu incepe executia
instructiunii urmatoare pana cind nu este complet incheiata executia instructiunii curente.

1
Intr-o implementare pipeline a acestui procesor imediat dupa ce prima instructiune a fost
incarcata, incepe incarcarea urmatoarei instructiuni, s.a.m.d. Similar, imediat ce a fost decodata
instructiunea curenta incepe decodarea urmatoarei instructiuni. Rezulta ca in cazul folosirii tehnicii
pipeline procesorul executa o noua instructiune la fiecare 20 ns, ceea ce inseamna o crestere de 4
ori a vitezei de lucru. In Figura 9.2 este aratat un lucru interesant: cu toate ca fiecare instructiune
este executata pe durata a mai multi cicli instructiune ele apar pentru programator ca fiind
executate intr-un singur ciclu.
Exemplul de functionare considerat este asemanator cu cel folosit de procesorul
TMS320C3x (Texas Instruments).

9.2 Adincimea pipeline-ului


Cu toate ca marea majoritate a procesoarelor folosesc tehnica pipeline, adancimea
(numarul de etaje) pipeline-ului poate varia de la un procesor la altul. In general, un pipeline mai
„adanc” permite procesorului sa execute mai rapid, dar il face mai greu de programat. Majoritatea
procesoarelor folosesc trei etaje (extragerea instructiunii, decodarea, incarcarea operandului si
executia). In pipeline-ul cu trei etaje incarcarea operandului are loc de obicei mai tarziu, ulterior
etapei de decodare. Procesoarele Analog Devices sunt cunoscute pentru pipeline-ul putin adinc, cu
doua etaje in timp ce procesorul TMS329C54x (Texas Instruments) are o adancime relativ mare,
respectiv un pipeline cu cinci etaje.

2
9.3 Interblocarea

Secventa de lucru aratata in Figura 9.2 prezinta o suprapunere perfecta, deoarece fazele
pipeline-ului se imbina perfect si ofera o utilizare de suta la suta a etajelor functionale ale
procesorului. In realitate, procesoarele nu lucreaza atat de bine ca in exemplul dat. Cea mai
comuna explicatie pentru aceasta este conflictul accesului la resurse. De exemplu, presupunem ca
procesorul considerat are nevoie de doua cicluri instructiune (40ns) pentru a scrie date in memorie.
(acesta este cazul procesoarelor AT&T - DSP16xx.) Daca instructiunea I2 incearca sa scrie in
memorie si instructiunea I3 are nevoie sa citeasca din memorie, al doilea ciclu instructiune pentru
I2 prezinta un conflict in faza de scriere a datelor cu operatia de citire a datelor ceruta de I3.
Aceasta este ilustrata in Figura 9.3, ciclul extins de scriere este evidentiat printr-un chenar negru si
conflictul dintre I2 scriere/I3 citire este redat prin casuta hasurata.

O solutie a acestei probleme consta in folosirea tehnicii de interblocare (interlocking). Un


pipeline cu interblocare intirzie parcurgerea pipeline-ului de catre instructiunile care pot genera
conflicte. In exemplul din Fig. 9.3 instructiunea I3 poate fi mentinuta in stadiul de decodare pana
cand etajul de citire/scriere termina operatia de scriere a instructiunii I2. Aceasta modificare este
prezentata in Figura 9.4. Evident ca oprirea instructiunii I3 implica mentinerea instructiunii I4 in
etapa de incarcare (aceasta poate insemna ca I4 este reincarcata din memorie sau tinuta pur si
simplu intr-un registru). Un efect secundar al interblocarii pipeline-ului este acela ca nu exista nici
o instructiune care sa fie executata in ciclul 6 de instructiuni; in locul acesteia procesorul executa
un NOP. Aceasta are ca urmare o intarziere de un ciclu insructiuni a programului.

3
O observatie importanta care se desprinde din aceasta este ca timpul de executie al unui
procesor cu pipeline cu interblocare variaza in functie de instructiunile pe care le executa. De
exemplu, daca instructiunea I3 din exemplul nostru nu ar fi avut nevoie sa citeasca date din
memorie atunci nu ar mai fi aparut un conflict, deci nu ar mai fi fost necesara interblocarea. Acesta
complica optimizarea codului pe un procesor cu interblocare deoarece nu este usor sa se determine
momentele in care trebuie facuta interblocarea doar citind codul programului.
De asemenea, pot fi prevazute si alte scenarii de conflict la accesarea resurselor. De
exemplu, unele procesoare poseda instructiuni cu date imediate cu format lung. Acestea sunt datele
care fac parte din instructiune, dar care nu au loc in cuvantul instructiune. Pentru aceste date
procesorul foloseste un ciclu suplimentar de citire din memorie pentru a extrage datele. In
consecinta citirea datelor imediate cu format lung intra in conflict operatia de extragere a codului
urmatoarei instructiuni rezultand o interblocare.
Exemplele de mai sus arata sursele de conflicte care apar in pipeline si unde interblocarea
este singura solutie posibila; fara interblocare, in aceste exemple ar aparea rezultate eronate. In alte
cazuri lipsa interblocarii poate genera rezultate care nu sunt eronate, dar nu corespund intentiilor
programatorului. Vom ilustra acest lucru cu un exemplu pentru procesorul DSP5600x (Motorola),
un procesor care foloseste foarte putin operatia de interblocare.
Ca majoritatea procesoarelor DSP, DSP5600x are registri de adrese care sunt folositi
pentru “adresarea indirecta cu registru”. Un efect interesant la nivelul pipeline-ului apare la
executia urmatoarei secvente de instructiuni:
MOVE #$1234, R0
MOVE X: (R0), X0
Prima instructiune incarca adresa hexazecimala 1234 in registrul de adrese R0. A doua
instructiune transfera continutul locatiei din bancul de memorie X, indicata de registrul de adrese
R0, in registrul X0. De asteptat ar fi ca instructiunile de mai sus sa transfere valoarea stocata la
adresa 1234 a memoriei X in registrul X0. Totusi, datorita efectelor de pipeline, instructiunile de

4
mai sus nu sunt executate in modul in care ne-am fi asteptat. Pentru a intelege de ce, este necesara
o scurta examinare a pipeline-ului procesorului DSP5600x.
Procesorul DSP5600x foloseste un pipeline cu trei etaje. Operatiile executate de ALU
(adunare, inmultire, etc.), accesarea datelor (citirea si scrierea datelor din memorie, ca in exemplul
de mai sus) si incarcarea registrilor sunt realizate in etapa de executie. Adresele folosite pentru
accesarea datelor sunt generate in etapa de decodare. Acest lucru creaza o stare nedeterminata a
pipeline-ului (hazard) – apare o problema datorata pipeline-ului, pe care programatorul trebuie sa
o evite pentru a obtine rezultate corecte. In acest exemplu, prima instructiune MOVE modifica un
registru de adrese folosit in generarea adreselor, dar modificarea nu este reflectata in adresele
folosite in timpul acesului datelor pentru a doua instructiune MOVE.
Figura 9.5 prezinta in detaliu acest hazard. Se remarca ca aceasta figura este usor diferita
fata de figura precedenta in felul cum arata folosirea resurselor procesorului (inclusiv memoria si
unitatile de executie). O astfel de situatie este denumita uzual “tablou de rezervare” (rezervation
table).

Sa presupunem ca la inceput R0 contine valoarea hexazecimala 5678. In timpul ciclurilor


1 si 2, prima instructiune MOVE este incarcata si decodata, iar instructiunea MOVE a doua este
incarcata. In timpul celui de-al treilea ciclu instructiune este decodata a doua instructiune MOVE.
In acest timp, unitatea de generare a adreselor genereaza o adresa folosita de a doua instructiune
MOVE pentru citirea datelor, adresa 5678. Prima instructiune MOVE este executata dar rezultatele
nu sunt inca disponibile pentru unitatea de generare a adreselor. Ca rezultat, in timpul ciclului 4 al
instructiunilor, procesorul citeste din memoria X de la adresa 5678, iar registrul R0 contine acum
1234. Aceasta probabil ca nu este ceea ce intentiona programatorul. Pentru a evita aceasta situatie,

5
pot fi inserate alte cateva instructiuni (sau chiar NOP) intre cele doua instructiuni MOVE, pentru a
da pipeline-ului timp sa obtina valoarea corecta in R0.
Procesoarele TMS320C3x, TMS320C4x, TMS320C5x (Texas Instruments) prezinta
aceasta problema dar folosesc interblocarea pentru a proteja programatorul de hazard. De exemplu,
TMS320C3x detecteaza scrierea in oricare dintre registrii sai de adrese si opreste inaintarea in
pipeline a altor instructiuni care folosesc orice registru de adrese pana cind scrierea a fost
terminata. Aceasta este ilustrata in Figura 9.6. In acest exemplu, o instructiune LDI (“incarca
imediat”) incarca o valoare intr-un registru de adrese, la fel ca prima instructiune MOVE din
exemplul cu DSP5600x. A doua instructiune este MPYF (“inmultire in virgula mobila”) care
foloseste adresarea indirecta cu registru pentru a extrage unul din operanzi. Deoarece instructiunea
MPYF foloseste unul din registrii de adrese, prin interblocare este oprita etapa de decodare pana
cand instructiunea LDI este finalizata. Aceasta pentru ca procesorul executa doua instructiuni
NOP.

Procesoarele care folosesc interblocarea in astfel de situatii il scutesc pe programator de a


avea grija ca unele secvente de instructiuni sa nu produca valori incorecte. Pe de alta parte
interblocarea obliga programatorul sa scrie cod mai lent decat optimal.

9.4 Efectele ramificarii


Un alt efect al folosirii tehnicii pipeline apare la executarea salturilor sau la alte schimbari
din fluxul programului. Pana cand o instructiune ajunge in etapa de decodare in pipeline si
procesorul realizeaza ca trebuie sa inceapa sa execute la o noua adresa, urmatorul cuvant
instructiune a fost deja incarcat in pipeline. O posibilitate de a rezolva aceasta situatie este a ignora
sau a elimina instructiunea nedorita si de a inceta incarcarea noilor instructiuni pana cand saltul are
loc. Aceasta este ilustrat in Figura 9.7, unde procesorul executa un salt (BR) la o noua locatie de
memorie. Dezavantajul acestei abordari este ca procesorul trebuie sa execute cicluri NOP pe
intervalele invalidate ale pipeline-ului, avand ca rezultat executia instructiunilor de salt in mai

6
multe cicluri de instructiuni. In mod curent, un salt multi-ciclu se executa intr-un numar de cicluri
egal cu adancimea pipeline-ului, desi pentru a economisi un ciclu de instruciuni, unele procesoare
folosec artificii pentru executa saltul tarziu in etapa de decodare.

O alternativa a saltului multi-ciclu este “saltul intarziat” care nu goleste pipeline-ul. Atunci
cateva dintre instructiunile care urmeaza saltului sunt executate nomal, dupa cum este ilustrat in
Figura 9.8. Un efect secundar al saltului intarzaiat este ca instructiunile care vor fi executate
inainte de salt trebuie sa fie localizate in memorie dupa instructiunea de salt:
BRD NEW_ADDR ; Salt la o noua adresa.
INST 2 ; Aceste trei instructiuni sunt executate inainte de aparitia
INST 3 ; saltului
INST 4 ;

Salturile intarzaiate sunt numite astfel deoarece, pentru programator, efectul saltului pare a
fi intarzaiat cu cateva cicluri instructiune.

Aproape toate procesaorele DSP folosesc salturi multi-ciclu. De asemenea, multe ofera
salturi intarziate, inclusiv TMS320C3x, TMS320C4x si TMS320C5x (Texas Instruments).
Procesoarele ADSP-210xx (Analog Devices), DSP32C si DSP32xx (AT&T) si ZR3800x (Zoran)
executa doar salturi intarziate.
Impreuna cu interblocarea, salturile multi-ciclu si intarziate reprezita un compromis intre
o programare usoara si una eficienta. In cel mai rau caz, programatorul poate intotdeauna sa

7
plaseze instructiuni NOP dupa o instructiune de salt intarzaiat si sa obtina acelasi efect ca al
saltului multi-ciclu, dar aceasta cere multa atentie din partea programatorului.
Efectele de salt apar de fiecare data cand apare o schimbare in desfasurarea programului si
nu doar pentru instructiuni de salt. De exemplu: instructiunile de apelare a subrutinelor,
instructiunile de revenire din subrutine si instructiunile de revenire din intreruperi sunt toate
posibile surse de efecte de pipeline ca in prezentarea anterioara. Procesoarele care executa salturi
intarziate poseda de asemenea si reveniri intarziate.

9.5 Efectele pipeline-ului asupra intreruperilor


Intreruperile implica de obicei o schimbare in fluxul programului pentru a executa saltul la
rutine de servire a intreruperii. De obicei pipeline-ul mareste timpul de raspuns al procesorului la
intreruperi, cu cit executia saltului este mai intirziata. Cand apare o intrerupere, aproape toate
procesoarele permit terminarea executiei instructiunilor din pipeline, instructiuni aflate in stadiul
de decodare sau chiar mai departe, deoarece aceste instructiuni pot fi partial executate. Ce se
intampla dupa acest punct variaza de la un procesor la altul. Vom analiza cateva exemple in
continuare.
Figura 9.9 prezinta pipeline-ul instructiunilor in timpul aparitiei unei intreruperi la familia
de procesoare TMS320C5x. La un ciclu dupa ce intreruperea a fost recunoscuta, procesorul
introduce in pipeline o instructiune INTR. INTR este o instructiune de salt specializat care face ca
procesorul sa inceapa executia la vectorul de intreruperi corespunzator. Deoarece INTR se
comporta ca un salt multi-instructiune, ea produce o intirziere de patru instructiuni inainte de a
executa primul cuvant din vectorul de intrerupere (V1 din figura). De remarcat ca instructiunile
care erau sau sunt in pipeline in etapa de decodare au permisiunea de a termina executia cand
intreruperea a fost recunoscuta (I3-I5). Instructiunea I6 este ignorata dar va fi reincarcata la
revenirea din intrerupere. De asemenea se remarca faptul ca figura nu arata timpul pentru
sincronizarea intreruperii, dupa cum s-a discutat in Capitolul 8.

8
Figurile 9.10 si 9.11 arata doua dintre cele cateva scenarii posibile de procesare a
intreruperilor de catre procesorul DSP5600x (Motorola). Se observa imediat anumite diferente fata
de procesorul TMS320C5x.
In primul rand, pentru a incepe procesarea, procesorul are nevoie de doua cicluri de
instructiuni dupa recunoasterea intreruperii. In al doilea rand, DSP5600x nu foloseste instructiuni
INTR pentru a comuta executia la adresa specificata de vectorul de intrerupere. In schimb,
procesorul incepe pur si simplu extragerea codurilor de la adresa data de vector dupa ce o
intrerupere a fost recunoscuta. Cu toate acestea, cel mult doua cuvinte sunt incarcate de la aceasta
adresa. Daca unul dintre cele doua cuvinte este apelul unei subrutine (Figura 9-10), procesorul
elimina instructiunea incarcata anterior si apoi executa saltul la o adresa specificata printr-un
vector lung de intrerupere (long interrupt vector). Daca nici un cuvant nu este un apel al unei
subrutine, procesorul executa cel mult doua cuvinte si continua sa execute din programul original,
cum este ilustrat in Figura 9-11. Aceasta a doua forma a rutinei de intreruperi este numita
intrerupere rapida. Intreruperile au fost analizat in Capitolul 8.

9
Modele de programare pipeline
Exemplele din sectiunile anterioare au fost concentrate pe pip-eline-ul de instructiuni, pe
comportamentul sau si pe interactiunea cu alte parti ale procesorului in diferite situatii. In aceasta
sectiune vom discuta pe scurt doua forme majore de limbaj de ansamblare pentru procesoarele cu
pipeline: timp-stationar si date-stationare.
In modelul de programare cu timp stationar, instructiunile procesorului specifica actiunile
care sa fie facute de unitatile de executie (multiplicator, acumulator s.a.m.d.) in timpul unui singur
ciclu instructiune. Familia DSP16xx (AT&T) este un bun exemplu unde instructiunea multiplica-
acumuleaza arata in felul urmator:
A0=A0+P P=X*Y Y=*R0++ P=*Pt++
Acumulatorul adauga produsul precedent (din registrul P) la continutul sau precedent,
multiplicatorul inmulteste registrii X si Y si plaseaza rezultatul in registrul produs, registrii X si Y
sunt incarcati cu valorile de la locatiile de memorie indicate de registrii R0 si Pt. De remarcat ca
fiecare portiune a instructiunii lucreaza cu operanzi diferiti.
Programarea cu date stationare specifica operatiile care vor fi facute, dar nu si timpii exacti
la care operatiile vor fi executate. Ca exemplu sa consideram urmatoarele instructiuni de ale
DSP32xx (AT&T):
A1=A1+(*R5+ + = = * R4 + +) * *R3 + +
Valorile de la locatiile de memorie indicate de registrii R3 si R4 sunt descarcate si inmultite.
Valoarea indicata de registrul R4 este scrisa inapoi la locatia de memorie indicata de registrul R5.
Rezultatul inmultirii este acumulat in registrul A1. De remarcat ca acest tip de cod urmareste un
singur set de operanzi printr-o secventa de operatii.
Spre deosebire de instructiunile procesorului DSP16xx, abordarea datelor stationare
foloseste operanzi care se refera direct la memorie. In loc sa inmulteasca doi registrii, instructiunea
inmulteste doua locatii de memorie. Valorile acestor locatii de memorie sunt incarcate si aduse la
multiplicator, dar programatorul nu specifica aceasta operatie in mod direct ca in cazul metodei
timpului stationar. Procesorul programeaza apoi secventele de acces la memorie si le muta fara o
directie explicita.
Abordarile cu date stationare si timp stationar au fiecare rostul lor. In general, modelul
datelor stationare este mai usor de citit dar nu este atat de flexibil precum abordarea cu timp
stationar.

10
Capitolul 10

Dispozitivele I/O si perifericele

Majoritatea procesoarelor DSP poseda un numar corespunzator de dispozitive periferice


integrate si de interfete pentru periferice externe. Aceasta permite folosirea procesorului intr-un
sistem integrat cu un minim de componente electronice externe, care sa asigure operarea si interfata
sa cu exteriorul. In acest capitol vor fi prezentate dispozitivele periferice integrate in cip si
interfetele pentru perifericele externe care sunt intilnite in mod obisnuit la procesoarele DSP.

10.1 Porturile seriale

O interfata seriala transmite si primeste datele bit cu bit. Spre deosebire, porturile paralele
trimit si primesc date in format paralel, sub forma de cuvinte de 8, 16 sau 32 de biti. Desi
interfetele seriale nu sunt la fel de rapide ca cele paralele (in ceea ce priveste numarul de bit i
transferati pe secunda), ele folosesc un numar mai redus de pini de interfata (numai 3 sau 4 pentru o
interfata seriala completa).
Porturile seriale prezente pe chip-urile DSP sunt folosite pentru aplicatii variate, incluzind:
 transmiterea si primirea esantioanelor de date catre si de la convertoarele si codecurile
(codoare/decodoare) A/D si D/A
 trimiterea si primirea de date catre si de la alte microprocesoare sau DSP-uri
 comunicatia cu alte periferice si componente externe
Exista doua mari categorii de interfete seriale: sincrone si asincrone. Un port serial sincron
transmite bitii de date impreuna cu un semnal de ceas. Receptorul foloseste acest semnal pentru a
decide cand sa preia datele primite serial.
In cazul interfetelor seriale asincrone datele nu sunt insotite de un semnal de ceas
suplimentar. Ele se bazeaza pe faptul ca receptorul va recupera semnalul de ceas din datele primite,
lucru care complica interfata seriala si limiteaza viteza maxima de transmisie a datelor. Porturile
seriale asincrone sunt de obicei folosite pentru comunicatii conform standardelor RS-232 sau RS-
422. Desi exista procesoare care poseda porturi seriale asincrone (de exemplu, Motorola -
DSP5600x si cateva procesoare din familia μPD7701x - NEC), numarul lor este redus.
Aproape toate procesoarele DSP asigura unul sau mai multe porturi de interfata seriala
sincrona pe chip. Tipic, fiecare port permite transmisia si receptionarea de informatii in mod serial.
In continuare sunt prezentate unele particularitati ale interfetelor seriale sincrone.

1
 Datele si tactul
Dupa cum s-a mentionat, un transmitator serial sincron trimite un semnal de ceas sub forma
unui bit pe care interfata seriala de la receptie il foloseste pentru a determina intervalul in care bitii
de date sunt valizi. Figura 10.1 reprezinta formele de unda pentru o transmisie seriala sincrona.
Toate interfetele sincrone presupun ca transmitatorul modifica datele pe unul din fronturile
semnalului de ceas (fie pe frontul crescator fie pe cel descrescator) si ca datele devin stabile (nu se
mai modifica) pe celalalt front. In figura, datele se schimba pe frontul crescator al ceasului si sunt
citite la receptie pe frontul descrescator. Totusi, diferite interfete seriale sau periferice pot prezenta
relatii diferite intre semnalul de ceas si date. Ca rezultat, unele porturi seriale incorporate in DSP-uri
permit programatorului sa aleaga “polaritatea” ceasului, de fapt care dintre fronturi controleaza
momentul schimbarii datelor.

Fig 10.1

Majoritatea, dar nu toate circuitele de interfata seriala, folosesc o logica pozitiva, respectiv
o tensiune pozitiva (tipic 3,3 V sau 5 V) pe linia seriala de date reprezinta un “1” logic, iar o
tensiune scazuta (aproape 0 V) reprezinta un “0” logic. La unele circuite DSP polaritatea datelor
poate fi selectata de programator.
O alta problema o reprezinta ordinea in care sunt transferati bitii de date. In figura 10.1 se
presupune ca, cuvintele de date au 8 biti lungime si sunt transmise cu cel mai putin semnificativ bit
(LSB) primul. Nu toate echipamentele care folosesc protocoale de comunicatii seriale accepta
aceasta conventie; la unele primul bit transmis este cel mai semnificativ bit (MSB). Prin urmare,
interfetele seriale ale unor DSP-uri permit selectarea directiei, respectiv a ordinii de transmisie.
Porturile seriale permit diverse lungimi ale cuvintelor de date. Valorile obisnuite sunt: 8 biti
(folosit in aplicatii din telefonie) si 16 biti (folosit la reprezentarea semnalului audio digital); totusi
unele porturi seriale accepta si alte lungimi ale cuvintelor.

 Sincronizarea cadrelor
Interfetele seriale sincrone folosesc un al treilea semnal, in plus fata de date si ceas, numit
semnal de sincronizare a cadrelor (frame sync.). Acest semnal indica receptorului primul bit al unui
2
cuvant de date transmis pe o linie seriala. Semnalul de sincronizare de cadre este cunoscut si sub
alte denumiri: unii producatori il numesc semnal de sincronizare de cuvinte (“word sync”) sau
semnal de inceput de cuvant (“start of word”).
Pentru semnalele de sincronizare de cadre sunt disponibile doua formate: lungime de bit
(“bit length”) si lungime de cuvant (“word length”). Aceste denumiri se refera la durata semnalului
de sincronizare de cadre raportata la durata unui bit de date. Un semnal de sincronizare de cadru de
tip „lungime de bit” dureaza timp de un bit si este transmis de obicei cu un bit inainte de
transmiterea primului bit al cuvantului de date, dar poate poate fi transmis si simultan cu
transmiterea primului bit al cuvantului de date. Semnalul de sincronizare de cadre aratat in figura
10.1 este un semnal de tip “lungime de bit”. Spre deosebire, un semnal un semnal de sincronizare de
cadre de tip “lungime de cuvant” dureaza intreaga lungime a cuvantului de date. Un exemplu de
astfel de semnal este aratat in figura 10.2. Majoritatea DSP-urilor ofera semnale de sincronizare de
cadre “lungime de bit” , dar exista si multe care ofera semnale de tip “lungime de cuvant”.
Anumite echipamente externe pot sa accepte un semnal de sincronizare de cadre cu polaritae
inversa, respectiv are un nivel logic 0 pe durata cuvintului de date si 1 pe durata pauzei dintre
cuvinte. Relativ putine DSP-uri permit alegerea polaritatii semnalului de sincronizare de cadre.

Fig. 10.2 si 10.3

 Cuvinte multiple per cadru


Unele porturi seriale pot transmite doar un cuvant pentru fiecare puls de sincronizare de
cadru. Exista si posibilitatea ca sa nu fie transmis un semnal de sincronicare de cadru pentru fiecare
cuvant de date. (De fapt, daca transferurile sunt periodice, sincronizarea de cadre este necesara doar
la initializarea transferului). Unele porturi seriale ale DSP transfera cuvinte multiple de date per
cadru, dupa cum se arata in figura 10.3. Acesta posibilitate este utila in special pentru convertoarele
stereo A/D si D/A deoarece ele transfera doua cuvinte de date per cadru: un esantion de pe canalul
3
stang si un esantion de pe canalul drept. Folosirea unui semnal de sincronizare de cadre de tip
“lungime de cuvant” este normala in acest caz deoarece starea semnalului de sincronizare de cadru
(ridicat sau scazut), poate fi folosita pentru identificarea canalului sursa sau destinatie (stang sau
drept).

 Sectiunile de receptie si transmisie independente


Un port serial este alcatuit de obicei dintr-o sectiune de receptie si una de transmisie. La
unele DSP-uri sectiunile de transmisie respectiv receptie sunt independente (adica transmitatorul si
receptorul pot avea semnale de ceas si de sincronizare de cadre independente), in timp ce pe altele
exista doar un semnal de sincronizare si unul de tact folosite in comun pentru transmisie si pentru
receptie. Prima solutie este insa cea mai flexibila (de exemplu, procesoarele TMS320C54).

 Generarea ceasului serial


Cand doua echipamente oarecare sunt conectate printr-o legatura seriala sincrona, ambele
trebuie sa foloseasca acelasi semnal de ceas. De aceea fie unul dintre cele doua echipamente trebuie
sa genereze ceasul sau acesta este generat de un al treilea echipament extern.
Unele DSP-uri au circuite pentru generarea unui semnal de ceas serial care este folosit de
portul serial sincron. Acesta se numeste suport de generarea ceasului serial sau de generare a ratei
de baud. Mecanismul de generare a tactului serial variaza mult intre DSP-uri; unele nu pot sa-si
genereze propriul ceas, altele au ceas propriu dar numai pentru transmisie dar nu si pentru receptie,
altele pot fi capabile sa genereze ceasuri multiple.
Generatoarele de ceas serial produc de obicei un semnal de ceas prin divizarea ceasului
principal al procesorului cu o valoare intraga. Gardul de control pe care utilizatorul il are asupra
frecventei ceasului generat variaza mult; unele DSP-uri asigura o plaja mare de reglare a frecventei
ceasului, in timp ce altele permit utilizatorului sa aleaga valori numai dintr-un set limitat de
frecvente.
Uzual generatoarele de ceas serial sunt constituite dintr-un circuit de prescalare, care
realizeaza o divizare cu un factor intreg a semnalului de ceas si un numarator programabil care
divizeaza mai fin frecventa ceasului principal. Prescalarea este realizata cu un numarator, care de
obicei poate diviza ceasul numai prin cateva valori fixate prin hardware, dintre care programatorul
poate sa aleaga. De exemplu familia Motorola DSP5600x permite utilizatorului sa selecteze un
factor de prescalare cu valoarea unu (nici o schimbare) sau 8, iar prescalarea folosita de
procesoarele AT&T DSP16xx asigura impartirea la 4, 12, 16 sau 20.
Partea de numarator a generatorului de ceas este de obicei un numarator descrescator
programabil, la care intrarea este iesirea circuitului de prescalare. De fiecare data cind numaratorul

4
ajunge la zero la iesire este generat un impuls, dupa care numaratorul se reincarca cu valoarea de
numarat.
Unele generatoare de ceas de pe DSP-uri nu includ un numarator programabil, fortand
utilizatorul sa selecteze una dintre frecvente de ceas disponibile. Altele asigura numai un numarator
(fara prescalare), care s-ar putea sa nu poata reduce frecventa de ceas la valoarea dorita.

 Suportul de multiplexare prin divizarea timpului


Porturile seriale sincrone sunt uneori folosite pentru conectarea in paralel a doua sau a mai
multor procesoare DSP la o magistrala comuna. Aceasta se face de obicei, folosind multiplexarea
prin divizarea timpului (TDM). Intr-o retea TDM, timpul este impartit in ferestre de timp (slots). Pe
durata unei ferestre, doar un singur un procesor poate transmite, iar celelalte trebuie sa receptioneze.
Figura 10.4 prezinta o retea TDM clasica. Procesoarele comunica printr-o magistrala de 3
linii: o linie de date, o linie de ceas si una de sincronizare cadre. Linia de sincronizare si cea de ceas
a fiecarui DSP este legata la linia corespondenta de pe bus, iar liniile de transmisie si de receptie ale
DSP-ului sunt ambele legate la linia de date.

Fig. 10.4 a, b

Figura 10.4(b) prezinta un set tipic de semnale seriale care sunt prezente intr-o retea TDM.
Un procesor (sau un circuit extern) este responsabil cu generarea semnalului de ceas si de
sincronizare de cadre. Semnalul de sincronizare de cadre este folosit pentru a indica inceputul unui
nou set ferestre de timp. Dupa sincronizarea de cadru, fiecare procesor trebuie sa tina cont de

5
numarul ferestrei de timp curente si sa transmita numai in fereastra atribuita lui. Un cuvant de date
(16 biti in figura) ar putea contine un numar de biti care sa indice DSP-ul destinatie (de exemplu 2
biti pentru 4 procesoare) in timp ce restul contin date. O alta varianta foloseste o a doua linie de date
pentru a transmite adresele de sursa si destinatie in paralel cu cuvantul de date.
Intr-o varianta minima, suportul TDM presupune ca procesorul este capabil sa-si puna linia
de transmisie de date a portului serial in stare de impedanta inalta atunci cand procesorul nu
transmite. Aceasta permite altor DSP-uri sa transmita date in timpul ferestrelor atribuite fara a
produce conflicte. Unele porturi seriale au un suport aditional, ca de exemplu un registru care face
portul serial sa transmita in timpul unei anumite ferestre de timp. Fara acest suport, procesorul ar
trebui sa primeasca datele transmise catre toate celelalte procesoare si sa elimine datele care nu ii
sunt adresate si pentru a stabili cand ii vine randul sa transmita.

 Suportul pentru compresie/decompresie


Porturile seriale sincrone sunt utilizate frecvent pentru interfatare cu codec-uri care nu sunt
pe chip, acestea fiind convertoare A/D si D/A cu scop special, folosite in telefonie si in aplicatiile
de voce de fidelitate scazuta. Codec-urile folosesc in mod normal cuvinte de date de 8 biti
reprezentand esantionare de 14 sau 16 biti de date audio comprimate. Schema de compresie este de
obicei bazata pe standardul μ-law (in SUA) sau A-law (in Europa). Procesul de compresie si
decompresie a datelor este numit compandare si este efectuat de obicei prin software cu tabele de
cautare. Unele DSP-uri ca de exemplu familia Analog Devices - ADSP-21xx si Motorola -
DSP56156 asigura suport de compandare integrat in interfetele lor seriale. Acest lucru poate
economisi timp de executie si memorie, eliberand procesorul de functiile de cautare in tabele. Este
interesant ca procesoarele AT&T - DSP32C si DSP32xx executa aceste conversii de format cu
suport integrat pe calea de date.

 Implicatii pentru proiectantul de sisteme


Dupa cum s-a aratat mai sus exista un mare numar de variante pentru comunicatia seriala
sincrona. De la variante obisnuite (care indica ordinea de transmitere a bitilor, forma semnalului de
sincronizare de cadre, polaritatea ceasului) pana la sisteme complexe (care asigura suport TDM sau
suport de compandare). Porturile seriale existente pe unele procesoare DSP sunt multiplu
configurabile, altele nu sunt. Aceasta sugereaza ca proiectantul de sisteme trebuie sa verifice cu
atentie compatibilitatea intre formatele de date suportate de portul serial al unui procesor si
perifericele cu care intentioneaza sa-l foloseasca, inainte de a lua decizii de proiectare care s-ar
putea dovedi greu de corectat mai tarziu in caz ca apare o incompatibilitate.

6
10.2 Porturile paralele

Un port paralel transmite si primeste simultan mai multi biti de date (tipic 8 sau 16 biti), pe
linii separate. Porturile paralele pot sa transfere de obicei date, mult mai repede decat cele seriale,
insa au nevoie de mai multe linii si pini pentru aceasta. Pe langa un numar mai mare de linii de
date, un port paralel de obicei include si linii de comanda a transferului (denumite linii de
handshake sau de strobe). Aceste linii indica unui echipament extern ca datele au fost transmise
catre port de catre DSP, sau invers.
Unele DSP-uri folosesc principala magistrala de date a procesorului ca port paralel. De
obicei fac aceasta rezervand o parte a spatiului lor de adrese (sau folosesc o instructiune speciala)
pentru acces I/O prin magistrala externa. Cand este accesata acea adresa de memorie (sau cind
instructiunea I/O este executata) este activat un pin special de strobe sau handshake, iar procesorul
executa un ciclu pe magistrala externa de citire sau scriere a unei date de la/catre un dispozitiv I/O.
Un echipament extern care monitorizeaza acest pin va sti ca trebuie sa citeasca sau sa scrie de la sau
catre pinii de date externi ai procesorului. Aceasta abordare este destul de obisnuita si este folosita
de majoritatea DSP-urilor Texas Instruments.
Alte DSP-uri, ca de exemplu familia AT&T DSP16xx, asigura porturi paralele separate de
magistrala externa a procesorului. Acesti pini pot fi folositi doar de portul paralel sau pot fi pusi in
comun cu alte periferice. Separand portul paralel de magistrala externa de date a procesorului se
poate simplifica interfatarea cu alte echipamente externe.

10.3 Porturi I/O de bit

Aceste intrari/iesiri se refera la un port paralel de I/O unde liniile pot fi programate
individual sa fie linii de intrare sau de iesire. Spre deosebire de porturile I/O traditionale, porturile
de I/O de bit nu au de obicei asociate linii de strobe sau handshake si pot sa nu aiba suport de
intreruperi. Prin program procesorul trebuie sa verifice portul pentru a stabili daca valorile de
intrare s-au schimbat. Acest port I/O este folosit in scop de control insa uneori este folosit si pentru
transfer de date.
Majoritatea DSP-urilor asigura cel putin una sau doua linii I/O de bit, desi altele pot sa aiba
citeva zeci. Pe unele procesoare porturile I/O de bit sunt puse in comun cu alti pini de periferice.
De exemplu pe Motorola DSP5600x unii dintre pinii asociati unui port serial pot fi configurati
pentru folosire ca port I/O de bit daca aplicatia nu are nevoie sa foloseasca portul serial. Pe alte
procesoare porturile I/O de bit pot sa foloseasca pini dedicati.
Multe procesoare au instructiuni speciale a caror executie depinde de starea portului I/O de
bit. De exemplu majoritatea procesoarelor Texas Instruments in virgula fixa, au un pin de intrare de

7
bit numit “BIO” si de asemenea poseda o instructiune speciala (BIOZ – „ramifica daca starea
portului I/O de bit este zero”) care se transfera controlul la adresa specificata de instructiune daca
starea pinului BIO este zero. In felul acesta poate fi monitorizata starea unui dispozitiv extern.
Procesorul TMS320C14 (Texas Instruments) si familia de DSP-uri AT&T DSP16xx au
porturi de I/O de bit mai sofisticate. Pe langa posibilitatea de a configura individual liniile ca intrari
sau iesiri si posibilitatea de a seta sau reseta bitii, aceste porturi I/O de bit verifica in mod continuu
starea porturilor I/O de bit pentru a stabili daca bitii de intrare se potrivesc unui model
preprogramat. Pe DSP16xx, rezultatul acestei comparatii seteaza starea a 4 fanioane: toti bitii se
potrivesc modelului, unii dintre biti se potrivesc modelului, unii dintre biti nu se potrivesc
modelului si nici un bit nu se potriveste modelului. Aceste fanioane pot fi apoi folosite in
instructiuni cu executie conditionata. De exemplu, folosind o unitate I/O de bit, o instructiune
DSP16xx poate incrementa conditionat un registru daca unul din doi biti specificati este setat.
Unitatea I/O de bit a procesorului TMS320C1x poate intrerupe procesorul cand modelul intrarilor
se potriveste cu modelul memorat.

10.4 Porturile gazda

De obicei sistemele multiprocesor complexe folosesc un procesor gazda pentru supervizare.


De aceea unele DSP-uri asigura un port gazda pentru conexiunea cu un microprocesor de uz general
sau cu un alt DSP. Porturile gazda sunt de obiciei porturi paralele bidirectionale specializate de 8
sau 16 biti care pot fi folosite pentru transferul de date intre DSP si procesorul gazda. In unele
cazuri portul gazda poate fi de asemenea folosit pentru a controla DSP-ul (adica sa-l forteze sa
execute instructiuni sau rutine de serviciu de intrerupere, sa citeasca sau sa scrie registrii sau
memoria, etc). Poate fi de asemenea folosit si pentru initializare.
Uzual portul gazda lucreaza in regim DMA; data prezenta la port este scrisa automat in
memoria DSP fara a-l opri, cu sau fara intreruperi. De asemenea este posibila receptia si transmisia
simultana a datelor. Portul gazda are instructiuni dedicate care usureaza folosirea. De exemplu
procesorul DSP32C (Lucent) poseda un port gazda care reprezinta efectiv o magistrala ISA de 6 sau
16 biti. Procesoarele DSP56301 (Motorola) si ADSP21060 (Analog Devices) au porturi gazda care
implementeaza magistrala PCI. In acest mod portul gazda asigura o interfata standardizata pentru
conectarea placilor DSP la diferite platforme gazda.
Exemple de procesoare care ofera porturi gazda: toate procesoarele Motorola, unele
procesoare Analog Devices, NEC μPD7701x, si procesoarele in virgula fixa recente de la Texas
Instruments. DSP Group asigura o macrocelula de port gazda pentru nucleele PineDSPCore si
OakDSPCore.

8
10.5 Porturi de comunicatie

Comunicatiile interprocesoare sunt necesare cind o aplicatie DSP necesita mai multe
procesoare sau acolo unde sunt folosite mai multe procesoare pentru a manipula mai multe secvente
de date interconectate. Un port de comunicatii este un port paralel special destinat pentru
comunicatia multiprocesor. Un port de comunicatii difera de un port gazda sau de un port paralel
obisnuit in doua feluri: In primul rand este facut pentru comunicatia interprocesor intre acelasi tip
de DSP-uri (spre deosebire de conectarea unor diferite tipuri de procesoare sau conectarea la
periferice). In al doilea rand porturile de comunicatii nu asigura in general functii speciale pentru
controlul procesorului DSP, cum este cazul porturilor gazda.
Procesoarele TMS320C4x (Texas Instruments) si ADSP-2106x (Analog Devices) sunt
singurele DSP-uri cu porturi de comunicatii. TMS320C40 si ADSP-2106x au 6 porturi de
comunicatii in timp ce TMS320C44 are 4; porturile TMS320C4x sunt fiecare de 8 biti latime in
timp porturile ADSP-2106x sunt de 4 biti latime. Din moment ce ambele procesoare au o lungime
a cuvantului de date de 32 de biti, porturile de comunicatii ale ambelor procesoare asigura suport
FIFO pentru fragmentarea si reasamblarea cuvintelor mai mari cand acestea sunt transmise prin
porturile de comunicatii relativ inguste.
Porturile de comunicatie au instructiuni dedicate care usureaza folosirea lor. Uzual ele
lucreaza in regim DMA; datele prezente la port sunt scrise automat in memoria DSP.

10.6 Circuitele timer

Practic toate DSP-urile au circuite timer programabile. Acestea sunt folosite de obicei ca o
sursa de intreruperi periodice (adica semnal de ceas pentru un sistem de operare in timp real), dar
sunt posibile si alte aplicatii. De exemplu, unele DSP-uri contin un pin de iesire care furnizeaza un
semnal rectangular cu o frecventa generata de catre timer. Deoarece frecventa este controlata
software, aceasta iesire poate fi considerata ca un oscilator controlat software, util pentru
implementarea unor cicluri de faza constanta
In esenta, un timer seamana mult cu un generator de ceas al unui port serial, fiind compus
dintr-o sursa de semnal de ceas, un cicuit de prescalare si un numarator dupa cum se arata in fig.
10.5. Sursa de semnal de ceas este de obicei ceasul principal al DSP-ului, insa unele DSP-uri
folosesc si un semnal extern ca sursa de semnal de ceas.
Scopul prescalatorului este de a reduce frecventa sursei de ceas astfel incat numaratorul sa
poata numara perioade mai lungi de timp. El face acest lucru divizand frecventa sursei de ceas cu
una din mai multe valori selectabile. De exemplu, familia de procesoare Analog Devices - ADSP-
21xx, prescalatorul foloseste o valoare pe 8 biti , divizand ceasul cu un factor de la 1 la 256, iar la

9
familia AT&T - DSP16xx prescalatorul foloseste o valoare reprezentata cu 4 biti pentru a diviza
ceasul.
Numaratorul foloseste acest semnal prescalat ca o sursa de semnal de ceas, in mod obisnuit
numarand descrescator de la o valoare prestabilita pe fiecare front crescator al ceasului.
Numaratorul intrerupe de obicei procesorul cind ajunge la zero. In acest moment numaratorul poate
sa se reancarce cu valoarea anterioara sau poate sa se opreasca, functie de configuratie.
Majoritatea registrilor numarator folosite de circuitele DSP au 16 biti, ceea ce asigura un
domeniu larg de frecvente care pot fi generate. Pe majoritatea circuitelor, utilizatorul poate citi
valoarea stocata in registrul numarator. Aceasta permite DSP-ului sa citeasca registrul numarator la
inceputul si la sfarsitul unui eveniment, calculand astfel durata acestuia.
La procesoarele DSP56000 si DSP56001 (Motorola), generatorul de tact este conectat cu
generatorul de ceas serial asincron. Pentru a folosi si generatorul de tact si generatorul serial de
ceas, pe aceste DSP-uri utilizatorul trebuie sa aleaga o frecventa comuna acceptabila pentru ambele
aplicatii.
Dupa cum s-a mentionat, unele DSP-uri, in mod optional, pot oferi pe un pin de iesire
semnalul de ceas generat. Acest lucru poate fi folositor fie pentru un circuit PLL controlat software
fie pur si simplu pentru un sintetizator de frecventa. Totusi majoritatea DSP-urilor au generatoare
de tact capabile sa genereze doar intreruperi si care nu au pini de iesire.

Fig. 10.5

10.7 Convertoarele A/D si D/A integrate

Unele DSP-uri folosite in aplicatii de voce (de exemplu telefoane digitale celulare sau roboti
telefonici) au convertoare A/D si D/A integrate (numite codec–uri), care pot realiza si compandarea
esantioanelor. Astfel esantioanele semnalului reprezentate in mod normal cu 14÷16 biti sunt
comprimate de regula la 8 biti. Compandarea se efectueaza dupa o anumita regula (uzual legea A
sau legea µ).
Exista un numar de criterii de evaluare a performantelor codec-urilor incorporate:

10
- rezolutia (exprimata in biti) de reprezentare binara a valorii esantioanelor. Tipic, codec-
urile asigura o rezolutie de 8 sau de 16 biti;
- rata de esantionare. Majoritatea codec-urilor produc si accepta esantioane la o rata de 8
Kes/s. Procesoarele din familia Motorola DSP561xx, produc sau primesc esantioane la o rata
cuprinsa intre 16 si 24 Kes/s. In unele cazuri procesorul DSP poate sa proceseze datele pentru a le
reesantiona la o rata dorita;
- raportul semnal/zgomot+distorsiuni. Acest parametru este raportul dintre puterea
semnalului (tipic o sinusoida) si puterea zgomotului si a distorsiunilor introduse de codec. El
reprezinta o masura a fidelitatii codec-ului. Valoarea acestui raport creste odata cu semnalul de
intrare pina la o valoare maxima si apoi scade rapid. De obicei producatorii indica aceasta valoare
maxima care este apropiata de 65 dB. Valoarea acestui parametru poate fi specificata si separat
pentru canalul de intrare respectiv iesire a codec-ului;
- numarul canalelor de intrare analogice. Majoritatea codec-urilor pe incorporate au la
intrare un circuit de multiplexare analogic care permite DSP-ului sa accepte mai multe surse de
semnal;
- castigul de iesire programabil. Codec-urile asigura de obicei castig de iesire programabil
insa domeniul de castig si dimensiunea pasului poate varia;
- oprirea analogica. Un avantaj semnificativ pentru controlul puterii consumate de procesor
este posibilitatea de a opri portiunea analogica a codec-ului cand aceasta nu este folosita.
Doua familii de procesoare cu suport A/D si D/A incorporat in chip sunt DSP561xx
(Motorola) si ADSP-21msp5x (Analog Devices). Ambele familii poseda codec-uri cu rezolutie de
16 biti si o rata de esantionare efectiva de 8 kHz.

10.8 Intreruperile externe

Majoritatea DSP-urilor poseda linii de intreruperi externe. Acestea linii care pot fi activate
de un dispozitiv pentru a comanda intreruperea procesorului. Liniile de intrerupere sunt de doua
categorii:
- cu declansare de front. Un front crescator sau descrescator pe pin activeaza intreruperea.
- cu declansare pe palier. Un nivel inalt sau scazut pe pin activeaza intreruperea.
Unele DSP-uri asigura linii numai cu declansare de nivel sau de front, in timp ce altele
permit liniei de intrerupere sa fie configurata sa fie oricare din cele doua. In general, intreruperile
declansate pe front sunt executate mai rapid decit intreruperile declansate de palier care pot pune
restrictii asupra duratei minime de activare a liniei pentru ca cererea sa fie recunoscuta.
Numarul de linii de intrerupere variaza pentru diferite procesoare, dar majoritatea poseda
intre una si patru linii de intrerupere externe. In general nucleele DSP poseda un numar mai mare de

11
linii de intrerupere decat procesoarele incapsulate. Aceasta deoarece majoritatea DSP-urilor
incapsulate au si un numar de periferice incorporate care folosesc propriile linii de intrerupere
interne. Spre deosebire, majoritatea nucleelor DSP nu au periferice incorporate pe nucleu. Cand
periferice sunt adaugate in afara nucleului, ele folosesc propriile linii de intrerupere.

10.9 Implicatiile pentru proiectantul de sisteme

Perifericele incorporate si interfetele pentru perifericele externe sunt consideratii importante


la selectia unui DSP. Performantele si numarul interfetelor asigurate de diferite DSP-uri pot avea un
impact semnificativ asupra posibilitatii de folosire in aplicatii specifice. Totusi, prezenta unor
interfete I/O prea flexibile sau nenecesare sporesc costul procesorului. Ca si in cazul altor facilitati
ale procesoarelor DSP, mai mult nu inseamna neaparat mai bine. Perifericele incorporate si
interfetele pentru periferice trebuie evaluate cu grija impreuna cu alte specificatii ale procesorului
cum ar fi performanta aritmetica, latimea de banda a memoriei, s.a.m.d.

10.10 Exemple

I. Familia TMS320C54 (TI)

12
Periferice incorporate:
 Generator de stari de wait programabil si comutator de bancuri de memorie programabil
 Generator de tact programabil oscilator intern si cu circuit PLL
 Port serial ful duplex cu transfer pe 8/16 biti
 Port serial cu multiplexare prin divizarea timpului
 Port serial cu buffer
 Port paralel gazda pe 8 biti
 Timmer pe 16 biti
Generatorul de stari de wait programabil poate fi utilizat pentru extensia ciclului extern de
magistrala cu pina la 7 cicli masina pentru sincronizarea procesorului cu memoriile externe sau cu
dispozitivele I/O mai lente. Starile de wait generate prin software nu necesita hardware extern
suplimentar.
Comutarea programabila a bancurilor de memorie poate fi utilizata pentru a insera automat un
ciclu atunci cind se face comutarea de la un banc de memorie de cod sau de date la alt banc. Acest
ciclu suplimentar permite bancului de memorie sa elibereze magistrala inainte ca un alt dispozitiv sa
o foloseasca. In felul acesta se elimina posibilitatea aparitiei conflictelor de magistrala.
Portul gazda de 8 biti este folosit pentru conectarea procesorului gazda cu un alt dispozitiv DSP.
Prin intermediul unei memorii interne de 2KB asociate portului gazda sunt schimbate informatii
intre gazda si un dispozitiv DSP. Memoria portului gazda poate fi accesata atit de procesorul gazda
cit si de circuitul DSP.
Procesorul are 3 porturi seriale: un port serial ful duplex standard, un port serial cu multiplexare
prin divizarea timpului (TDM), un port serial cu buffer.
Sectiunile pentru transmisie si pentru receptie ale portului serial standard au semnale de tact, de
sincronizare a cadrelor si registre pentru serializsare/deserializare separate. Functionarea poate fi
gestionata prin software si cu ajutorul sistemului de intreruperi mascabile.
Portul serial cu multiplexare TDM permite circuitului sa comunice cu pina la 7 dispozitive care
poseda port TDM.
Portul serial cu buffer este o varianta mai performanta a portului serial standard. Prin intermediul
unei unitati speciale autobuffer portul poate citi/scrie direct date din/in memoria circuitului folosind
o magistrala proprie. In acest fel se accelereaza transferul de date cu memoria. Portul poate
transfera pachete de date de 8, 10, 12, 16 biti.
Procesorul are un timmer de 16 biti cu circuit de prescalare de 4 biti. Timmerul lucreaza prin
decrementare. Cind ajunge la valoarea zero timmerul genereaza o cerere de intrerupere.
Generatorul de tact este constituit dintr-un oscilator si un circuit PLL. Generatorul de tact necesita
un semnal de referinta care poate fi generat intern cu un cristal de cuart sau este primit din exterior.
Semnalul de referinta poate fi divizat intern sau poate fi multiplicat cu circuitul PLL pentru a obtine

13
tactul procesorului. Circuitul PLL este un sistem adaptiv care mentine semnalul de tact in
sincronism cu semnalul de referinta. Cind se folosesc instructiunile pentru reducerea consumului
(IDLE1/IDLE2/IDLE3) circuitul PLL realizeaza reducerea frecventei de tact pentru scaderea
consumului.

14
15
II. DSP 56002 (Motorola)

Dispozitive periferice:

 Port gazda de 15 biti cu acces DMA. Liniile pot fi folosite si ca porturi I/O de uz general
 Port serial sincron/asincron cu 6 canale, cu sectiuni separate de transmisie sau receptie
 Port serial de comunicatie cu 3 canale
 Timer/contor de evenimente de 24 de biti
 Suport TDM cu pina la 32 de sloturi de timp selectabile
 Sintetizator de frecventa cu bucla PLL pentru frecvente cuprinse intre 12,2 KHz si 80 MHz.

III. ADSP 21xx (Analog Devices)

1.3 ON-CHIP PERIPHERALS


This section describes the additional functional units which are included
in various processors of the ADSP-2100 family.
1.3.1 Serial Ports
Most ADSP-21xx processors have two bidirectional, double-buffered serial
ports (SPORTs) for serial communications. The SPORTs are synchronous
and use framing signals to control data flow. Each SPORT can generate its
serial clock internally or use an external clock. The framing sync signals
may be generated internally or by an external device. Word lengths may
vary from three to sixteen bits. One serial port, SPORT0, has a

16
multichannel capability that allows the receiving or transmitting of
arbitrary data words from a 24-word or 32-word bitstream. The other
serial port, SPORT1, may optionally be configured as two additional
external interrupt pins (IRQ1 and IRQ0)and the Flag Out (FO) and Flag In
(FI) pins.
1.3.2 Timer
The programmable interval timer provides periodic interrupt generation.
An 8-bit prescaler register allows the timer to decrement a 16-bit count
register over a range from each cycle to every 256 cycles. An interrupt is
generated when this count register reaches zero. The count register is
automatically reloaded from a 16-bit period register and the count
resumes immediately.
1.3.3 Host Interface Port (ADSP-2111, ADSP-2171, ADSP-21msp5x)
The host interface port (HIP) is a parallel I/O port that allows for an easy
connection to a host processor. Through the HIP, an ADSP-21xx DSP can
be used as a memory-mapped peripheral of the host. The HIP operates in
parallel with and asynchronous to the ADSP-21xx’s computational core
and internal memory. The host interface port consists of registers through
which the ADSP-21xx and the host processor pass data and status
information. The HIP can be configured for: an 8-bit data bus or 16-bit
data bus; a multiplexed address/data bus or separate address and data
buses; and separate read and write strobes or a read/write strobe and a
data strobe.
1.3.4 DMA Ports (ADSP-2181)
The ADSP-2181 contains two DMA ports, and Internal DMA Port and a
Byte DMA Port. The IDMA port provides an efficient means of
communication between a host system and the DSP. The port is used to
access the on-chip program memory and data memory of the DSP with
only one cycle per word of overhead. The IDMA port has a 16-bit
multiplexed address and data bus and supports 24-bit program memory.
The IDMA port is completely asynchronous and can be written to while
the ADSP-2181 is operating at full speed.
The internal memory address is latched and then automatically
incremented after each IDMA transaction. An external device can
therefore access a block of sequentially addressed memory by specifying
only the starting address of the block.
The byte memory DMA controller allows loading and storing of program
instructions and data using the byte memory space. The BDMA circuit is
able to access the byte memory space while the processor is operating
normally and steals only one processor cycle per 8-, 16- or 24-bit word
transferred.
1.3.5 Analog Interface
The analog interface of the ADSP-21msp58/59 consists of input amplifiers
and a 16-bit sigma-delta analog-to-digital converter (ADC) as well as a
sigma-delta digital-to-analog converter (DAC) and a differential output
amplifier.

17
Facilitati pentru depanare si gestionarea consumului

Depanarea reprezinta una dintre cele mai dificile etape ale proiectarii. Acest lucru este
valabil in mod special pentru sistemele integrate care lucreaza in timp real, la care accesul la
componentele depanate poate fi foarte limitat si la care poate fi dificil de rulat in alt mod, decat in
timp real. Ca rezultat, elementele care faciliteaza depanarea au devenit tot mai importante pe
masura ce a crescut complexitatea sistemelor.
Una dintre cele mai importante inovatii in acet sens este emularea in circuit bazata pe
scanare (ICE), care combina circuitele de depanare de pe procesor cu pini dedicati pentru
depanare/testare, pentru a permite depanarea functionarii DSP-ului in timp ce acesta este instalat in
sistemul tinta. Depanarea prin emulare in circuit a devenit destul de populara la DSP-uri in ultimii
ani, desi multe alte abordari relative la depanare sunt inca in folosinta (emularea in circuit pe baza
de pod, depanarea bazata pe monitorizare).
In capitol vor fi prezentate facilitatile de depanare bazate pe verificare oferite pe chip.

11.1 Facilitatile de depanare/emulare

Emularea bazata pe verificare foloseste un mic numar de pini dedicati (pana la 4) si o logica
dedicata pentru depanare si emulare in circuit, dupa cum se arata in figura 11.1. Interfetele bazate
pe verificare se conecteaza de obicei la un calculator (PC sau statie de lucru) gazda cu o placa de
interfata speciala. Software-ul de depanare executat pe PC sau pe statia de lucru permite
utilizatorului sa descarce programe, sa examineze si sa modifice registrii si memoria, sa puna sau sa
stearga puncte de intrerupere si sa efectueze alte functii pe DSP in timp ce este instalat in sistemul
tinta.

1
Emularea bazata pe verificare este mult mai putin invaziva decat alte abordari referitoare la
emularea in circuit. Nu are nevoie de scoaterea fizica a procesorului din sistemul tinta si de
inlocuirea acestuia cu un procesor emulator impreuna cu componentele anexa. In loc de aceasta,
placa de interfata pentru depanare din computerul gazda se conecteaza la un conector dedicat din
sistemul tinta, rezultand mai putine legaturi fizice si probleme electrice.
Alt avantaj al depanarii pe baza de verificare este acela ca circuitul de depanare dedicat de
pe chip asigura vizibilitatea unor aspecte ale executiei procesorului care nu sunt disponibile cu
tehnicile conventionale. De exemplu circuitele de depanare pe baza de pod de la Motorola permit
utilizatorului sa examineze continutul liniei de transmisie a procesorului dupa generarea unei
intreruperi.
Emularea pe baza de verificare este frecvent asociata cu “verificarea pe granita” o tehnica
de testare devenita populara in anii 1980. Testarea prin verificarea pe granita (boundary-scan test),
cunoscuta si ca standardul JTAG, se refera la standardul IEEE 1149.1 care defineste un set de reguli
de proiectare pentru facilitarea testarii, programarii si depanarii dispozitivelor semiconductoare la
nivel de cip, de placa si la nivel de sistem. Testarea prin verificarea pe granita presupune
introducerea in cip a unor circuite speciale de test care sa faciliteze testarea circuitului la nivel de
placa si a placii insasi. Aceste circuite suplimentare permit scanarea intrarilor si a iesirilor intr-o
maniera seriala, prevazind circuitul doar cu un numar mic de pini de acces. Beneficiile acestei
tehnici de testare sunt mai multe: reducerea semnificativa a numarului de puncte fizice de testare de
pe placa, cresterea densitatii componentelor pe placa, reducerea timpului de acces pe piata a
produsului, reducerea costului legat de operatiile de testare, cresterea eficientei productiei,
automatizarea operatiei de testare, s.a. Un dispozitiv care satisface cerintele standardului JTAG
poseda: 1) o celula de margine la fiecare linie I/O, 2) o cale de scanare care conecteaza aceste celule
in serie, 3) 4 sau 5 pini suplimentari pentru manipularea semnalelor JTAG, 4) un port pentru
accesare care controleaza semnalele de testare (Test Access Port – TAP), 5) un controler cu 16 stari
a acestui port pentru controlul stadiului operatiei de testare. In mod normal de functionare celulele
de margine permit trecerea semnalelor de intrare/iesire catre/de la pinii I/O. Cind dispozitivul este
plasat in modul „Test” celulele de margine devin active permitind introducerea sau captura
semnalelor de test. Celulele de margine sunt realizate din registri de deplasare cu multiplexare
localizate la periferia circuitului. Caracteristicile logicii de testare a unui circuit care satisface
cpecificatiile standardului JTAG sunt definite intr-un fisier extern denumit BSDL (Boundary-Scan
Description Language) care este oferit de producatorul circuitului si este folosit pentru definirea si
generarea algoritmilor pentru realizarea operatiei de testare. Testarea unui dispozitiv sau a unei
placi pe baza acestei tehnologii consta din urmatoarele etape: a) testerul extern aplica la intrarile
dispozitivului secventele de test, b) celulele de margine de la intrari capteaza semnalele de intrare,

2
c) datele de intrare sunt scanate sau deplasate serial in nucleul dispozitivului, d) datele de iesire
rezultate sunt preluate serial de la nucleul dispozitivului si e) testerul extern compara datele de
iesire cu valorile martor. In felul acesta pot fi identificate defecte de tipul: scurtcircuite sau
intreruperi, lipsa unor componente, componente prost plasate sau defecte. Verificarea pe granita
asigura un mijloc neinvaziv de testare a interconectarii intre circuite, simplu si eficient.
Este interesant ca majoritatea procesoarelor DSP care suporta depanarea pe chip bazata pe
interfata JTAG nu permite verificarea pe granita. Microprocesoarele si DSP-urile au din ce in ce
mai mult capabilitati de depanare pe baza de verificare. DSP-urile care folosesc JTAG pentru
depanarea pe baza de verificare includ: familia ADSP-210xx (Analog Devices), familia DSP16xx
(AT&T), familia μPD7701x (NEC), familiile TMS320C2xx, TMS320C3x, TMS320C4x,
TMS320C5x, TMS320C54x, TMS320C80 (Texas Instruments). Toate procesoarele Motorola cu
exceptia familiilor DSP56000, DSP56001 si noua familie DSP563xx, au o facilitate de depanare
bazata pe verificare numita OnCE (On Chip Emulation) care foloseste un protocol serial propriu,
similar cu JTAG. (DSP56000 si DSP56001 nu au emulare pe chip, iar familia DSP563xx foloseste
JTAG pentru a accesa propriile facilitati de emulare de pe chip).
Capabilitatile de depanare hardware existente pe chip variaza foarte mult. Ca un minim,
toate procesoarele cu depanare hardware pe chip permit utilizatorului sa citeasca si sa scrie registrii
procesorului si memoria. Majoritatea asigura unul sau doua puncte de intrerupere (numite si puncte
de intrerupere cu potrivire de adresa). Aceste puncte de intrerupere sunt implementate incarcand o
adresa in componentele de depanare de pe chip, spre deosebire de inlocuirea unei instructiuni din
programul procesorului cu o instructiune software capcana. Un avantaj al punctelor de intrerupere
hard pe unele procesoare este ca pot fi de asemenea folosite pentru a opri procesorul cand acesta
incearca sa acceseze o locatie de memorie de date (spre deosebire de o locatie a memoriei de
program). Componentele de depanare de pe chip asigura un “tampon de urmarire a
discontinuitatilor de program”, care economiseste valorile numaratorului de program pentru
ultimele cateva momente de ramificare sau cand procesorul a raspuns unei intreruperi. Aceasta
informatie de anterioritate poate fi folositoare in a intelege de ce procesorul a ajuns sa execute o
anumita portiune de cod.
Furnizorii de procesoare DSP nu descriu de obicei posibilitatile exacte ale componentelor de
emulare pe chip in documentatia de procesor. (Motorola este o exceptie, asigurand o documentatie
detaliata asupra portului “OnCE”). In loc de aceasta, utilizatorul trebuie sa isi dea seama de
capabilitatile prezente dupa ceea ce ofera uneltele de emulare software ale procesorului.

3
11.2 Consumul de energie si managementul acestuia

Numarul de aplicatii DSP portabile a crescut dramatic in ultimii ani. DSP-urile sunt acum
folosite in mod obisnuit in echipamentele portabile (telefoanele celulare, pagere, PDA-uri,
computere laptop si echipamente audio). Toate aceste aplicatii necesita alimentare de la baterii, iar
viata bateriei este o diferentiere cheie intre produse. Ca rezultat, proiectantii cauta mereu noi moduri
de a reduce consumul.
Furnizorii de DSP-uri au raspuns acestei provocari in multiple feluri. In primul rand,
aproape toti producatorii au introdus DSP-uri care functioneaza la tensiune scazuta, capabile de a fi
folosite la tensiune de alimentare nominala de 3 sau 3,3 V. In al doilea rand, multi furnizori au
adaugat capabilitati de management al puterii sub control soft sau hard. Ambele variante sunt
discutate in continuare.

11.2.1 Functionarea la tensiuni scazute


O prima cale de reduceere a consumului consta in folosirea unor tehnologii adecvate de
fabricatie a circuitelor. Din acest punct de vedere tehnologiile CMOS sunt caracterizate printr-un
consum redus de energie.
Unul dintre primii pasi pe care furnizorii de DSP-uri i-au facut pentru a reduce consumul de
putere a fost de a reduce tensiunea de alimentare a circuitului. Practic toate procesoarele DSP
actuale sunt fabricate cu tehnologie CMOS. Deoarece consumul de energie in circuite CMOS este
proportional cu patratul tensiunii, s-au realizat economii mari reducand tensiunea de alimentare.
Majoritatea producatorilor de DSP-uri ofera acum procesoare care folosesc o sursa nominala de
3,3V (numita three-volt parts), care reduce consumul de putere cu 56% comparativ cu acelasi
procesor operand la 5V. Unele DSP-uri de tensiune scazuta (ca de exemplu cele de la AT&T si
Texas Instruments) pot functiona cu o tensiune de alimentare nominala de pana la 3V, reducand si
mai mult consumul de putere.

Nota
Folosim termenul “nominal” cand ne referim la tensiunea de alimentare ale DSP-urilor. In
mod tipic, componentele electronice cum sunt procesoarele DSP, pot functiona intr-o gama de +/-
10% in jurul tensiunii de alimentare nominale. Astfel, un echipament de 3,3V poate opera intre 3 si
3,6V. Similar un echipament de 3V poate opera intre 2,7 si 3,3V. Intr-o incercare de a castiga un
avantaj pe piata, unii comercianti au declarat tensiunea de alimentare minima in descrierea
procesoarelor. Acest lucru poate crea o confuzie: o componenta descrisa ca functionand la 3V

4
inseamna ca tensiunea sa nominala de alimentare este 3V sau 3,3V? Pentru consistenta, vom folosi
valori de tensiuni nominale pe parcursul prezentarii.
In unele cazuri, DSP-uri de tensiune scazuta, sunt de fapt componente de 5V capabile de a
functiona la tensiuni mai scazute. In astfel de cazuri, tactul sistemului trebuie redus, pentru a
permite operarea la tensiuni mai joase. Furnizorii de DSP-uri au inceput de asemenea sa introduca
variante “adevarate” de 3V a DSP-urilor lor, capabile de a functiona la viteza maxima la 3 sau 3,3V.
Procesoare DSP cu tensiune scazuta includ: familiile AT&T - DSP16xx si DSP32xx;
ADSP-2103 ADSP-2173, ADSP-2183 si ADSP-2106x (Analog Devices), PineDSPCore si
OakDSPCore (DSP Group), IBM - MDSP2780, Motorola - DSP56L002 si DSP563xx; NEC -
μPD77015, μPD77017 si μPD77018, SGS-Thomson - D950-CORE, Texas Instruments -
TMS320LC3x, TMS320LC5x, TMS320VC54x si TMS320C80.

11.2.2 Posibilitatile de management a energiei


Pe langa functionarea la tensiune scazuta, multe procesoare incorporeaza posibilitati de
management a energiei. Aceste capabilitati asigura controlul asupra frecventei tactului principal al
procesorului sau asupra unor parti ale procesorului care primesc semnalul de tact. Aceste abordari
functioneaza din doua motive. In primul rand circuitele CMOS consuma energie proportionala
liniar cu frecventa de tact. Cu cat frecventa tactului este mai mare, cu atat echipamentul consuma
mai multa energie. Astfel, reducand frecventa de tact sau limitand portiunile din procesor care
primesc semnal de tact se reduce consumul de energie.

 Modurile adormit si asteptare


Aceste moduri, in mod tipic, opresc ceasul procesorului la toate sectiunile procesorului (cu
cateva exceptii). In timp ce este adormit (sleep mode), procesorul nu functioneaza; pur si simplu sta
in asteptare, pentru un eveniment care produce „trezirea”. In majoritatea cazurilor acest eveniment
poate fi orice tip de intrerupere nemascabila. Daca intreruperea vine de la perifericele de pe chip,
asta implica ca acele periferice sunt active si primesc un semnal de tact, crescand consumul de
putere. Ca rezultat, unele procesoare au doua moduri de adormit: unul in care perifericele de pe chip
sunt activate (si pot intrerupe, deci „trezi”, procesorul) si unul in care perifericele de pe chip sunt
dezactivate. In ultimul mod, numai o intrerupere externa (care poate veni de la unul sau doi pini
speciali), poate „trezi” procesorul. De fapt, unele procesoare pot fi „trezite” din anumite moduri
adormit, numai prin activarea semnalului RESET.
In modurile adormit se intra in mod normal prin executia unei instructiuni speciale (IDLE,
sau alt nume similar), sau prin setarea unui bit intr-un registru de control. Unele procesoare asigura
si pini pe care ii poate folosi un echipament extern pentru a forta aducerea procesorului intr-o stare

5
de consum redus. Procesoarele care au pini de comanda a regimului de consum redus pot avea si un
pin de confirmare a regimului de consum redus prin care semnaleaza circuitelor externe ca
procesorul a intrat in modul adormit.
Procesoarele din familia TMS320C5x (TI) au un regim de consum redus (power-down
mode) in care consumul este sensibil mai redus decit in regimul normal de lucru. Procesorul intra

in acest regim prin executia instructiunilor IDLE1/IDLE2 sau prin activarea liniei HOLD cind bitul
de stare HM este setat. Cind procesorul este comutat in regimul de consum redus toata starea
interna este conservata; aceasta permite reluarea functionarii cind procesorul iese din acest regim.
Dupa executia instructiunii IDLE1 perifericele interne continua sa functioneze; in schimb, cind este
executata instructiunea IDLE2 tot procesorul, inclusiv perifericele interne, intra in regim de consum
redus.
Latenta de trezire poate fi o preocupare in unele aplicatii. Latenta de trezire este timpul
necesar pentru a iesi dintr-un mod adormit si a relua executia normala. In cazurile cand procesorul
foloseste un ceas extern ca ceas principal, aceasta latenta este de obicei de 1 sau 2 cicluri
instructiune. Dupa cum se va discuta ulterior, un procesor poate folosi un oscilator intern in
combinatie cu un cristal extern pentru a genera un semnal de ceas. In acest caz, daca modul adormit
dezactiveaza oscilatorul intern, o latenta de trezire de mii (chiar zeci de mii) de cicluri de
instructiuni poate fi necesara pana cand oscilatorul se stabilizeaza. O problema similara are loc cu
ceasurile comandate cu circuite PLL (oscilatoare cu calare de faza) de pe chip: oprirea PLL-ului
reduce consumul de putere, insa PLL-ul poate avea nevoie de un interval semnificativ de timp cand
reporneste.

 Controlul frecventei ceasului


Multe aplicatii nu au nevoie de toata viteza de executie a procesorului la toate momentele de
timp. De exemplu, un telefon celular sta majoritatea timpului in asteptare. Chiar atunci cand este
folosit, are nevoie de toata puterea de procesare doar cand se vorbeste nu si in perioadele de liniste.
Pentru a exploata aceasta observatie, mai multe DSP-uri permit programatorului un anumit
control soft asupra frecventei ceasului principal al DSP-ului. Aceasta reprezinta un compromis intre
operarea la intreaga viteza si un mod adormit, din moment ce DSP-ul executa inca instructiuni si
consuma energie, insa la o rata redusa.
Cele doua mecanisme pentru controlul ceasului sunt: divizoarele de ceas si sursele de ceas
de viteza mica. Un divizor de ceas, permite reducerea frecventei ceasului sistemului cu un factor
programabil, care reduce viteza de executie si consumul de putere proportional. De exemplu,
familiile DSP5600x si DSP56166 (Motorola), asigura divizoare de ceas de 4 biti care permit
frecventei ceasului principal sa fie impartita in una din cele 16 valori. Similar, DSP Group ofera

6
macrocelule de divizare a ceasului pentru nucleele DSP, PineDSPCore si OakDSPCore.
TMS320LC31 si TMS320C32 (Texas Instruments) au o instructiune LOPOWER care reduce
frecventa de ceas cu factorul 16.
Unele DSP-uri (de exemplu, procesoarele familiei AT&T - DSP16xx) pot folosi un oscilator
pe chip de mica viteza ca sursa de ceas principal. Desi nu e la fel de flexibil ca un divizor de ceas,
care suporta multiple viteze, totusi e suficient pentru multe aplicatii.

 Perifericele si controlul operatiilor I/O


Dupa cum s-a mentionat, cu cat exista mai multe circuite CMOS cu semnal de ceas, cu atat
cipul va consuma mai multa energie. Deoarece multe aplicatii nu folosesc (simultan) toate
perifericele de pe chip, aproape toate DSP-urile asigura cai de a dezactiva perifericele nefolosite.
Pe langa acestea, sectiunile analogice ale unor periferice cum ar fi convertoare A/D si D/A
de pe chip pot sa consume putere chiar daca nu mai beneficiaza de semnal de ceas. Pentru a evita
acest lucru, unele DSP-uri au moduri speciale adormit pentru circuitele lor analogice. DSP-urile cu
aceasta capabilitate includ: procesoarele Analog Devices - ADSP-21msp5x si familia Motorola -
DSP561xx.

 Dezactivarea pinilor de iesire de ceas nefolositi


Un numar de chipuri DSP asigura un pin de iesire de ceas. Acest pin asigura un semnal de
ceas dreptunghiular la frecventa ceasului principal al procesorului (sau o frecventa apropiata – de
exemplu, o jumatate din aceasta) si e folosit pentru furnizarea unui semnal ce ceas pentru circuitele
externe, sincronizat cu semnalul de ceas principal al procesorului.
Unele DSP-uri pot dezactiva selectiv acest pin. Daca semnalul de ceas generat nu este
folosit, sau este folosit numai ocazional, dezactivarea liniei respective reduce consumul; puterea
economisita depinde de sarcina capacitiva externa de pe pin. Pe langa aceasta, dezactivarea ceasului
de iesire reduce si interferentele electromagnetice generate de DSP.
Familiile Motorola - DSP5600x, DSP56166 si AT&T - DSP16xx sunt exemple de
procesoare care isi pot dezactiva liniile de iesire.

7
Procesoare digitale de semnal in virgula fixa

Dezvoltarea rapida a procesoarelor digitale de semnal (DSP) este in parte explicata de


flexibilitatea, rapiditatea si pretul de cost scazut oferit pentru dezvoltarea aplicatiilor. Printre
domeniile majore de utilizare se numara cel al retelelor precum si domeniul
telecomunicatiilor. Procesoarele de semnal sunt folosite in infrastructura sistemelor fara/cu
fir pentru comunicatia de voce (sau video) pe Internet. De asemenea, in domeniul
comunicatiilor, aplicatiile DSP se regasesc pe scara larga in infrastructura, in echipamentele
portabile si in produsele de larg consum.
Familia de procesoare in virgula fixa oferita de Texas Instruments cuprinde trei
generatii: TMS320C2000 (C24x si C28x), TMS320C5000 (C54x si C55x) si TMS320C6000
(C62x si C64x). Fiecare generatie din familia TMS320 consta dintr-un nucleu (CPU) similar
impreuna cu diferite configuratii de memorie si dispozitive periferice. Generatia
TMS320C2000 integreaza facilitati de calcul si periferice similare microcontrolerelor si este
optimizata pentru aplicatii de control, cum sunt: comanda a motoarelor electrice, sursele de
alimentare cu comanda digitala, sisteme de senzori inteligenti. Generatia TMS320C5000 este
destinata pentru realizarea eficienta a produselor de larg consum, permitind totodata
adaugarea unor noi facilitati cum sunt aplicatiile pentru Internetul mobil si pentru alte produse
electronice portabile. TMS320C6000 este generatia destinata aplicatiilor de inalta
performanta, optimizata pentru usurarea programarii in limbaje de nivel inalt. Procesoarele
familiei sunt destinate aplicatiilor care cer un volum mare de calcule, cum sunt cele legate de
prelucarea imaginilor, infrastructura retelelor de comunicatie multicanal de banda larga din
generatia 3G, echipamente digitale de abonat si de cablu.

Familia TMS320C2000
TMS320C2000 este o familie de procesoare care opereaza in virgula fixa pe 16/32
biti. Arhitectura Harvard a familiei TMS320 este destinata special aplicatiilor de prelucrare
digitala a semnalelor in timp real. Procesoarele din generatia C2000 ofera facilitati de
prelucrare de inalta preformanta cu periferice de tip microcontroler la un pret de cost redus.
In prezent familia contine doua tipuri de procesoare: TMS320C24x (procesoare pe 16 biti,
care executa 40 MIPS) si TMS320C28x (procesoare pe 32 biti cu o productivitate de pina la
400 MIPS). Structura lor este data in Fig. 1 si in Tabelul 1 sunt date principalele caracteristici
ale procesoarelor din fiecare familie.

1
Fig. 1

Tabelul 1

2
Arhitectura C2000 foloseste doua magistrale principale: una pentru coduri si una pentru date.
Magistrala pentru coduri este destinata transferului codului instructiunilor si a operanzilor de
tip imediat din memoria de program. Magistrala pentru date interconecteaza elementele
functionale, cum ar fi CPU si memoria pentru date. In felul acesta arhitectura Harvard
maximizeaza puterea de prelucrare asigurind accesarea simultana a codurilor si a datelor cu
viteza mare. Prin modificarea arhitecturii Harvard clasice la procesoarele familiei C2000 pot
fi executate transferuri intre memoria pentru coduri si memoria pentru date. Aceasta face
posibila stocarea coeficientilor in memoria pentru program, eliminind necesitatea folosirii
unei memorii ROM separate pentru coeficienti.
Procesoarele C2000 contin trei unitati functionale care lucreaza concurent: controlerul
pentru program, CPU si generatorul de adrese pentru date (DAGEN). Unele functiuni DSP
critice (de exemplu, multiplicarea 16x16 biti intr-un singur ciclu de tact, deplasarea datelor,
prelucrarea adreselor) sunt executate de unitati hardware in timp ce la microprocesoarele de
uz general aceste operatii sunt executate prin software sau prin microcod. De asemenea
procesoarele incorporeaza citeva dispozitive periferice avansate, optimizate pentru functiuni
de control, ceea ce confera procesoarelor calitatile unor microcontrolere performante
(procesoarele din aceasta generatie sunt denumite de firma Digital Signal Controllers). In plus
pentru cresterea performentelor procesoarele C2000 folosesc un pipeline cu patru etaje.

3
Formatul instructiunilor in limbajul de asamblare al procesoarelor C2000 este
urmatorul:
[label] ADD dma[,shift1] ;adresare directa
[label] ADD ind [,shift1[ARn]] ;adresare indirecta
[label] ADD #k ;adresare imediata scurta
[label] ADD #1k[,shift2] ;adresare imediata lunga
unde:
0≤ dma ≤127 -este o adresa pentru memoria de date (sau un simbol definit cu
directiva asamblorului .equ sau .set folosind modul de adresare direct);
0≤ shift1 ≤16 (default 0) -reprezinta numarul de ranguri pentru deplasare la
stinga;
0≤ ARn ≤7 -specifica registrul de adresa pentru urmatoarea instructiune;
0≤ k ≤255 -reprezinta o data imediata de 8 biti;
-32768≤ 1k ≤32767 -este o data imediata de 16 biti;
0≤ shift2 ≤15 -reprezinta numarul de ranguri pentru deplasare la stinga
ind -semnifica modul de adresare indirecta
Acestia sunt operanzii cei mai frecvent folositi de instructiunile limbajului de asamblare a
procesoarelor C2000. Operanzii pot fi constante sau expresii temporare ale asamblorului
referitoare la memorie, porturi I/O, registre, pointeri, contoare pentru deplasari sau diferite
alte constante.

Unitatea centrala de prelucrare – CPU


Dupa cum este aratat in Fig. 2 principalele componente ale CPU sunt: deplasatorul
(shifter) de la intrare, multiplicatorul hardware paralel, deplasatorul pentru produs de la
iesirea multiplicatorului, unitatea aritmetica si logica - ALU, acumulatorul – ACC,
deplasatorul de la iesirea ACC si din unitatea aritmetica pentru registrele auxiliare – ARAU.
Pentru stocarea in memorie pe 16 biti acumulatorul de 32 de biti poate fi impartit in doua
registre de 16 biti, ACCH (bitii b31-b16), respectiv ACCL (bitii b15-b0).

4
5
Fig. 2
 Deplasatorul de intrare
Produce o deplasare la stinga cu 0 pina la 16 ranguri a datelor de 16 biti din memoria
pentru program sau pentru date. Deplasarea poate fi indicata fie de un cimp special de biti din
codul instructiunii fie de cei mai putin semnificativi 4 biti ai registrului temporar TREG. Bitii
de ordin inferior ai deplasatorului de 32 de biti sunt completati cu zerouri, iar bitii mai
semnificativi liberi sunt completati fie cu zerouri fie reprezinta o extensie a semnului in
functie de valoarea bitului de extensie a semnului (SXM) din registrul de stare ST1. Bitul
SXM poate fi setat cu instructiunea SETC SXM sau resetat cu instructiunea CLRC SXM.
Deplasatorul de intrare poate fi invocat cu o instructiune de incarcare, cu una de adunare sau
de scadere referitoare la acumulator. De exemplu, instructiunea
LACC dma,shift1
incarca in acumulator data din memorie de la adresa dma, deplasata in prealabil la stinga cu
shift1 ranguri. Similar actioneaza si instructiunea ADD dma, shift1. In ambele cazuri operatia de

deplasare este inclusa in instructiune si nu necesita timp suplimentar pentru executie. In cazul
anterior deplasarea este specificata de codul instructiunii. Exista si posibilitatea ca deplasarea
sa fie indicata de 4 biti de ordin inferior ai registrului TRAG, ca in exemplul urmator:
LACT dma

6
Folosind registrul TRAG este posibil ca factorul de scalare sa fie stabilit in mod dinamic. De
asemenea, deplasatorul de intrare poate fi utilizat pentru multiplicarea unor date cu intregi
care sunt puteri ale lui 2.
 Multiplicatorul
Este constituit din patru unitati: matricea de multiplicare de 16x16 biti care genereaza
un produs de 32 de biti intr-un singur ciclu, registrul TREG de 16 biti care furnizeaza unul
dintre operanzii multiplicatorului, registrul pentru produs de 32 de biti – PREG si deplasatorul
pentru produs. Produsul din registrul PREG poate fi transferat in acumulator cu instructiunea
PAC, sau poate fi stocat in memoria de date de 16 biti cu instructiunile SPH (cuvintul mai

semnificativ din PREG), respectiv SPL (cuvintul mai putin semnificativ din PREG).

Multiplicatorul accepta doua intrari, una de la registrul TREG, iar cealalta de la


memoria pentru date sau program. Daca ambii operanzi sunt localizati in memoria pentru
date, unul dintre ei trebuie transferat intii in TREG folosind instructiunea LT dma. Instructiuni
mai puternice pentru incarcarea registrului TREG sunt: LTA dma - incarca TREG si
acumuleaza produsul anterior, LTP dma – incarca TREG si stocheaza PREG in ACC, respectiv
LTS dma – care incarca TREG si scade din acumulator produsul anterior.

De exemplu, instructiunea:
LTA dma
incarca in TREG data de la adresa dma, deplaseaza continutul registrului PREG dupa cum
este specificat de bitii de mod pentru deplasarea produsului – PM, si apoi il aduna la
acumulator. In plus, instructiunea:
LTD dma

7
realizeaza operatia LTA plus o operatie de tip DMOV. Aceasta instructiune extrage operandul
pentru multiplicare de la adresa dma si apoi incarca aceasta data in memorie la adresa imediat
superioara. Aceasta operatie este eficienta pentru recircularea datelor dintr-un buffer cum este
cazul filtrelor RFI. Pentru a executa recircularea datelor cu una dintre instructiunile DMOV,
LTD sau MACD esantioanele semnalului trebuie incarcate in buffer dupa cum urmeaza: la
adresa cea mai mica esantionul cel mai recent - x(n), la adresa mai mare urmatoare - x(n-1),
s.a.m.d.
Instructiunea MPY dma aduce cel de al doilea operand al multiplicarii din memorie de
la adresa dma si executa operatia de multiplicare. Deoarece inmultirea a doua numere binare
de 16 biti cu semn produce un rezultat de 32 de biti cu doi biti de semn, stocarea in memoria
de 16 biti a rezultatului impune o deplasare la stinga cu un bit pentru eliminarea bitului
suplimentar de semn si apoi stocarea celor mai semnificativi 16 biti.
Deplasatorul de produs deplaseaza la stinga datele din registrul de PREG. Bitii PM din
registrul de stare ST1 indica modul de functionare a acestui deplasator dupa cum este aratat in
tabelul urmator:
PM Felul deplasarii
00 fara deplasare
01 deplasare stinga 1 bit
10 deplasare stinga 4 biti
11 deplasare dreapta 6 biti

Bitii PM pot fi setati cu instructiunea:


SPM constant ;set product shift mode
unde 0≤ constant ≤3. Iesirea PREG poate fi de asemenea deplasata la dreapta cu 6 biti pentru a
putea executa minimum 128 de operatii succesive de multiplicare si acumulare fara ca sa
apara depasire de scala.
Cele mai puternice instructiuni pentru multiplicare si acumulare (sau scadere) a
produsului anterior sunt: MPYA (multiplica si acumuleaza produsul anterior) si MPYS
(multiplica si scade produsul anterior). De exemplu, la instructiunea:
MPYA dma
data din registrul TREG este inmultita cu data din memorie si apoi produsul este stocat in
PREG. In acelasi timp, produsul anterior din PREG este deplasat dupa cum indica bitii PM si
apoi este adunat la ACC.
 Unitatea aritmetica si logica
Unitatea aritmetica si logica (ALU) executa operatii de adunare, scadere, operatii
logice si operatii de manipulare a bitilor (testare, deplasare, rotatie). Dupa cum este aratat in

8
Fig. 3, unitatea contine ALU propriu-zis, acumulatorul si deplasatorul de la iesire. Rezultatul
operatiilor efectuate de ALU este stocat in ACC. De exemplu:
ADD dma[,shift1] ;add data in memory to ACC with shift
APAC ;add PREG to ACC
In primul exemplu, continutul locatiei de memorie de la adresa dma este deplasat stinga cu
shift1 biti de deplasatorul de la intrare si apoi este adunat la ACC. In exemplul al doilea
continutul lui PREG este deplasat de deplasatorul de produs dupa cum este indicat de bitii PM
si apoi este adunat la ACC.

Dupa cum este aratat in Fig. 3, acumulatorul ACC de 32 de biti este impartit in doua
segmente de 16 biti: ACCH (bitii b31-B16) si ACCL (bitii b15-b0). ACC poate sa execute
deplasarea sau rotirea continutului. Bitul de transport – C este afectat de operatiile de
adunare/scadere din ACC si de operatiile de deplasare/rotatie a continutului ACC. Bitul C
permite o realizare mai eficienta a operatiilor in precizie extinsa.
Deplasatorul de la iesirea ACC poate executa deplasarea la stinga cu 0 pina la 7 biti.
Deplasarea este executata cind data este transferata din ACC in memorie. Cind deplasatorul
este folosit pentru ACCH bitii mai semnificativi sunt pierduti, iar bitii mai putin semnificativi
sunt incarcati cu bitii mai semnificativi deplasati din ACCL. Cind deplasatorul este folosit
pentru ACCL, bitii mai semnificativi sunt pierduti, iar bitii mai putin semnificativi sunt
incarcati cu zero.
Inmultirea a doua numere de 16 biti cu semn produce un rezultat cu 32 de biti ditre
care doi biti sunt bitii de semn. Fixind bitii PM pentru o deplasare stinga cu un bit poate fie

9
eliminat unul dintre bitii suplimentari de semn. O alternativa consta in a aduna produsele in
ACC fara deplasare si de a elimina bitul suplimentar de semn atunci cind data din ACC este
salvata in memorie cu instructiunea:
SACH yn,1 ;left shift one bit and save ACCH to yn
Avantajul este ca exista un bit de garda in acumulator pentru operatii consecutive de inmultire
si acumulare.
 Registrele auxiliare
Dupa cum este aratat in Fig. 4, procesoarele C2000 au 8 registre auxiliare de 16 biti
pentru adresarea datelor din memorie (AR ÷ AR7). In modul de adresare indirecta cu registru,
registrul auxiliar curent, specificat de registrul pointer ARP, este folosit ca pointer pentru
memoria de date. Oricare dintre cele 8 registre auxiliare poate fi utilizat ca pointer pentru
accesarea memoriei de date. Continutul registrelor auxiliare este actualizat de o unitate
aritmetica speciala (ARAU) in paralel cu operatiile executate de ALU. Una din intrarile
ARAU poate fi: cei 8 biti mai putin semnificativi din codul instructiunii, continutul registrului
AR0, sau o data din memorie, iar cealalta este continutul registrului auxiliar curent specificat
de ARP. Prin urmare, accesarea unei secvente de date din memorie nu solicita ALU care
executa in paralel operatii cu datele. Registrele auxiliare si ARP pot fi incarcate cu date din
memorie, ACC, PREG sau cu date imediate. Registrul auxiliar curent este selectat incarcind
in ARP un pointer de adresa de 3 biti. De exemplu, instructiunea MAR *,AR2 incarca 2 in ARP
astfel ca registrul curent folosit de instructiune este AR2. De asemenea, ARP este fixat
indirect de multe instructiuni care folosesc modul de adresare indirect, cu urmatoarea sintaxa:
mnemonic ind[,shift[,ARn]]
unde ultimul cimp optional ARn incarca valoarea lui n in ARP pentru a specifica urmatorul
registru auxiliar. In felul acesta urmatorul AR este stabilit fara a necesita un ciclu suplimentar.
AR poate fi initializat cu instructiunea LAR (Load Auxiliary Register), ca in exemplul
urmator:
LAR AR1,#k (sau#1k)
AR1 este incarcat cu constanta de 8 biti k (sau cu valoarea 1k de 16 biti).
De exemplu, daca ARP = 1, instructiunea:
ADD *+
aduna la acumulator data din memorie adresata cu AR1 si apoi incrementeaza cu 1 continutul
lui AR1. La fel, instructiunea:
ADD *0+
aduna continutul registrului AR curent cu o valoare intreaga fara semn de 16 biti continuta in
AR0 si apoi aduna la ACC data din memorie de la adresa rezultata. Operanzii *BR0+ si *BR0-
genereaza adrese cu inversarea bitilor pentru implementarea algoritmilor TFR.

10
ARAU poate executa sase operatii cu adresare indirecta, secificate in tabelul urmator:

Operand Operatia executata


* None
*+ ARn  ARn+1
*- ARn  ARn-1
*0+ ARn  ARn+AR0
*0- ARn  ARn-AR0
*BR+ ARn  ARn+AR0 with bit-reversed carry
*BR- ARn  ARn-AR0 with bit-reversed carry

In cazul modului de adresare directa, codul instructiunii contine cei 7 biti mai putin
semnificativi ai dma. Pentru a genera o adresa de 16 biti pentru memoria de date acestia sunt

11
concatenati cu 9 biti furnizati de registrul de selectie a paginii (DP). DP poate selecta una din
512 pagini de memorie fiecare avind 128 de cuvinte. DP poate fi initializat cu instructiunea
LDP (Load Data Page Pointer) sau cu instructiunea LST (Load Status Register).

 Registrele de stare

Procesoarele C2000 au doua registre de stare, ST0 si ST1, care contin bitii de stare si
de control. Aceste registre pot fi stocate sau incarcate din memoria pentru date, astfel incit
starea procesorului poate fi salvata/restaurata in vederea executarii subrutinelor. Pentru
aceasta sunt disponibile instructiunile: LST (Load Status Register) si SST (Store Status
Register). Bitii individuali din aceste registre pot fi setati/resetati cu instructiunile
SETC/CLRC. De exemplu:
SETC INTM ;set interrupt mode bit
SETC OVM ;set overflow saturation mode

Controlul programului
Controlerul de program este o unitate functionala independenta care stabileste ordinea
de executie a instructiunilor. El include: contorul de program – PC, stiva si registrii de stare.
Elementele software care pot modifica fluxul programului sunt instructiunile de salt, apelare
si revenire din subrutine, instructiunile conditionate, de repetare si intreruperile.
 Contorul de program si stiva
Procesoarele C2000 poseda un contor de program de 16 biti. Cind codul este executat
secvential PC este incrementat cu 1 sau cu 2, dupa cum instructiunea curenta contine unul sau
doua cuvinte. Cind este executata o instructiune de salt PC este incarcat cu o adresa “lunga”,
operand a instructiunii. Cind este executata o instructiune de apelare intii este salvata in stiva
adresa urmatoarei instructiuni si apoi este incarcata adresa de salt specificata de instructiune.

12
Stiva este folosita pe durata executarii intreruperilor si a apelurilor de subrutine.
Procesoarele C2000 folosesc o stiva hardware cu 8 nivele. Cind procesorul executa o
instructiune de apelare sau o intrerupere adresa de revenire este automat salvata in stiva. La
executarea instructiunii de revenire adresa de revenire este transferata din virful stivei in PC.
De asemenea, stiva poate fi accesata si cu instructiunile PUSH si POP. Instructiunile PSHD si
POPD transfera o data din memorie in stiva si invers. Aceste instructiuni pot fi utilizate pentru

organizarea unei stive software in memoria de date pentru imbricarea subrutinelor sau a
intreruperilor care necesita mai mult de 8 nivele pentru stiva.
Continutul ACCL poate fi incarcat in PC pentru a implementa operatii de salt sau de
apelare conditionate de rezultatele calculului. Pentru aceasta sunt disponibile instructiunile
BACC (branch to address specified by ACC) sau CALA (call subroutine at location specified by

ACC).
 Executarea salturilor
Procesoarele C2000 poseda citeva instructiuni de salt pentru implementarea
structurilor pentru controlul programului folosite in programele C. Exista doua tipuri de
salturi: neconditionate, respectiv conditionate. Instructiunea de salt neconditionat determina
incarcarea in PC a adresei memoriei pentru program specificata de instructiune. De exemplu:
B dst_label ;branch unconditionally to dst_label
Adresa incarcata in PC, dst_label, este operandul instructiunii. In cazul saltului conditionat
intii sunt evaluate conditiile care determina efectuarea saltului, si in situatia cind aceste
conditii sunt indeplinite acesta este executat. De exemplu, instructiunea:
BCND pma [,cond1][,cond2][,.....] ;branch conditionally
Determina saltul la adresa pma daca toate conditiile specifiate sunt indeplinite. Conditiile care
pot fi specificate sunt prezentate in Tabelul 2.
 Executarea buclelor
Cea mai simpla metoda pentru implementarea buclelor consta in folosirea instructiunii
BANZ a carei sintaxa este:
[label] BANZ pma[,ind[,ARn]]
Adresa pma de 16 biti a memoriei de program poate fi o eticheta folosita de limbajul de
asamblare sau o adresa numerica. Programul executa salt la adresa specificata cind ARn nu
este zero. Pentru ca o secventa de program sa fie executata de N ori, secventa este incheiata cu
instructiunea BANZ, iar registrul auxiliar folosit drept contor este initializat cu valoarea N-1
inaintea de a incepe executarea buclei.
Tabelul 2
Operand Conditia Descriere
EQ ACC=0 None

13
NE ACC≠0 ACC not equal to 0
LT ACC<0 ACC less then 0
LEQ ACC≤0 ACC less then or equal to 0
GT ACC>0 ACC greater then 0
GEQ ACC≥0 ACC greater then or equal to 0
C C=1 Carry bit set to 1
NC C=0 Carry bit set to 0
OV OV=1 ACC overflow detected
NOV OV=0 No overflow detected
BIO BIO is low BIO pin is low
TC TC=1 Test/control flag set to 1
NTC TC=0 Test/control flag set to 0

Particularitati de programare
Implementarea algoritmilor DSP necesita realizarea unor operatii speciale, cum sunt
cele de multiplicare si acumulare. De aceea arhitectura si setul de instructiuni a fost optimizat
pentru realizarea eficienta a acestor operatii.
 Repetarea instuctiunilor
Instructiunea RPT determina executarea de N-1 ori a instructiunii care urmeaza. De
exemplu, secventa:
RPT #k ;repeat next instruction k+1 time
ADD *+ ;add k+1 samples to the ACC
incarca valoarea k de 8 biti in contorul de repetare (RPTC) determinind executarea
instructiunii ADD de k+1ori. RPTC poate fi incarcat si cu o data din memorie de 16 biti
determinind executarea instructiunii urmatoare de maximum 65536 ori. Dupa extragerea
codului din memoria de program el este introdus intr-un buffer de repetare astfel incit la
repetarea executiei codul este citit din acest buffer. De exemplu, instructiunea TBLR (Table
Read) necesita trei sau mai multi cicli pentru executie dar cind instructiunea este repetata
acest lucru are loc intr-un singur ciclu. De notat ca nu toate instructiunile pot fi repetate.

 Operatia de multiplicare si acumulare


Instructiunile de multiplicare si adunare, MAC si MACD, folosesc deplin capacitatea
multiplicatorului permitind prelucrarea simultana a ambilor operanzi. Instructiunea MAC
aduna intii la ACC produsul anterior dupa cum este indicat de PM, incarca TREG cu
operandul din memoria de date, inmulteste valoarea din TREG cu continutul locatiei
memoriei de program specificate si stocheaza rezultatul in PREG. Cind instructiunea este
repetata, adresa memoriei de program continuta in PC este incrementata cu unu dupa fiecare

14
repetare facilitind astfel executarea instructiunii de inmultire si adunare intr-un singur ciclu
cind este folosita instructiunea RPT. Instructiunea MACD realizeaza toate functiunile
instructiunii MAC si in plus executa recircularea datelor in memoria de date.

Configuratia sistemului
Procesoarele familiei C2000 sunt destinate unei game largi de aplicatii care includ
controlul digital al motoarelor si aplicatiile de control dedicate. Procesoarele sunt prevazute
cu periferice incorporate si cu resurse de memorie ROM (sau memorii flash), plus memorii
DARAM sau optional SARAM.
 Configurarea memoriei
Capacitatea de adresare a memoriei la procesoarele C2000 este de 192 kcuvinte,
memoria fiind organizata in trei spatii independente: (1) 64 kcuvinte memoria de program, (2)
64 kcuvinte memoria pentru date si (3) 64 kadrese pentru dispozitivele I/O. Cele trei spatii
sunt selectate cu semnalele P S, D S si I S . Dupa cum este aratat in Fig. ... procesoarele
familiei C2000 poseda memorie interna cu diferite capacitatati si moduri de organizare.
Memoria pentru date poate fi configurata prin software in sau in afara spatiului de adrese
pentru aceasta memorie. Cind aceste memoriile pentru date sunt in spatiul propriuprocesorul
executa automat accesul cind adresele sunt in limitele spatiului rezervat. Cind adresele exced
limitele procesorul genereaza o adresa pentru memoria externa. Performantele memoriei
interne sunt mai bune decit ale memoriei externe deoarece nu sunt necesare stari de asteptare
(wait), fluxul in pipeline este mai bun, iar consumul este mai redus.
Memoria interna poate fi configurata cu urmatoarele module de memorie: DARAM,
SARAM, flash (ROM) si ROM pentru pornire (boot). De exemplu, la procesoarele LF2407,
544 cuvine de memorie DARAM sunt inmpartite in trei blocuri: blocul 0 (B0 – 256 cuvinte),
blocul 1 (B1 – 256 cuvinte) si blocul 2( B2 – 32 cuvinte). B1 si B2 sunt localizate in spatiul
memoriei pentru date. B0 poate fi configurat ca memorie pentru date (CNF=1) la adresele
200h - 2FFh sau ca memorie pentru program (CNF=0) la adresele 0FF00h - 0FFF0h. Dupa
initializare blocul 0 este configurata ca memorie pentru date.
Memoria flash ocupa pina la 32 kadrese in spatiul pentru program si reprezinta o
alternativa la memoria ROM realizata prin mascare. Memoria flash este utila pentru etapa de
dezvoltare a produselor.
Cu toate ca procesoarele familiei pot accesa un spatiu relativ mare de memorie
capacitatea memoriei interne este limitata. De aceea sunt disponibile citeva instructiuni pentru
transferul blocurilor de date sau program din memoria externa mai lenta in memoria interna.
De exemplu, instructiunea:

15
BLDD source ,destination
transfera date din memoria de date (interna sau externa) in memoria de date. Folosind
instructiunea RPT impreuna cu BLDD pot fi transferate blocuri de date. Similar, instructiunea
BLPD transfera date din memoria pentru program in memoria pentru date. Urmatoarea
secventa :
LAR AR7,#300h ;AR7←300h
MAR *,AR7 ;ARP←7
RPT #255 ;repeat next instruction 256 times
BLDD #8800h ;block move of 256 data
muta o secventa de 256 coeficienti din memoria externa incepind cu adresa 8800h in blocul
B1 din memoria interna pentru date incepind cu adresa 300h.
O alta metoda pentru transferul unui cuvint din memoria pentru program in cea pentru
date consta in folosirea instructiunii TBLR. TBLW executa transferul invers. Pentru aceste
instructiuni cei 16 biti ai ACCL reprezinta adresa memoriei de program, iar instructiunea
specifica adresa memoriei de date.
 Intreruperile
Procesoarele familiei folosesc o intrerupere nemascabila si sase intreruperi mascabile,
controlate prin software. Sursele pentru intreruperi sunt: initializarea (comandata prin
hardware su software), intreruperile generate prin software (cerute pe linii externe sau de la
perifericele incorporate) si intreruperi initiate prin software. Deoarece procesoarele C2000 nu
au suficiente resurse pentru a manipula toate cererile perifericelor, nucleul celor sase
intreruperi (INT1 ÷ INT6) poate fi extins prin folosirea unui controler extern.

16
17
Procesoare digitale de semnal in virgula mobila

Principalele limitari ale procesoarelor in virgula fixa sunt precizia si gama dinamica
redusa. De aceea in cazul implementarilor in virgula fixa este necesara scalarea atenta a
valorii datelor pentru a evita depasirile de scala. Deoarece scalarea implica reducerea gamei
dinamice ea este insotita de scaderea raportului semnal/zgomot in sistemele pentru prelucrarea
semnalelor. In schimb folosirea aritmeticii in virgula mobila ofera o precizie si o gama
dinamica mai buna decit aritmetica in virgula fixa, utila in special in aplicatiile care cer o
precizie mare de calcul cum ar fi actionarile electrice, sistemele pentru comanda robotilor,
grafica pe calculator, s.a. O comparatie privind avantajele si dezavantajele celor doua mari
familii de procesoare de semnal este data in Tabelul 1.

Tabelul 1
Virgula fixa Virgula mobila
 Arhitectura de sistem mai simpla  Arhitectura de sistem complexa
 Programare mai dificila  Programare eficienta in
limbajele de nivel inalt
 Memorie interna extinsa  Necesita extinderea memoriei in
afara cipului
 Cost mai redus  Cost mai ridicat
 Precizie limitata  Precizie ridicata si mentinuta
fara operatii suplimentare
 Gama dinamica redusa  Gama dinamica ridicata
 Erorile de calcul sunt rapid
acumulabile

Procesoarele cu aritmetica in virgula mobila folosesc de regula cuvinte de 32 de biti.


De exemplu, un procesor pe 32 de biti care foloseste 24 de biti pentru reprezentarea mantisei
si 8 biti pentru reprezentarea exponentului ofera o gama dinamica de 1530 dB. Procesoarele in
virgula mobila executa operatiile cu viteza de prelucrarea a datelor intregi, evitind totodata
aparitia unor situatii delicate (de exemplu, depasirea de scala, scalarea semnalelor, alinierea
operanzilor) care se manifesta in cazul virgulei fixe. Datorita gamei dinamice mari oferita de
aceasta reprezentare, anumite operatii (calculul TRF, realizarea filtrelor RII in cascada) care
conduc la cresterea valorii datelor la propagarea de la etaj la etaj nu produc usor depasirea
scalei cum se intimpla in cazul virgulei fixe. In plus efectele de cuantizare sunt mai putin
prezente.
Deoarece lungimea cuvintelor cu care opereaza procesoarele in virgula mobila este
mai mare decit la virgula fixa, aceste procesoare accepta un numar mai mare de moduri de
adresare precum si un grad mai mare de paralelism in executie. Folosirea limbajelor de nivel

18
inalt pentru programare este mai eficienta datorita arhitecturii orientate pe registri, a folosirii
instructiunilor in virgula mobila, a spatiului mai mare de adrese, a numarului mai mare de
moduri de adresare, a flexibilitatii setului de instructiuni, etc. In plus virgula mobila permite o
trecere mai directa de la mediul de simulare pe un calculator gazda folosind programele
MatLab sau C, catre o implementare in timp real pe un sistem tinta cu procesor DSP. In mod
curent procesoarele in virgula mobila sunt folosite pentru aplicatii performante, ca de exemplu
sisteme pentru videoconferinta, retele de comunicatii cu comutare de pachete, statii de baza
pentru telefonia celulara, sisteme radar si sonar, imagistica digitala, etc.
Familia TMS320 contine trei generatii de procesoare in virgula mobila, respectiv C3x,
C4x si C67x.

TMS320C3x
Structura interna este prezentata in Fig. 1 (5.1). Generatia C3x foloseste o arhitectura
Harvard pe 32 de biti, cu registre de 40 de biti pentru extinderea preciziei. Aceste procesoare
includ unitati de prelucrare in virgula mobila (de exemplu, multiplicator, ALU, deplasator),
facilitati pentru managementul rapid al memoriei cu controler DMA incorporat, un cache
intern pentru instructiuni de 64 cuvinte si un spatiu de adrese de 16 Mcuvinte. Procesorul are
un fisier de registre de uz general, un cache pentru program, doua unitati aritmetice dedicate
pentru registrele auxiliare precum si o memorie interna cu acces dublu.
Viteza de executie este optimizata prin implementarea hardware a unor operatii
frecvent utilizate, cum sunt operatiile repetitive cu blocuri de date, adresarea circulara,
multiplicarea. Sistemul de magistrale interne permite executarea in paralel a operatiilor de
extragere a codurilor, a accesarii datelor (pentru citiri/scrieri) si a transferurilor DMA.
Procesorul foloseste adrese de 24 de biti pentru accesarea cuvintelor de cod si de date de 32
de biti.
Pentru functionarea in sisteme multiprocesor, cu memorie globala partajata, C3x
foloseste cinci instructiuni si doua fanioane I/O externe, care pot fi configurati prin software
ca intrari sau iesiri pentru executarea operatiei de interblocare.
Desi procesorul este folosit mai ales ca procesor pentru operatii in virgula mobila,
operatiile in virgula fixa sunt utile pentru anumite aplicatii, cum sunt prelucrarile de imagini.
Procesoarele C3x executa operatii in virgula fixa, in virgula mobila si operatii logice folosind
instructiuni cu doi sau cu trei operanzi. De asemenea C3x poate executa in paralel multiplicati
si operatii cu ALU cu numere intregi reprezentate in virgula fixa sau cu numere reale
reprezentate in virgula mobila intr-un singur ciclu. Procesoarele familiei pot executa mai
multe tipuri de bucle (buclare hardware pentru instructiuni sau pentru blocuri de program,

19
buclare intirziata pentru multiprocesare, buclare standard pentru golirea pipeline-ului). De
asemenea pot fi executate conversii din virgula fixa in virgula mobila. Procesoarele familiei
pot executa pina la 150 milioane de instructiuni in virgula mobila pe secunda (150 Mflops).
C3x foloseste trei formate de date: intregi cu semn, intregi fara semn si numere in
virgula mobila. Pentru numerele in virgula mobila este disponibil si un format in precizie
extinsa. Numerele intregi pot fi reprezentate cu 16 biti (formatul scurt) sau cu 32 de biti
(formatul lung). Pentru reprezentarea in virgula mobila sunt folosite trei formate de date:
formatul scurt (16 biti), formatul standard (32 de biti) si formatul extins (40 de biti).
Formatele de reprezentare nu respecta standardul IEEE 754. Pentru anumite aplicatii de timp
real datele de intrare sunt esantioane de semnal furnizate de convertoare A/D. Procesoarele
C3x convertesc datele intregi intr-un format cu virgula mobila, le prelucreaza, iar la sfirsit
convertesc rezultatul in format intreg si le transefera la CDA.

20

S-ar putea să vă placă și