ZPU (processor)

ZPU är en mikroprocessorstackmaskin designad av norska företaget Zylin AS för att köra övervakningskod i elektroniska system som inkluderar en fältprogrammerbar gate array ( FPGA) .

ZPU är en relativt ny stackmaskin med en liten ekonomisk nisch, och den har ett växande antal användare och implementeringar. [ citat behövs ] Den har designats för att kräva mycket små mängder elektronisk logik, vilket gör mer elektronisk logik tillgänglig för andra ändamål i FPGA. För att göra den lättanvänd har den en port för GNU Compiler Collection . Detta gör det mycket lättare att applicera än processorer utan kompilatorer. Den offrar hastighet i utbyte mot liten storlek och håller mellanresultaten av beräkningar i minnet, i en push-down stack, snarare än i register.

Zylin Corp. gjorde ZPU öppen källkod 2008.

Användande

Många elektroniska projekt inkluderar elektronisk logik i en FPGA. Det är slösaktigt att även ha en mikroprocessor, så det är vanligt att lägga till en CPU till den elektroniska logiken i FPGA. Ofta skulle en mindre, billigare FPGA kunna användas om bara CPU:n använde mindre resurser. Detta är den exakta situationen som ZPU designades för att hantera.

ZPU är designad för att hantera diverse uppgifter i ett system som bäst hanteras av programvara, till exempel ett användargränssnitt. ZPU:n är mycket långsam, men dess ringa storlek hjälper till att placera alla nödvändiga höghastighetsalgoritmer i FPGA.

Ett annat problem är att de flesta CPU:er för FPGA:er är sluten källkod, endast tillgängliga från en viss tillverkare av FPGA:er. Ibland behöver ett projekt ha en design som kan spridas brett, av säkerhetsinspektioner, utbildningsändamål eller andra skäl. Licenserna på dessa proprietära processorer kan förhindra dessa användningar. ZPU är öppen källkod.

Vissa projekt behöver kod som måste vara liten, men som körs på en CPU som i sig har större kod. Alternativt kan ett projekt dra nytta av det breda urvalet av kod, kompilatorer och felsökningsverktyg för GNU Compiler Collection. I dessa fall kan en emulator skrivas för att implementera ZPU:s instruktionsuppsättning på mål-CPU, och ZPU:s kompilatorer kan användas för att producera koden. Det resulterande systemet är långsamt, men packar kod i mindre minne än många processorer och gör att projektet kan använda en mängd olika kompilatorer och kod.

Design egenskaper

ZPU:n designades uttryckligen för att minimera mängden elektronisk logik. Den har en minimal instruktionsuppsättning, men kan ändå kodas för GNU Compiler Collection. Det minimerar också antalet register som måste finnas i FPGA, vilket minimerar antalet flip-flops. Istället för register hålls mellanresultat i stacken, i minnet.

Den har också liten kod, vilket sparar minne. Stackmaskininstruktioner behöver inte innehålla register-ID, så ZPU:s kod är mindre än andra RISC-processorer, som sägs bara behöva cirka 80 % av utrymmet i ARM Holdings Thumb2 . Till exempel hjälper den undertecknade omedelbara ZPU:n att lagra ett 32-bitars värde i högst 5 byte av instruktionsutrymme, och så lite som en. De flesta RISC-processorer kräver minst åtta byte.

Slutligen kan ungefär 2/3 av dess instruktioner emuleras av firmware implementerad med hjälp av de andra 1/3 "obligatoriska" instruktionerna. Även om resultatet är mycket långsamt, kan den resulterande CPU:n kräva så lite som 446 uppslagstabeller (ett mått på FPGA-komplexitet, ungefär motsvarande 1700 elektroniska logiska grindar).

ZPU:n har en återställningsvektor, bestående av 32-byte kodutrymme som börjar på plats noll. Den har också ett enda kantkänsligt avbrott, med en vektor som består av 32 byte kodutrymme som börjar vid adress 32. Vektorerna 2 till 63 har vardera 32 byte utrymme, men är reserverade för kod för att emulera instruktionerna 33 till 63.

Bas ZPU har en 32-bitars dataväg. ZPU har även en variant med en 16-bitars bred dataväg, för att spara ännu mer logik.

Verktyg och resurser

ZPU har en väl testad port av GNU Compiler Collection. Entusiaster och firmwareingenjörer har porterat ECos , FreeRTOS och μClinux . Minst en grupp entusiaster har kopierat den populära utvecklingsmiljön för Arduino och anpassat den till ZPU.

Det finns nu flera modeller av ZPU-kärnan. Förutom de ursprungliga Zylin-kärnorna finns det även ZPUino-kärnorna och ZPUFlex-kärnan. Zylin-kärnan är designad för ett minimalt FPGA-fotavtryck och inkluderar en 16-bitarsversion. ZPUino har praktiska förbättringar för hastighet, kan ersätta emulerade instruktioner med hårdvara och är inbäddad i ett system-på-chip-ramverk. ZPUFlex är designad för att använda externa minnesblock och kan ersätta emulerade instruktioner med hårdvara.

Akademiska projekt inkluderar studier och förbättringar av energieffektivitet och tillförlitlighetsstudier.

För att förbättra hastigheten har de flesta implementerare implementerat de emulerade instruktionerna och lagt till en stackcache. Utöver detta sa en implementerare att en två-stack-arkitektur skulle tillåta pipelining (dvs. förbättra hastigheten till en instruktion per klockcykel), men detta kan också kräva kompilatorändringar.

En implementerare minskade strömförbrukningen med 46 % med en stackcache och automatisk insättning av klockport. Strömförbrukningen motsvarade då ungefär den lilla Amber - kärnan med öppen källkod, som implementerar ARM v2a-arkitekturen.

De delar av ZPU:n som skulle få störst hjälp av feltolerans är adressbussen, stackpekaren och programräknaren.

Instruktionsuppsättning

"TOS" är en förkortning av "Top Of Stack". "NOS" är en förkortning av "Next to the top Of Stack."

Krävs ZPU-instruktionsuppsättning
namn Binär Beskrivning
BRUKPUNKT 00000000 Stoppa CPU:n och/eller hoppa till felsökaren.
IM_x 1xxxxxxx Tryck eller lägg till en signerad 7-bitars omedelbart till TOS.
STORESP_x 010xxxxx Poppa TOS och förvara den i högen med en förskjutning från toppen.
LOADSP_x 011xxxxxx Hämta från ett värde som är indexerat i stacken och tryck in det i TOS.
EMULERA_x 001xxxxxx Emulera en instruktion med kod vid vektor x.
ADDSP_x 0001xxxx Hämta från ett värde som är indexerat i stacken och lägg till värdet i TOS.
POPPC 00000100 Poppa en adress från TOS och lagra den på datorn.
LADDA 00001000 Poppa en adress och tryck det laddade minnesvärdet till TOS.
LAGRA 00001100 Lagra NOS i minnet som TOS pekar på. Pop båda.
PUSHSP 00000010 Tryck in den aktuella SP i TOS.
POPSP 00001101 Poppa TOS och lagra den till SP.
LÄGG TILL 00000101 Heltalstillägg av TOS och NOS.
OCH 00000110 Bitvis OCH av TOS och NOS.
ELLER 00000111 Bitvis ELLER för TOS och NOS.
INTE 00001001 Bitvis INTE av TOS.
FLIP 00001010 Vänd bitordningen för TOS.
NEJ 00001011 Ingen operation. (Används vanligtvis för fördröjningsslingor eller kodtabeller.)

Kodpunkterna 33 till 63 kan emuleras av kod i vektorerna 2 till 32: LOADH och STOREH (16-bitars minnesåtkomst), LESSTHAN (jämförelser set 1 för sant, 0 för falskt), LESSTHANOREQUAL, ULESSTHAN, ULESSTHANOREQUAL, SWAP (TOS med NOS), MULT, LSHIFTRIGHT, ASHIFTLEFT, ASHIFTRIGHT, CALL, EQ, NEQ, NEG, SUB, XOR, LOADB och STOREB (8-bitars minnesåtkomst), DIV, MOD, EQBRANCH, NEQBRANCH, POPPCREL, CONFIG, PUSHPC, SYSCALL, PUSHSPADD, HALFMULT, CALLPCREL