# Parallax Propeller

De Parallax Propeller, of P8X32 zoals hij officieel heet, is een multiprocessor-microcontroller met acht 32 bit-RISC-CPU-kernen. Hij werd geïntroduceerd in 2006, en heeft een zeer bijzondere architectuur. Zijn architectuur is speciaal ontworpen voor het genereren van (een of meerdere) videosignalen, maar hij is ook zeer bruikbaar voor een groot scala aan andere taken, waarvan sommige dingen heel moeilijk, of helemaal niet, met andere microcontrollers mogelijk zouden zijn.

## Multicorearchitectuur

Elk van de acht 32 bit-kernen, die als COG's aangeduid worden, heeft een elementaire ALU (een instructie om te delen is bijvoorbeeld niet aanwezig, maar een deelinstructie, of andere mathematische instructie, kan wel middels de ingebouwde mathematische tabellen uitgevoerd worden) en elke COG heeft toegang tot 512 32 bit geheugenlocaties, waarvan er 496 als RAM-geheugen uitgevoerd zijn en 16 bedoeld zijn voor het benaderen van de registers van speciale hardware zoals counters. Het RAM-geheugen kan instructies en data bevatten, maar elke locatie kan ook opgevat worden als een CPU-register. Zelfmodificerende code is niet alleen mogelijk, maar sommige machinetaalinstructies maken er zelfs intern gebruik van. Zo is er een instructie die een andere instructie (de "RETURN"-instructie) modificeert en daarna een sprong doet naar een willekeurig adres. Hiermee wordt een CALL/RETURN-subroutinemechanisme gemaakt dat werkt zonder een stack nodig te hebben.
De toegang tot een (door de acht COG's gedeeld) 32 KB RAM en 32 KB ROM-geheugen (elk als 8 K 32 bit woorden uitgevoerd) wordt gecontroleerd door een "bus controller" die de naam "the hub" draagt en die op een "round robin" (rotatieschema) manier elke COG even toegang geeft. Elke COG heeft daarbij ook steeds toegang tot alle 32 beschikbare I/O-poorten, twee hardware tellers en twee speciale videoregisters die de COG assisteren bij het opwekken van een PAL/NTSC-compatibel composiet videosignaal.

## Zeer hoge executiesnelheid

De eerste versie van de propeller (er zijn er nog meerdere in ontwikkeling) draait op een kloksnelheid van 32 KHz tot 80 MHz. Bij een 80 MHz-klok kan de ingebouwde geïnterpreteerde SPIN-programmeertaal ongeveer 80.000 8 bit-tokens per seconde interpreteren, per COG. Ofwel 640.000 SPIN-instructies per seconde. De Propeller kan echter ook direct machinetaal instructies uitvoeren en aangezien deze ongeveer vier klok perioden per instructie gebruiken kan de propeller 20 MIPS per COG uitvoeren, ofwel 160 MIPS in totaal voor alle acht COG's.

## Energiezuinigheid

De propeller is zeer zuinig, daar hij op 3,3 volt werkt, en slechts 75 mA verbruikt als alle COG's vol in gebruik zijn, op hun volle snelheid. Wanneer een COG echter niet nodig is wordt deze automatisch uitgezet en verbruikt dan vrijwel geen stroom meer. Dit en het feit dat de kloksnelheid onder softwarecontrole zeer sterk omlaag geschroefd kan worden (desnoods naar 32 KHz) betekent dat de propeller zeer zuinig met energie kan omgaan. In de zuinigste stand gebruikt hij dan zelfs slechts enkele microampères, en kan vele jaren draaien op enkele penlightbatterijtjes.

## Ingebouwde kristaloscillator

De propeller kan geklokt worden met een ingebouwde klokgenerator, of met een kristal. Wanneer men een kristal wil gebruiken kan er een toegepast worden uit een zeer brede reeks van frequenties zonder dat enige andere componenten nodig zijn. Als geen precieze timing nodig is kan ook zonder kristal gewerkt worden. De chip gebruikt de intern opgewekte, of door een kristal geproduceerde, frequentie voor de aansturing van een in software bestuurbaar PLL-systeem dat de frequenties opwekt die intern in de chip nodig zijn voor de COG's en de diverse counters. De intern opgewekte frequentie kan hoger zijn dan de kristalfrequentie, en kan zonder meer door software bepaald worden, om bijvoorbeeld energie te sparen.

## Ingebouwde ROM

De ingebouwde ROM bevat een aantal bruikbare faciliteiten, bijvoorbeeld een computerlettertype, dat gebruikt kan worden bij het opwekken van TC-signalen, of om een lcd aan te sturen. Verder bevat het diverse mathematische tabellen waarmee sinussen gegenereerd kunnen worden, en voor het doen van "snelle Fouriertransformatie", maar ze kunnen ook gebruikt worden om het gebrek aan rekenkundige mogelijkheden van de CPU te ondervangen, door bijvoorbeeld te assisteren bij het doen van delingen en vermenigvuldigingen. Ten slotte bevat de ROM firmware om op te kunnen starten en voor het uitvoeren van de "bytecode-interpreter" waarmee de speciale SPIN-programmeertaal wordt uitgevoerd.

## Ingebouwde SPIN Bytecode interpreter

De propeller heeft een ingebouwde bytecode-interpreter voor de speciaal voor de propeller ontworpen hogere programmeertaal genaamd 'SPIN'. Dit is een object georiënteerde programmeertaal waarvoor een (gratis) ontwikkelingsomgeving bestaat, genaamd "The propeller tool", deze draait (voorlopig alleen) onder Windows XP (en Vista). SPIN draait veel langzamer dan de eigen machinetaal van een COG, maar is niet gebonden aan de 2K-geheugenlimiet van een COG en is veel zuiniger met geheugen omdat elke instructie in slechts één byte is opgeslagen, in plaats van de vier die elke machinetaalinstructie behoeft. Deze oplossing lijkt een beetje op die van de ARM9-processors, die 8 bit "thumb"-code-instructies kunnen gebruiken voor "compacte langzame code" en 32 bits instructies voor de rest, alleen doet de propeller dit met firmware, in plaats van met een hoop extra hardware.
De propeller kan in elk van zijn acht COGs een kopie laden van de "SPIN-code-interpreter", dus kunnen er acht SPIN-programma's tegelijk draaien. SPIN is snel genoeg om in software dingen te doen zoals het nabootsen van een snelle UART. Vanuit een in SPIN geschreven programma kan de propeller echter ook (in een andere COG) machinetaalprogramma's starten.

## 32 I/O-poorten

De eerste versie van de chip, die officieel als S8X32 aangeduid wordt, heeft één 32 bit I/O-poort, en is in een 40 pin-, 0,6 inch- DIP-chip, of een 44 pin-LQFP of -QFN Surface-mount technology-behuizing beschikbaar. Van de 40 beschikbare pinnen zijn er 32 voor I/O-pinnen beschikbaar, vier worden er voor voeding en aarde gebruikt, en de resterende vier zijn voor de aansluiting van een kristal, en een reset en "brownout enable"-pin.
Alle acht COG's kunnen de 32 bit I/O-poort gelijktijdig onbeperkt aansturen, een speciaal "arbitragemechanisme" zorgt ervoor dat er geen gekke dingen gebeuren als de ene COG probeert een pin als ingang, en een andere dezelfde pin als uitgang te programmeren. Elke COG heeft ook diverse hardware tellers, hiermee is het bijvoorbeeld mogelijk op een pulsbreedte gemoduleerd signaal op te wekken (zonder daarmee de CPU's te belasten) waarmee bijvoorbeeld acht audio-uitgangen gecreëerd kunnen worden. Omdat deze counters ook faciliteiten hebben voor het moduleren van de fase van het opgewekte signaal kunnen de counters ook helpen bij het opwekken van het "color-burst"-signaal gebruikt in de composiet videokleursignalen volgens de PAL- en NTSC-normen.
Latere versies van de propeller zullen meer COG's, meer I/O-pinnen en meer geheugen hebben, en zullen sneller zijn.

## Virtuele I/O-toestellen

De ontwerpkeuzes die de ontwerper van de propeller gemaakt heeft (hij is voornamelijk door slechts één persoon ontwikkeld), dragen er sterk toe bij dat de propellerchip geen speciale I/O-interfaces, zoals A/D- en D/A-converters, RS232, I²C en seriële SPI-interfaces, of andere speciale interfacehardware nodig heeft, deze kunnen namelijk allemaal met software en de ingebouwde tellers nagebootst worden. het is zelfs mogelijk een complete Video Display Controller in software na te bootsen. Dit wordt bijvoorbeeld gebruikt in de Hydra-spelconsole, en op een propeller gebaseerd systeem waarbij een hobbyist zelf zijn eigen videospelletjes kan ontwikkelen. Het is zelfs mogelijk om direct een radiofrequent (VHF-)tv-signaal, (inclusief audio) op te wekken, dat rechtstreeks op de antenne ingang van een tv kan worden aangesloten. Maar ook kan een VGA-monitor aangesloten worden.
Softwarebibliotheken zijn beschikbaar waarmee vele verschillende oplossingen geboden worden voor het nabootsen van I/O-apparaten, bijvoorbeeld voor het aansturen van de motoren in robots, maar ook vele andere interfaces, zoals USB, MIDI en MMC-geheugenkaartjes. Er is zelfs al software voor het nabootsen van een complete synthesizer.

## Interruptmechanisme

Een propeller gebruikt geen interrupts. Bij het verbinden van de propeller aan een zeer snelle andere chip, bijvoorbeeld een ethernetchip, kan er één COG voor die interface gebruikt worden, die ook met een snel "polling"-mechanisme werkt waarvoor anders een interrupt nodig zou zijn.

## Opstartmechanisme

Als een propeller gestart of herstart wordt, door een voedingsstoring, interrupt, of door software, dan laadt het de bootcodefirmware in een van de COG's en voert deze uit. Deze software kijkt heel even of er commando's komen van een (in software nagebootste) UART, en als dat niet zo is laadt hij SPIN code van een externe EEPROM (middels een ook in software opgewekte I2C-interface) Daarna laadt hij een SPIN-code-interpreter in een COG, en deze voert het in SPIN geschreven programma uit. Vanuit de SPIN-code kunnen op andere COG's andere programma's opgestart worden, dat kunnen dan andere kopieën zijn van de SPIN-interpreter, maar ook andere machinetaalprogramma's.

## Externe EEPROM

De propeller kan niet alleen maar opstarten van de externe EEPROM, andere programma's kunnen deze ook gebruiken om meer code ervan in het 32K-hoofdgeheugen te laden, het is dan mogelijk om veel grotere programma's dan 32 K uit te voeren. Een externe EEPROM van 1 MB is mogelijk, maar het is ook mogelijk om via de I/O-pinnen een extern geheugen aan te sturen, bijvoorbeeld een geheel random acces benaderbaar 256K-RAM kan aangesloten worden met slechts tien I/O-pinnen.