DSP architektúrák dsPIC30F család A Microchip 2004 nyarán piacra dobta a dsPIC30F családot, egy 16 bites fixpontos DSC. Mivel a mikróvezérlők tantárgy keretén belül a PIC családdal már megismerkedtetek, ezért egyszerűbb bemutatni a DSP jellegzetességeket ezen a családon, habár nem a legjobb DSP-k közé tartozik. A dsPIC30F család architektúrája 16 bites, módosított Harvard architektúra. 16 bites adatmemória, 24 bites programmemória és 24 bites programszámláló (PC). A processzorban egy egyszintű pipeline segít a párhúzamos végrehajtásban. 16 általános regiszter használható mind adat, cím vagy offset regiszterként. Processzor két tipusú utasítást tud kezelni, a mikróvezérlő (MCU) és a DSP utasításokat. A mikróvezérlő utasítások hasonlóak a PIC utasításokkal, a DSP utasítások kezelésére ujabb funkcionális egységeket adtak a CPU-hoz. Ugyancsak DSP specifikus utasítások miatt két memóriazóna van(X és Y), ennek megfelelően két adatsín, és két címgeneráló egység. Ez azért hasznos mert például a MAC utasítás egyszerre olvas be két operandust, így egy utasításciklus alatt elvégzi a szorzás és összeadás műveletet. Amikor nem DSP utasításokat hajt végre a processzor akkor csak az X memóriazóna használható. A felső 32kbyte adatmemóriába betükrőzhető a bármelyik 16kWord adatmemória, ezzel egyszerűen beolvashatók adatok, amik a programmemóriában vannak tárolva. A DSP motor, a CPU azon része ami a DSP specifikus utasítások elvégzését hivatott szolgálni, egy 17bit x 17bit-es szorzót tartalmaz, két 40 bites akkumulátort, és egy 40 bites kétirányú eltoló(barrel shifter) regisztert tartalmaz. A következő táblázatban a programozásban használt CPU regiszterek összefoglalója látható, a címzésnél valamint az összes adatmozgatásnál használt regiszterek listája:
A CPU architektúrája
A fent leírt egységeken kivül egy hardware osztó áramkőr, a megszakításkezelő áramkőr valamint perifériák láthatók. A perifériák a PIC-nél jól ismert portok, kommunikációs eszközök, analóg bemenetek, PWM kimenetek. Van néhány új periféria is, mint a Motor Control családnál az invertervezérlő PWM kimeneti egység.
CPU regiszterek
A fenti ábrán, a CPU regiszterek közül a W0-W3 és a Status regiszter néhány bitje a memóriában meg van duplázva, ez azt jelenti, hogy a POP.S és PUSH.S utasítások elmentik illetve visszatöltik automatikusan ezeket. Arra kell vigyázni, hogy csak egy POP.S utasítást használjunk mert csak egyszintű ez a verem. Ugyancsak veremkezelésre használható a W15 regiszter, ami egy veremmutató lehet. Ezt a mutatót a POP és PUSH utasítások használják, a programozó megadja a verem kezdőcímét és a POP, PUSH utasítások ezt növelik illetve csökkentik. Megadható egy veremmélység(SPLIM), ha ezt meghaladta a veremmutató akkor egy megszakítást generál. A fent ismertetett CPU regiszterek részletes leírása megtalálható az adatlapban, röviden: − TBLPAG – a felső nyolc bitjét tartalmazza a programmemóriának, kódmemóriaolvasásnál használják − PSVPAG – kiválasztja a program memória azon részét, amit tűkrözni akarunk az adatmemória felső 32Kbyte részén. − MODCON – a moduló címzés konfigurációs regisztere. Bővebben a memóriazónák bemutatásánál − RCOUNT – a repeat ciklus számláló regiszter, egy utasítást többszőr végrehajt a processzor − DOCOUNT – a DO utasítást számláló regiszter, a DO több utasítást megismétel annyiszor, amennyi ebben a regiszterben megadott − DOSTART, DOEND – a DO ciklus kezdő illetve végső címe. − CORCON – a DSP utasítások és a DO ciklus konfigurációs bitek Az aritmetikai és logikai egység (ALU) Az ALU 16 bites összeadást, kivonást, logikai műveleteket, valamint egybites eltolást tud végezni. Az operandusok vagy a W regiszterekből, vagy az adatmemóriából jönnek, az eredmény ugyancsak ezekbe tehető. Működhet 8 illetve 16bites módban, a régi CPU kompatibilitás miatt, de itt ügyelni kell az adatcímzésre, mert csak páros címek elfogadhatók. Ha keverjük a 8 illetve 16bites operandusokat, akkor automatikus átalakítja 16 bitesre a processzor, ha a SE(sign extend) utasítást használjuk. A ZE(zero extend) utasítás visszaalakítja 8 bitesre az utasítást. A DSP motor A CPU ezen része a DSP műveletek gyors végrahjtását bizosítja. Az a cél, hogy minden utasítást egy ciklus alatt elvégezzen a processzor, még a bonyolultabb DSP utasításokat is.
A DSP motor felépítése:
Alegységek: − 17x17 bites szorzó − több bites eltoló(barrel shifter) − 40 bites összeadó, kivonó − két 40 bites akkumulátor A két 40 bites akkumulátor a műveletek eredményét tárolja, az ismert adatforma az egész tipus vagy a tízedes. A tízedes ábrázolásnál a tízedes pont a 31. bit jobb oldalán van, ezzel –256.0 és 256-2-31 a dinamikus tartománya az ábrázolt számoknak. A szorzó egység egész vagy tízedes szorzást tud végezni, az eredményt Q31 formában tárolja.
DSP utasítások, amelyek használják a szorzó egységet:
Ugyamezt a szorzó egységet használja az MCU is, de ebben az esetben csak egész szorzás végezhető.
A több bites eltoló egység (Barrel Shifter) egy utasításciklus alatt maximum 16 bites eltolást tesz lehetségessé, jobbra vagy balra. A klasszikus ALU csak 1 bitnyire tudta eltolni az operandust. Utasítások amik használják:
Hardware Osztás A hardware osztó a következő műveleteket tudja elvégezni: − DIVF: 16/16 signed fractional divide − DIV.SD: 32/16 signed divide − DIV.UD: 32/16 unsigned divide − DIV.SW: 16/16 signed divide − DIV.UW: 16/16 unsigned divide A hardware osztót mind az MCU mind a DSP utasítások használják.
Utasításciklusok – a legtöbb utasítás egy ciklusban hajtódik végre, ez annak köszönhető, hogy az előző ciklusban már kiolvassa az utasítást.
Vannak utasítások amik 2 vagy három ciklust vesznek igénybe:
A dsPIC utasításciklusa négy órajel, ebből kiszámítható minden utasítás ideje: