Hány utasítás kell minimum egy processzorba?

Volt egy téma itt a blogon a legfontosabb processzorokról.
Ez inspirált arra, hogy körbejárjam, mi az a minimum set, amivel processzort lehet építeni.

 

Minimalista utasításkészletű processzor + körbeépített célhardverek terén a PIC16 család jeleskedik, még az indirekt memóriacímzés is célhardveres művelet.
Például ha végig akarod összegezni a vektort:

INC FSR    # memóriacím, ami tulajdonképpen a ptr
ADD INDF  # *ptr, azaz a ptr-edik helyen levő adat
...

Ilyen módon, hogy memóriacímekre célhardvereket, célszámokat teszel, egy minimális utasításkészlet, amivel CPU-t tudsz gyártani, megdöbbentően kevés.
Itt egy projekt, amihez még FPGA sem kell, elég egy CPLD hozzá: https://github.com/cpldcpu/MCPU
Ez a 8 bites proci mindössze az alábbi 4 utasítást tartalmazza:
   NOR
   ADD
   STA
   JCC
És még 11 memóriacímen konstansokat tartalmaz.
Innentől
   CLR  makró
   LDA  makró
   NOT  makró
   JMP  makró
   JCS  makró
   SUB makró
   ...    makró

Bővebben lásd a projekt repóját, továbbá ezen belül is a PDF-et.
Megjegyzések:
  - ilyen minimálprociknál minden funkció a 8 bites PIC mikrovezérlőhöz hasonlóan memóriacímbe ágyazott célhardver
  - minden jól tervezett utasítással való bővítés bonyolítja a CPU-t, ellenben időmegtakarítást (sebességnövekedést) hoz

Hozzászólások

Inkább ADC-t csinálnék, és nem lenne ADD. Sokkal kényelmesebb úgy az élet.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Én ANDOR-ban 15 utasítást valósítottam meg:
HLT, NOP, LDA, ADC, SBC, JMP, CMP, BEQ, BCS, BMI, STA, LDA, INC, DEC, OUT 
És ezeknek persze van többféle címzési alternatívájuk. 

Itt sem lenne mind szükséges, de ahogy írtad is, sebességnövekedést okoz, noh meg nem kell olyan hosszú assembly kódot írni, és memória megtakarítási szempontból sem elhanyagolható.
Igaz ANDOR új verziójában már 64 Kb van, de a legelsőben még 256 byte volt! És ebbe belefért egy egyszerű úgrálós játék! :)

I don't need to "get a life". I'm a gamer, I have lots of lives!

Nincs szüikség a 8 bites PIC mikrovezérlőhöz hasonlóan memóriacímbe ágyazott célhardverre. Bár az utasításszó 16 bites.

MOVE
ADD
AND
XOR
XEC
NZT
XMIT
JMP

Ez a 8X300. Csak senki sem figyel. ;)
 

Ha belegondolsz, elég hasonlóan működik a PIC is. Pl. az ANDWF f, F is beolvassa az utasítást és dekódolja, majd beolvassa, módosítja és visszaírja az adatot. Ugyanilyen négyfázisú órajellel működik ez is, csak komplexebb az utasításkészlet. Ezért a MOVE leírása 13 oldal. ;) A 8080 legrövidebb utasítása 5 órajel (ebből "+"1 a dekódolás), de akár 4-6 utasítás is kell a hasonló tevékenységhez, miközben kevésbé flexibilis a címzés.

Egyébként egy másik véglet, hogy ha még az adatbuszt is redukálod.
Mai napig foglalkoztat a "mire gondolt a költő" gondolata, amikor az 1 bites CPU-ra gondolok: https://tinymicros.com/mediawiki/images/e/ec/MC14500B_Handbook.pdf
Ezzel + például ROM alsó bitjeit multiplexernek adva se lehet semmi bitenként összepakolni a byteműveletet. Jó lassan ... :)

Nem, az az egyszerű lassú program olcsó csippel - ami régen nagyon drága volt.

De van ilyen, pl. az alap 74181, de ez csak ALU és ki kell építened a teljes CPU-t. A fejlettebb pl. az Am2900 sorozat, amely taralmazza vezérlőegységet is. Ezekre jellemző a 4 bites szélesség, amivel 8..64 bites processzort is építhetsz.

Hány utasítás kell minimum egy processzorba?

Attól függ mi a kérdés :) Mert más a válasz, ha

 - akadémiai az érdeklődés, mert akkor lehet hogy egy is elég :) 

 - ha az a kérdés hogy mi a leggyorsabban implementálható, ami még úgy kellően hatékony is gépi kód szinten - vsz ilyen a PIC is

 - ha az a kérdés hogy mi az ami gyors működést eredményez a gyakorlatban (vsz a rommá optimalizált ARM variánsok vezetnek most)

 - és ha az a kérdés hogy mi az ami egyszerűen implementálható de már letezik hozzá kvázi-univerzális GCC vagy hasonló C/C++ fordító (itt sztem szinte egyértelműen az AVR a nyertes)

Ha kevéssé akadémiai hanem inkabb explicit gyakorlati a kérdés akkor az architektúrához muszáj hozzászámokni még az ilyesmiket is mint I/O wait cyclek, stall állapotok gyakorisága, ALU mélység, memóriacimzés, stb... ez már nem attól függ hogy milyen is az utasitaskészlet, hanem az hogy a CPU hogyan csatolódik a külvilághoz... de ez már messzire vezet :] 

Ha netán van hasonlóan levezetett 4-nél kevesebb, áramkörben egyszerűen implementálható utasítás, azaz hogy a CPU a fentinél kevesebb CPLD makrocellában implementálható, az érdekel.
Egyébként néztem pár éve a Brainfuck-ot is, írtam néhány éve Rust-ban egy futtatókörnyezetet rá és a tesztek írása során frankón megtanultam BF programot írni. :)

ptr++
ptr--
data++
data--
STDIN
STDOUT
loop kezdet
loop feltételes vég (utsó data 0 érték esetén továbbenged)

Ez mondjuk kis módosítással versenyre kelhetne. Utasításbusza 3 bit széles + stack kell a [ ... [  ... ] .. ] téma miatt.
Hatékonynak nem nevezhetőek ezek. Játék céljából viszont általában nem érdemes bonyolultabbat hardverben megalkotni.

Na meg a másik kedvencemen is elgondolkoztam, a verem alapú számítógépeken. Lásd még a FORTH nyelvet.

Igen, ez oke! :) Akkor marcsak az a kerdes hogy milyen szelés es milyen mély a memoria. Ez azert elegge befolyasolja az utasitaskeszletet is, plane RISC architekturan. Foleg akkor, ha rajossz kesobb hogy "ja, ez igy jo volt, de kene boviteni"... noplane ugy hogy a korabbi kodokkal is legyel kompatibilis... 

URISC/OISC-bol tobb architektura is van. Gyakorlati megvalositas szempontjabol meg az a legjobb ezek kozul, ahol csak MOV van, es minden szamolas memoriaba mappelt eszkozokkel tortenik.

A strange game. The only winning move is not to play. How about a nice game of chess?

Innentől van egy "W" regiszter (latch) + a programmemória felső bitjeként (VAGY a programmemória címbitjének alsó bitjeként) 1 bit R/W iránymeghatározáshoz kell, a többi memóriacímbe ágyazva célhardver.
Még az összeadás A1, A2 és AR címei is.
A literál betöltése egy érdekes kivétel: célszerű például spéci "címtartományt" fenntartani neki és annyi kivételt, hogy kettő vagy több egymás utáni olvasással kerül be a W regiszterbe.
Tetszik.