A legegyszerűbb 16 bites Forth processzor

A Forth az egyszerűsége és a megszokottól való eltérése miatt keltette fel néhány éve a figyelmemet.
Vezérléstechnikában igen komoly sikereket ért el az 1980-as években, sőt Forth processzoros egységgel szálltak le néhány éve egy üstökösre is.

 

Itt egy leírás egy igen egyszerű Forth CPU-ról:
     https://excamera.com/files/j1.pdf

A CPU hardverének forráskódja mindössze 187 sor:
     view-source:https://excamera.com/files/j1demo/verilog/j1.v

Alap Forth utasításkészlet itt van definiálva:
     https://excamera.com/files/j1demo/docforth/basewords.fs.html

Innentől már Forth-ban programozható tovább.

 

Update: Spartan-3 FPGA esetén a 8k x 16 bit RAM az FPGA-n belül van implementálva a fenti kódban.
Ha külső RAM IC-t illesztünk hozzá és kivesszük a Verilogból a belső RAM implementációt, akkor az első fordítási tesztjeim szerint egy kisebb CPLD-be is belefér a CPU.

Hozzászólások

Nagyon jo, koszi a linkeket! Ezt a FORTH-dolgot mar regota ki akarom probalni.

Spartan-3 FPGA esetén a 8k x 16 bit RAM az FPGA-n belül van implementálva a fenti kódban.

Igen, ez a RAMB16_S2_S2 modul elegge Xilinx-specifikus(nak tunik). Erdemes lehet ugy is publikalni egy ilyen kodot hogy meghagyod a dual-port RAM-ot Verilog-formaban, es a szintezis osszerakja a megfelelo BRAM modulokbol ami epp' az adott gyarto adott FPGA-jaban van ;) Ez teljesen hordozhato, legalabbis igy valtoztatas nelkul tudtam Xilinx es Lattice eszkozokon is es iverilog alapu szimulatorban is ugyanazt a kodot hasznalni komplexebb design-ekre (avr, armv6-m core, sajat periferiak).
 

Meglepődtem, hogy mennyi olyan nyelv van, amely stack machine backendre támaszkodott.
Sőt hardverben a 8087 FPU is ilyen stack logikára épített. Kivette a 2 felsőt és az eredményt visszatolta a 8 mélységű verembe.

Időközben megtudtam nyugdíjas barátomtól, hogy több szálas futtatásnál timer IRQ-ban volt a váltás leprogramozva és a szálaknak dedikált stack-jei (D és R) voltak.
Ezáltal szépen lehetett több független folyamatot programozni, amely mindegyike fix időszeletet kapott a CPU-ból, amit mellesleg akár eltérő arányban is lehetett osztani.

Igen, a stack az egy jo dolog! Felhasznalo altal megadott matematikai kifejezesek kiertekelesere is ket megkozelites lehetseges: a parser generator alapu (bison, yacc, stb) vagy az hogy az egyes token-eket atalakitjuk postfix notationra, es azt ertekeljuk ki a masodik lepesben egy stack segitsegevel. Ezutobbi is egy nagyon hatekony megkozelites, sok helyen hasznalom ezt. Ha a stack egyes elemei nem csak valtozok + muveletek lehetnek, hanem onallo, postfix kifejezesek is akkor egeszen jopofa dolgokat lehet csinalni (pl. analitikus differencialas, analitikus egyszerusites, kiertekelesek optimalizalasa, stb).