A ZPU egy veremgép típusú mikroprocesszor, melyet a norvég Zylin AS cég tervezett, kifejezetten FPGA alapú elektronikus rendszerekhez, felügyeleti kód futtatására.
A ZPU egy viszonylag újabb alkotású veremgép kialakítás, mely egy kisebb gazdasági résbe illeszkedik, azonban egyre több felhasználóval és megvalósítással rendelkezik. Úgy tervezték, hogy nagyon kis mennyiségű elektronikus logikát igényeljen, ezáltal az FPGA kialakításokban több területet tesz szabaddá, melyet más célokra lehet felhasználni. A felhasználás elősegítése céljából készítettek egy portot a GNU Compiler Collection eszköztárból, amely támogatja a ZPU-ra írt kódot. Ez nagy előnyt jelent a fordító nélküli processzorokhoz képest. A processzor, tervezési koncepciójából adódóan, a kis kódméretet helyezi előtérbe a sebességgel szemben. Működésének alapja a veremtár, tehát a számítások átmeneti eredményeit veremszerkezetben tárolja, nem regiszterekben.
A Zylin Corp. 2008-ban nyílt-forráskódúvá tette a ZPU-t.
Használata Sok elektronikus projekt tartalmaz elektronikus logikát FPGA-n. Az FPGA mellé pazarlás lenne egy külön mikroprocesszort beépíteni, így általánosan elterjedt az a módszer, hogy egy CPU-t magában az FPGA-ban valósítanak meg, az egyéb logika mellett. Minél kevesebb erőforrást használ vagy kisebb a CPU kódja az FPGA-n, annál több hely marad az egyéb feladatokat végző hardver számára, vagy másrészt a projektekben kisebb, olcsóbb FPGA-k használhatók. A ZPU kialakítás éppen erre szolgál.
A ZPU-t úgy tervezték, hogy képes legyen ellátni egy rendszer különféle feladatait, amelyeket legjobban szoftver kezel, például egy felhasználói felület vezérlését. A ZPU nagyon lassú, de kis mérete segít abban, hogy minden szükséges nagy sebességű algoritmus az FPGA-ban legyen elhelyezhető.
Egy másik probléma, hogy az FPGA-kban használható legtöbb CPU zárt forráskódú, csak egy adott FPGA-gyártótól beszerezhető. Alkalmanként egy projektnek olyan kialakításra van szüksége, amely széles körben terjeszthető, biztonsági ellenőrzések, oktatási célú felhasználás vagy egyéb okok miatt. A védett CPU-k licencei megakadályozhatják ezeket a felhasználási módokat. A ZPU nyílt forráskódú.
Néhány projekt kis méretű kódot igényel, de olyan CPU-n fut, amely természeténél fogva nagyobb kóddal rendelkezik. Alternatívaként egy projekt számára előnyös lehet a kód széles választéka és támogató szoftver megléte, fordítóprogramok és debug/hibakeresési eszközök a GNU Compiler Collection csomagban. Ilyen esetekben egy emulátort lehet írni a ZPU utasításkészletének implementálására a célzott CPU-n, és a ZPU fordítói használhatók a kód előállításához. Az így létrejövő rendszer lassú, de a legtöbb CPU igényeinél kevesebb memóriában helyezi el a kódot és lehetővé teszi a projekt számára a fordítók és a kódok széles skálájának használatát.
Tervezési jellemzői A ZPU-t kifejezetten úgy tervezték, hogy minimalizálja az elektronikus logika mennyiségét. Minimális utasításkészlettel rendelkezik, ami könnyedén kódolható a GNU Compiler Collection számára. A kódméret mellett minimalizálja a regiszterek számát is, melyeknek az FPGA-ban kell lenniük, ami a felhasznált flip-flopok számát is csökkenti. A processzor az átmeneti eredményeket nem regiszterekben, hanem a veremben tartja, azaz a memóriában.
Kis kódmérettel rendelkezik, ezáltal memóriát takarít meg. A veremgépes utasításoknak nem kell regiszterazonosítókat tartalmazniuk, így a ZPU kódja kisebb, mint más RISC processzoroké, az eleve sűrű Arm Thumb2 utasításkészlet méretének körülbelül 80%-ára van szüksége. Például a ZPU előjeles közvetlen érték tárolóművelete lehetővé teszi, hogy egy 32 bites értéket legfeljebb 5 bájtnyi utasításterületen tároljon, ami akár egyetlen bájt is lehet. A legtöbb RISC processzoron ugyanez legalább nyolc bájtot igényel.
Továbbá az utasítások közel 2/3-a emulálható firmware-rel, mely az utasításkészlet másik „kötelező” 1/3 részét használja fel. Bár az eredmény nagyon lassú, az eredményül kapott CPU viszont mindössze 446 LUT (lookup-table) elemet igényelhet (az FPGA komplexitásának mérőszáma, ami nagyjából 1700 elektronikus logikai kapunak felel meg).
A ZPU-nak van egy reset vektora, amely 32 bájt a 0. címen kezdődő kódterületen. Egyetlen élérzékeny megszakítással is rendelkezik, melynek vektora 32 bájtnyi kódterületből áll a 32-es címen kezdődően. A 2-63-as vektorok mindegyike 32 bájtból áll, de a 33-63 opkódú utasításokat emuláló programkód számára vannak fenntartva.
Az alap ZPU adatszélessége (adatútja) 32 bites. A ZPU-nak van egy 16 bites adatúttal rendelkező változata is, amely még több logikát takarít meg.
Eszközök és források A ZPU-hoz elérhető egy jól tesztelt GNU Compiler Collection port. A rajongók és firmware-mérnökök portolták ZPU-ra az eCos beágyazott valósidejű operációs rendszert, valamint a FreeRTOS és μClinux operációs rendszereket. Legalább egy rajongói csoport lemásolta az Arduino népszerű fejlesztőkörnyezetét és adaptálta azt a ZPU-hoz.
A ZPU magnak jelenleg több modellje van. Az eredeti Zylin magok mellett léteznek még a ZPUino magok és a ZPUFlex mag. A Zylin magot minimális FPGA erőforrás-felhasználáshoz tervezték, és egy 16 bites verziót tartalmaz. A ZPUino gyakorlati fejlesztéseket tartalmaz a sebesség érdekében, képes hardveres végrehajtású utasításokkal helyettesíteni az emulált utasításokat, és egy egylapkás rendszer típusú keretrendszerbe van beágyazva. A ZPUFlex külső memóriablokkok használatára készült és szintén képes az emulált utasításokat hardverrel helyettesíteni.
Az akadémiai projektek között találhatók az energiahatékonyságra vonatkozó tanulmányok és fejlesztések és megbízhatósági tanulmányok.
A sebesség javítására a legtöbb megvalósító hardverben implementálta az emulált utasításokat és hozzáadott egy verem-gyorsítótárat. Ezen felül egy megvalósító azt állítja, hogy egy kétvermes (két vermet használó) architektúra lehetővé tenné a futószalagos működést, ebből következően a sebesség növelését órajelciklusonként egy utasításra, ám ez feltehetően a fordítóprogramokban is változtatásokkal járna.
Az egyik megvalósítás 46%-kal csökkentette az energiafogyasztást egy verem-gyorsítótár és az órajelkapuzási technika automatizált beépítésével. Az energiahasználat ekkor nagyjából egyenértékű a kicsi és nyílt forráskódú Amber processzormag energiafelhasználásával, ami az ARM v2a architektúra megvalósítása.
A ZPU egyes részei hibatűrő megoldásokkal továbbfejleszthetők, ez a technika legjobban a címsín, veremmutató és a programszámláló stabilitását segítené.
Utasításkészlet A „TOS” a „Top Of Stack”, „verem teteje”, a verem tetején levő értéket jelenti. A „NOS” a „Next to the top Of Stack” rövidítése, ami a verem teteje alatti, avagy „felülről a második” rekeszt jelenti. Az SP a veremmutató, a PC a programszámláló.
+ A kötelező ZPU utasításkészlet Név bináris leírás BREAKPOINT 00000000 Töréspont: a CPU leállítása és/vagy ugrás a hibakeresőre. IM_x 1xxxxxxx Egy 7 bites előjeles közvetlen értéket ír (push) vagy fűz hozzá (append) a TOS-hoz: ha az IDIM jelzőbit beállított, akkor a TOS értékét 7 bittel balra tolja és az alsó 7 bitbe írja a megadott értéket. STORESP_x 010xxxxx Kiemeli a TOS értékét és tárolja a SP+xxxxx*4 memóriahelyen, ahol xxxxx egy pozitív egész szám. LOADSP_x 011xxxxx Az SP+xxxxx*4 memóriahely értékét a verembe írja (push művelet). EMULATE_x 001xxxxx Egy utasítás emulálása az x vektoron lévő kóddal. ADDSP_x 0001xxxx Az SP+xxxx*4 memóriahely értékét adja hozzá a verem tetején lévő értékhez (TOS). POPPC 00000100 Kiemel (pop) egy címet a TOS-ból és írja a PC-be. LOAD 00001000 Kiemeli a veremben tárolt címet, és betölti a cím értékét a verembe. STORE 00001100 Kiemeli a címet (TOS), majd az értéket (NOS) a veremből, és az értéket a cím memóriahelyére tárolja. PUSHSP 00000010 Az aktuális veremmutatót (SP) a verembe helyezi. POPSP 00001101 Leemeli az értéket a verem tetejéről és az SP-be írja. A veremben lévő hely lefoglalására/felszabadítására szolgál változók számára, vagy szálak váltásakor. ADD 00000101 Kiemel 2 értéket (TOS és NOS), összeadja őket, és az eredményt a verembe írja. AND 00000110 Bitenkénti ÉS művelet a TOS és NOS értékkel; két értéket emel ki a veremből, majd bináris ÉS műveletet végez és az eredményt a verembe írja. OR 00000111 Bitenkénti VAGY művelet a TOS és NOS értékkel. NOT 00001001 A TOS bitenkénti inverze (letagadása). FLIP 00001010 A TOS bitsorrendjének megfordítása (pl. 110...0-ból 0...011 lesz; főleg az utasítások emulálásában van szerepe). NOP 00001011 Nincs művelet (általában késleltetési ciklusokhoz vagy kódtáblázatokhoz használják; mellékhatásként törli az IDIM flaget, ami két két egymást követő IM utasításnál hasznos) A 33-63 számú kódpontok a 2-32-es vektorok kódjaival emulálhatók: LOADH és STOREH (16 bites memóriaelérés), LESSTHAN (összehasonlítások, értéke 1 az igaz, 0 a hamis értékeknél), LESSTHANOREQUAL, ULESSTHAN, ULESSTHANOREQUAL, SWAP (TOS–NOS csere), MULT, LSHIFTRIGHT, ASHIFTLEFT, ASHIFTRIGHT, CALL, EQ, NEQ, NEG, SUB, XOR, LOADB és STOREB (8 bites memóriaelérés), DIV, MOD, EQBRANCH, NEQBRANCH, POPPCREL, CONFIG, PUSHPC, SYSCALL, PUSHSPADD, HALFMULT, CALLPCREL.
Jegyzetek
Fordítás
Források
További információk
Kapcsolódó szócikkek Szoft processzor FPGA OpenCores – több nyílt forrású szoft processzor tervezetet összefogó közösség Altera Nios, Nios II
Kategória:Nyílt mikroprocesszorok Kategória:Szoft mikroprocesszorok Kategória:Veremalapú gépek Kategória:Mikroprocesszorok