Hlavní navigace

Programovací jazyk Forth a zásobníkové procesory (17)

3. 5. 2005
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu si popíšeme zásobníkové mikroprocesory Novix NC4016 a Harris RTX 2000. Tyto dva procesory jsou určeny zejména do vestavěných systémů, kde je požadována nízká cena, velká rychlost zpracování dat a zejména velmi rychlé reakce na přerušení.

Obsah

1. Šestnáctibitový zásobníkový mikroprocesor Novix NC4016
2. Hardwarové parametry mikroprocesoru Novix NC4016

3. Zásobníky a externí sběrnice mikroprocesoru Novix NC4016
4. Instrukční sada mikroprocesoru Novix NC4016
    4.1 Horizontální kódování instrukcí
    4.2 Slova programovacího jazyka Forth, která lze provést pomocí jedné instrukce
    4.3 Složená forthovská slova, která lze provést pomocí jedné instrukce
5. Šestnáctibitový zásobníkový mikroprocesor Harris RTX 2000

6. Jádro procesoru Harris RTX 2000
7. Hardwarová konfigurace procesoru Harris RTX 2000
8. Obsah dalšího pokračování

1. Šestnáctibitový zásobníkový mikroprocesor Novix NC4016

V oblasti vestavěných systémů se často používal šestnáctibitový zásobníkový mikroprocesor nazvaný Novix NC4016, jehož prototypovým předchůdcem byl Novix NC4000. Tento mikroprocesor je navržený tak, aby bylo možné co nejvíce instrukcí provést v jednom taktu CPU, což je zajisté výhodné, například při zpracování přerušení, kdy není zapotřebí složitě přerušovat či naopak dokončovat právě běžící instrukce. Celá instrukční sada tohoto mikroprocesoru byla navržena tak, aby bylo možné co nejjednodušším a nejrychlejším způsobem provádět kód napsaný v programovacím jazyku Forth. Mnoho základních (primitivních) forthovských slov je tak možné přeložit do jedné instrukce, dokonce je možné do jedné strojové instrukce přeložit vhodně zvolené kombinace forthovských slov. Bližší informace o instrukční sadě budou uvedeny ve čtvrté kapitole. Mikroprocesor Novix NC4016 byl v minulosti použit například v různých řídicích real-time systémech, ale také v řadičích CRT obrazovek, T1 switchích, řadičích laserových tiskáren apod.

Mikroprocesor Novix NC4016 je současně i prvním zásobníkovým procesorem vytvořeným na jednom čipu, v minulosti používané zásobníkové procesory byly většinou vytvořeny tak, že oddělovaly ALU a řídicí část. Mnoho zásobníkových mikroprocesorů je založeno právě na NC4016, a to jak z hlediska vnitřní architektury, tak i z hlediska horizontálně kódovaného instrukčního souboru, který je díky tomu do velké míry ortogonální (což je, zejména pokud se podíváme na základní forthovská slova, poněkud překvapivé). Bližší popis tohoto zajímavého mikroprocesoru bude rozdělen do několika kapitol. Ve druhé kapitole budou popsány některé hardwarové detaily, kapitola třetí je věnována ústřednímu bodu zásobníkových procesorů, tj. vlastním zásobníkům, a konečně ve čtvrté kapitole budou uvedeny podrobnější informace o instrukční sadě a způsobu zápisu základních forthovských slov v této instrukční sadě.

2. Hardwarové parametry mikroprocesoru Novix NC4016

Tento šestnáctibitový zásobníkový mikroprocesor byl vytvořen pomocí cca 4000 logických hradel (ostatně z této hodnoty se odvozuje i samotné jméno mikroprocesoru), pro implementaci byla použita v té době dostupná třímikronová technologie HCMOS. Pouzdro procesoru obsahovalo 121 pinů (viz další povídání o několika implementovaných sběrnicích) a bylo provedeno pro patice PGA – Pin Grid Array (podobně jako například starší mikroprocesory 486 a Pentium). Taktovací frekvence byla rovna 8 MHz, přičemž muselo být zaručeno, aby přístup do paměti byl dvakrát tak rychlý jako hodinový kmitočet (resp. jeho časová základna). V dnešní době by tato podmínka byla neakceptovatelná, protože dynamické paměti jsou mnohem pomalejší než moderní procesory, v minulosti tomu však bylo zcela opačně – ostatně rychlost dynamických pamětí se o mnoho nezvyšuje, pro procesory však stále platí známý Moorův zákon.

Interně jsou na procesoru vytvořeny sběrnice TBUS a YBUS, které slouží k přenosu hodnot z a do aritmeticko-logické jednotky. K ALU je připojen i interní registr TOP, který lze použít jak pro vstup hodnot (operandů), tak i pro uložení výsledné hodnoty. ALU obsahuje na vstupu dva interní registry označené T (top of data stack) a N (next data stack cell). Kromě toho se na procesoru nachází i čtyři další registry, které jsou viditelné i programátorům.

Prvním z těchto registrů je známý registr PC, který je napojený na specializovaný blok provádějící operaci PC++. Skoky lze provádět pouze po šestnácti bitech, podobně jako u předchozích popisovaných zásobníkových mikroprocesorů. Dalším registrem je registr I, (index) který slouží k rychlému řízení počítaných smyček. Tento registr je chápán jako vrchol zásobníku návratových adres. K tomuto registru je připojen specializovaný blok provádějící operaci I–. Dalším registrem je registr MD, který slouží k násobení a dělení, a registr SR zajišťující provedení operace celočíselného umocnění.

3. Zásobníky a externí sběrnice mikroprocesoru Novix NC4016

Velmi zajímavé je řešení paměťového subsystému. Místo použití jedné sběrnice pro čtení z paměti zápis do ní obsahuje tento mikroprocesor sběrnice hned tři. Kromě programové paměti je totiž možné připojit i samostatnou paměť s uloženým zásobníkem návratových adres a zásobníkem operandů. Díky použití tří nezávislých sběrnic pro přístup ke třem paměťovým čipům bylo možné zajistit provedení většiny instrukcí v jednom strojovém cyklu.

Kapacita zásobníku operandů je 256 elementů, které jsou umístěny ve specializované paměti připojené na separátní sběrnici. Dvě nejvyšší buňky jsou umístěny v interních registrech T a N. Tento procesor však neobsahuje obvod, který by zjistil, že došlo k přetečení či podtečení zásobníku operandů, takže ladění programů ve Forthu muselo být prováděno jejich zdlouhavou interpretací.

Kapacita zásobníku návratových adres je taktéž rovna 256 elementům, které jsou umístěny ve specializované paměti odlišné od paměti použité pro implementaci zásobníku operandů. Nejvyšší položka ze zásobníku návratových adres je umístěna v interním registru I, takže provádění smyček či dalších jednoduchých operací se zásobníkem návratových adres je velmi rychlé.

4. Instrukční sada mikroprocesoru Novix NC4016

Mikroprocesor Novix NC4016 byl prvním zásobníkovým mikroprocesorem, který používal horizontální formát instrukcí. Na druhou stranu jsou zásobníkové procesory dnes prakticky jediné, které tento formát používají, jakousi paralelu je možné vidět pouze u některých procesorů typu VLIW (Very Long Instruction Word). Všechny instrukce procesoru mají pevnou délku šestnáct bitů, což velmi zjednodušuje celý vnitřní design.

4.1 Horizontální kódování instrukcí

Při použití horizontálního kódování instrukcí se v instrukčním slově přímo nacházejí pole určená pro jednotlivé bloky na mikroprocesoru. Mezi tyto bloky řadíme například ALU, řadič, interní sběrnice, interní registry, čítače apod. Odpadá tak nutnost použití složité dekódovací jednotky. Instrukce jsou rozděleny do několika kategorií, které se odlišují pomocí několika nejvyšších bitů instrukce – jedná se tedy o princip vzdáleně podobný Huffmanovu kódu. Popišme si nyní několik základních kategorií instrukcí:

Instrukce typu CALL

Při kódování této instrukce je vždy nejvyšší (tj. patnáctý) bit nastavený na nulu. Ostatní bity tvoří patnáctibitovou adresu, pomocí níž je možné adresovat 32k slov programové paměti. Vzhledem k tomu, že adresace vždy probíhá po celých slovech, může mít programová paměť kapacitu 64 kB, což je dostačující pro prakticky všechny implementace vestavěných systémů postavených na Forthu.

Podmíněný skok

Kód této instrukce je vytvořený tak, že nejvyšší bit je nastavený na jedničku (tím se odlišuje od instrukce typu call) a druhý nejvyšší bit je nulový. Další dva bity obsahují kód podmínky, při které nastane skok. Buď se testuje hodnota uložená v interním registru T, nebo hodnota indexového registru I. Zbývajících dvanáct bitů instrukčního slova tvoří relativní adresu.

Operace s ALU

Tyto instrukce jsou vytvořeny tak, že nejvyšší čtyři bity obsahují bitový vzorek 1000. Na dalších třech bitech je zakódována jedna z osmi funkcí, které může ALU provádět (+, -, and, or, xor, first, second), jeden bit je rezervován pro návrat z podprogramu (return) a další bity pro specifikaci operací bitového posuvu a dělení (tyto operace se provádějí mimo ALU).

Operace s pamětí

Bity 15–13 obsahují bitový vzorek 111. Spolu s ALU funkcemi (viz výše) je možné provádět inkrementaci a dekrementaci o konstantu uloženou přímo v instrukčním slovu. Tato konstanta má délku pět bitů, což je pro mnoho operací dostačující.

Načtení literálu

Bity 15–13 obsahují bitový vzorek 110. Načtení literálu je možné kombinovat s ALU funkcemi a s návratem z podprogramu. Vše se samozřejmě provádí v jednom strojovém taktu.

4.2 Slova programovacího jazyka Forth, která lze provést pomocí jedné instrukce

Pomocí výše nastíněných typů instrukcí lze přímo vytvořit základní (primitivní) forthovská slova, která se díky tomu provedou v jednom strojovém cyklu:

        :  (skok do podprogramu)  AND
        ;  (návrat z podprogramu) BRANCH
        !                         DROP
        +                         DUP
        -                         I
        0                         LIT (zápis konstanty)
        0<                        NOP
        0BRANCH                   OR
        1+                        OVER
        1-                        R>
        2*                        R@
        >R                        SWAP
        @                         XOR 

4.3 Složená forthovská slova, která lze provést pomocí jedné instrukce

Vzhledem k tomu, že procesor Novix NC4016 má instrukce navrženy tak, že je v jedné instrukci možné kombinovat návrat z podprogramu, ALU operaci a práci s literálem, je možné v jednom taktu (tj. v jedné instrukci) zakódovat i několik forthovských slov, například:

        nn                       @ +
        nn !                     @ +c
        nn +                     @ -
        nn +c                    @ -c
        nn -                     @ SWAP -
        nn -c                    @ SWAP -c
        nn @                     @ OR
        nn @ +                   @ XOR
        nn @ +c                  @ AND
        nn @ -                   DROP DUP
        nn @ -c                  DUP nn !
        nn @ AND                 DUP nn ! +
        nn @ SWAP -              DUP nn ! -
        nn @ SWAP -c             DUP nn ! AND
        nn @ OR                  DUP nn ! OR
        nn @ XOR                 DUP nn ! SWAP -
        nn AND                   DUP nn ! XOR
        nn I@                    DUP nn I!
        nn I@ +                  DUP nn I! +
        nn I@ -                  DUP nn I! -
        nn I@ AND                DUP nn I! AND
        nn I@ OR                 DUP nn I! OR
        nn I@ SWAP -             DUP nn I! SWAP -
        nn I@ XOR                DUP nn I! XOR
        nn I@!                   DUP @ SWAP nn +
        nn I!                    DUP @ SWAP nn -
        nn OR                    OVER +
        nn SWAP -                OVER +c
        nn SWAP -c               OVER -
        nn XOR                   OVER -c
        lit +                    OVER SWAP -
        lit +c                   OVER SWAP -c
        lit -                    R> DROP
        lit -c                   R> SWAP >R
        lit AND                  SWAP -
        lit OR                   SWAP -c
        lit SWAP -               SWAP DROP
        lit SWAP -c              SWAP OVER !
        lit XOR                  SWAP OVER ! nn +
                                 SWAP OVER ! nn - 

Ve výše uvedeném přehledu je pomocí znaků nn naznačeno, že se jedná o pětibitovou konstantu, která je obsažena přímo v instrukčním slově. lit naopak představuje „plný“ šestnáctibitový literál, který je uložen v programové paměti za instrukcí.

5. Šestnáctibitový zásobníkový mikroprocesor Harris RTX 2000

Stack machines have been successful mostly in embedded applications where some real-time performance requirements might have been very costly to meet with other technologies. The Harris RTX was not successful like the 486 but did see quite a few sales in its day until it was discontinued. I was told it was used in some large product runs in Europe. There is stack machine currently being designed for Postscript printers and also has been chosen for the Web-Book product. It is a pretty complex processor with lots of things that would make a C compiler happy.
Jeff Fox

Mikroprocesor Harris RTX 2000 byl vytvořen na základě výše zmíněného mikroprocesoru Novix NC4016. Oproti tomuto procesoru však došlo k mnohem větší integraci, což se projevilo i na nových funkčních blocích, které byly přímo do jádra procesoru zahrnuty. Jednalo se především o integraci zásobníkových pamětí, implementaci hardwarové násobičky, čítačů a časovačů.

6. Jádro procesoru Harris RTX 2000

Jádro zásobníkového mikroprocesoru Harris RTX 2000 vychází z jádra procesoru Novix NC4016, to znamená, že jsou vytvořeny interní sběrnice YBUS a TBUS, stejně jako interní registry TOP, T, N, PC a I. Kromě toho je přidán i takzvaný page register, který je možné použít pro rozšíření programové paměti z původních 64 kB na celý 1 MB. Page register se tedy v mnohém podobá známým segmentům procesorů Intel x86.

Kromě toho je v jádru procesoru implementována i hardwarová násobička 16×16 bitů, řadič přerušení (ten na předešlém procesoru chyběl) a tři čítače společně s časovači (tj. dané čítače je možné ovládat buď pomocí externích signálů, nebo pomocí hodin, před něž je připojena dělička). Zásobník operandů i zásobník návratových adres mají kapacitu 256 položek a oba jsou vytvořeny přímo v mikroprocesoru, odpadá tak nutnost použití speciálních sběrnic pro přístup k externím pamětem.

7. Hardwarová konfigurace procesoru Harris RTX 2000

Na rozdíl od předchozího procesoru je mikroprocesor Harris RTX 2000 vytvořen pomocí dvoumikronové technologie CMOS, je zde tedy patrný velký pokrok kupředu, alespoň co se týče míry integrace. Vzhledem k tomu, že oba zásobníky jsou integrované přímo na procesoru, bylo možné snížit počet pinů na přijatelných 84, jako pouzdro je použito PGA (Pin Grid Array). Procesor je vytvořen tak, aby pracoval na frekvenci 10 MHz, výkonově tak zhruba odpovídá procesoru 286 pracujícímu na 20 MHz.

Při vývoji jádra tohoto mikroprocesoru byla použita technologie, ve které je možné spojovat přímo jednotlivá logická hradla, čímž bylo umožněno implementovat současně kombinační obvody s pamětí (registry, oba zásobníky atd.). V dnešní době jsou pro podobné návrhy dostupné programovatelné obvody FPGA, v minulosti však tyto možnosti neexistovaly, proto bylo nutné sáhnout po „primitivnějším” řešení, které na druhou stranu dalo vývojářům větší možnosti optimalizace jednotlivých funkčních bloků.

CS24_early

8. Obsah dalšího pokračování

V dalším pokračování tohoto seriálu budou popsány třicetidvoubitové zásobníkové procesory FRISC 3 a RTX 32P. Zajímavý je zejména zmíněný FRISC 3, neboť u něj došlo k velkému nárůstu počtu zásobníků, takže bylo možné provádět skutečně paralelní běh více programů (tj. nikoli pomocí přepínání kontextu).

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.