Zadání závěrečného projektu CPU

Vytvořte vlastní procesor v Logisim Evolution, navrhněte pro něj instrukční sadu, popište ji tak, aby podle dokumentace šel psát strojový kód i assembler, a předveďte funkčnost na krátkém programu.

Nejde o kopii existující architektury, ale o vlastní, konzistentní a obhajitelný návrh. Velkou část parametrů si volíte sami. Důležité je, aby výsledkem byl skutečně programovatelný a obecný procesor, ne jen jednoúčelový sekvenční obvod.

Na co se klade důraz

  • Obecnost procesoru: procesor musí být schopen realizovat běžné programové konstrukce jako výpočty, práci s pamětí, podmínky a cykly.
  • Zajímavé I/O: I/O nemá být jen formální. Navrhněte takové vstupy a výstupy, které dávají smysl i z pohledu programování.
  • Programovatelnost: CPU musí jít rozumně programovat v assembleru.
  • Jednocyklovost: procesor by měl být alespoň téměř jednocyklový. Ideální stav je, že jedna instrukce znamená jeden takt; případné výjimky musí být malé, dobře zdůvodněné a nesmí z CPU dělat obecně mikrokódovaný vícekrokový automat.

Velká volnost je záměr

Můžete zvolit akumulátorovou, GPR i jinou ISA, pevnou i variabilní velikost opcode, Harvard i Von Neumann architekturu, vlastní flagy i vlastní způsob I/O. Hodnotí se hlavně konzistence návrhu, kvalita dokumentace a to, zda se na CPU dá skutečně něco rozumného naprogramovat.

Co musí procesor umět

V návrhu musí být možné, přímo nebo pomocí krátké posloupnosti instrukcí, realizovat alespoň následující schopnosti:

  • provést ALU operaci nad daty v CPU
  • přesouvat data mezi registry
  • načítat a ukládat data do paměti na vypočtenou adresu
  • načíst konstantu z instrukce do registru
  • změnit tok programu skokem
  • rozhodovat se podle podmínky
  • komunikovat s I/O zařízeními

Pozor

Ne každá z těchto věcí musí být nutně jedna konkrétní instrukce. Je přípustné některé operace realizovat kombinací více instrukcí, pokud to zůstane rozumné, zdokumentované a v ukázkovém programu předvedené.

Aby byl procesor považován za obecný, musí na něm jít psát programy s cykly, větvením a prací nad proměnnými daty, ne pouze pevná lineární posloupnost kroků.

Co se odevzdává

Součástí projektu jsou čtyři hlavní výstupy:

  1. dokumentace procesoru
  2. samotný procesor jako obvod v Logisimu
  3. customasm definice instrukční sady (#ruledef, případně #subruledef)
  4. jednoduchý výpočetní program v assembleru pro váš procesor

1. Dokumentace procesoru

Dokumentace je klíčová část projektu. Musí být dostatečně přesná na to, aby podle ní šlo:

  • pochopit architekturu procesoru
  • ručně zakódovat instrukci do strojového kódu
  • napsat customasm pravidla
  • napsat a odladit jednoduchý program

Dokumentace má být psaná věcně a odborně. Má být stručná, ale úplná: není cílem psát dlouhé omáčky, ale přesně a jednoznačně popsat vše, co je potřeba pro pochopení a používání procesoru.

Jako inspiraci si projděte příklady známých architektur. Skutečné dokumentace reálných procesorů bývají velmi rozsáhlé a jdou do mnohem větší hloubky. Vaše dokumentace nemusí být tak dlouhá ani tak detailní, ale musí přesně popsat základní princip operace procesoru a jeho instrukcí.

Povinná a velmi důležitá část dokumentace

Jednou z nejdůležitějších povinných částí dokumentace je tabulka mapování instrukcí do strojového kódu. Nestačí pouze slovní popis instrukcí. Musí existovat přehledná tabulka, ze které bude na první pohled patrné, jak vypadají formáty všech instrukcí a co znamenají jednotlivá bitová pole.

Minimální obsah dokumentace

Dokumentace musí obsahovat alespoň:

  • stručný popis architektury CPU
  • zvolené šířky:
    • dat
    • adres
    • instrukcí
    • registrů a pamětí
  • informaci, zda jde o Harvard nebo Von Neumann architekturu
  • popis všech programátorsky viditelných registrů
  • popis speciálních registrů, pokud existují
  • popis příznaků (flags), pokud existují
  • popis datové paměti, instrukční paměti a jejich role
  • popis všech I/O rozhraní a jejich programátorského použití
  • kompletní seznam instrukcí

U každé instrukce musí být uvedeno

  • jméno instrukce a její assemblerová syntaxe
  • význam operandů
  • chování instrukce slovně nebo v pseudokódu
  • odkud instrukce čte data a kam ukládá výsledek
  • jak se chová vůči PC
  • jak ovlivňuje flags, pokud nějaké používáte
  • binární formát instrukce
  • význam jednotlivých bitových polí
  • způsob kódování operandů
  • případná omezení, zakázané kombinace nebo nedefinované chování

V assembleru pojmenujte aritmetické instrukce tak, aby začínaly velkým písmenem; ostatní instrukce mají začínat malým písmenem.

Dále se požaduje

  • tabulka mapování instrukcí do strojového kódu
  • jasný popis adresních režimů, pokud jich procesor používá více
  • popis práce s immediate hodnotami
  • popis podmíněného větvení nebo jiného mechanismu podmíněného vykonání
  • popis toho, jak CPU realizuje požadované obecné schopnosti z předchozí sekce
  • zdůvodnění hlavních návrhových rozhodnutí a kompromisů

Tabulka mapování instrukcí

Tabulka mapování instrukcí je povinná. Doporučený formát je spreadsheet, typicky Excel nebo LibreOffice Calc, případně jiný ekvivalentní tabulkový editor.

Očekává se tabulka, ve které:

  • každý řádek odpovídá jedné instrukci nebo jedné konkrétní variantě instrukce
  • bity instrukce jsou znázorněny v úzkých sloupcích
  • související bity tvoří pomocí merge cells jedno společné pole
  • v každém takto sloučeném poli je napsáno, co dané bity znamenají
  • bity s pevnou hodnotou jsou vizuálně odlišené, typicky podmíněným formátováním
  • je na první pohled vidět, které bity jsou 0 a které 1, například červeně a zeleně
  • napravo od bitového formátu je uvedena assemblerová syntaxe instrukce včetně operandů

V tabulce musí být alespoň

  • název nebo mnemonika instrukce
  • assemblerová syntaxe instrukce včetně operandů
  • úplný bitový formát instrukce
  • vyznačený opcode
  • vyznačené operandové části instrukce
  • popis významu každého operandového pole
  • informace, co se do daného pole zapisuje:
    • číslo registru
    • immediate hodnota
    • podmínka
    • ALU podoperace
    • směr přenosu
  • nebo jiný význam podle vašeho návrhu
  • pokud je to relevantní, i poznámka k šířce a interpretaci hodnoty, například zda jde o u8, s8 nebo adresu

Detailní informace o parametrech instrukcí, jejich významu, omezeních nebo chování nemusí být nutně všechny přímo v tabulce. Mohou být kdekoliv v dokumentaci, pokud je dokumentace jako celek úplná a přehledná.

Na druhou stranu platí, že pokud tabulka mapování instrukcí obsahuje všechny důležité informace o instrukcích přehledným a dobře čitelným způsobem, není nutné tyto informace znovu duplicitně přepisovat jinam. Tabulka je v takovém případě plnohodnotnou a nedílnou součástí dokumentace.

Úprava tabulky

Na vizuální úpravě záleží. Tabulka má být přehledná a rychle čitelná.

Očekává se zejména:

  • rozumné řazení instrukcí, například podle opcode, podle délky opcode nebo po skupinách podobných instrukcí
  • konzistentní práce s barvami
  • konzistentní orientace bitů, typicky MSB vlevo a LSB vpravo
  • viditelné oddělení konstantních bitů od operandů
  • dostatečně popsaná hlavička tabulky

Doporučení

Pokud budou mít podobné typy operandů v různých instrukcích podobné pozice, tabulka bude přehlednější a současně se vám tím zjednoduší návrh řídicí logiky i customasm pravidel.

Praktická představa

Dobrá dokumentace má být dostatečně přesná na to, aby si jiný člověk podle ní dokázal ručně zakódovat několik instrukcí, napsat malý program v assembleru a pochopit, proč procesor funguje právě takto.

2. Procesor jako obvod v Logisimu

V Logisim Evolution vytvořte skutečný procesor, který odpovídá vaší dokumentaci.

Požadavky na obvod

  • jde o synchronní sekvenční obvod
  • obsahuje programovou paměť a mechanismus načítání instrukcí
  • obsahuje PC a bez skokové instrukce postupuje na další instrukci
  • umí vykonat instrukce popsané v dokumentaci
  • je programovatelný pomocí strojového kódu odpovídajícího navržené ISA
  • je alespoň téměř jednocyklový
  • Použijte registrovou banku
  • Jako ALU procesoru použijte jedno z:
    • Vaše ALU z předchozí úlohy
    • Vaše ALU, ale upravené tak, aby vám lépe fungovalo v procesoru (větší data, další/jiné operace, Logisimová aritmetika, etc.)
    • Postavte nové alespoň stejně dobré ALU jako požaduje zadání jeho úkolu (ale můžete použít Logisimovou aritmetiku pro zjednodušení)
  • Všechny stavové registry procesoru se budou ukazovat v záložce "State" v Logisimu
  • Celý procesor lze ovládat z jednoho přehledného místa o velikosti jedné obrazovky
    • tzn. IO, clock, atd. by měly být pohromadě
    • stav registrů musí být vidět taky - ale na to stačí ta záložka "State"
    • je výhodné (pro vás i pro mě), aby odsud bylo vidět i kterou instrukci CPU spouští
      • buď tam můžete umístit celý instrukční dekodér, nebo sadu LED diod, které se rozsvítí podle toho, jaká instrukce se pouští

V návrhu se očekává

  • datová cesta odpovídající sadě instrukcí
  • kontrolní jednotka, která instrukci dekóduje na kontrolní signály
  • rozumně navržená sada registrů
  • podpora práce s pamětí
  • podpora podmínek, pokud je CPU používá
  • podpora I/O

Kvalita návrhu

  • všechny důležité signály, registry, sběrnice, piny a IO moduly musí být pojmenované
  • šířky vodičů musí být konzistentní a jednoznačné
  • v diagramu musí být zřejmé, kudy tečou data a odkud se berou kontrolní signály
  • pokud používáte flagy nebo stavové signály, musí být zřejmé, kde vznikají a kde se používají
  • pokud má některá instrukce výjimku z jednocyklovosti, musí to být z návrhu i dokumentace patrné

I/O

I/O je významná část projektu. Očekává se, že navrhnete něco zajímavějšího než pouze formální jeden vstup a jeden výstup.

Vhodné příklady:

  • tlačítka nebo přepínače jako vstup a LED nebo hex displej jako výstup
  • klávesnice a TTY
  • LED matrix
  • vlastní paměťově mapované nebo instrukčně ovládané periferie

Jako jeden ze vstupů procesoru použijte šest tlačítek zakódovaných do jednoho bytu.

Nejde jen o připojení periferie k procesoru, ale i o to, aby ji šlo smysluplně použít v programu.

3. customasm ruledef pro procesor

K procesoru vytvořte customasm definici, která odpovídá vaší ISA a umožní generovat strojový kód pro Logisim.

Požaduje se

  • korektní #ruledef pro všechny instrukce, které používáte
  • #subruledef všude, kde dává smysl, např. pro registry, podmínky nebo podvarianty instrukcí
  • správně nastavená šířka instrukční paměti a exportu
  • konzistence mezi dokumentací, assemblerem a skutečným hardwarem

Pozor na #bankdef

V customasm je potřeba správně nastavit #bankdef podle šířky vašich instrukcí. Jinak bude assembler generovat výstup v jiném formátu, než jaký očekává váš procesor v Logisimu. Také je potřeba vyexportovat soubor ve formátu pro Logisim paměť správné šířky. Pokud jednu nebo obě tyto věci zanedbáte, nepřenese se strojový kód do Logisimu správně.

Příklad pro procesor s 22bit instrukcí:

#bankdef code ; na nazvu nezalezi
{
    #bits 22 ; upravte podle sirky instrukci
    #addr 0x0000
    #size 0x8000 ; upravte podle velikosti vasi ROM
    #outp 0x0000
}

Je vhodné doplnit

  • pseudoinstrukce, pokud zjednoduší programování
  • komentáře vysvětlující méně zjevné části kódování
  • krátký příklad použití assembleru

Warning

Pokud se liší dokumentace, customasm pravidla a chování procesoru v Logisimu, je to chyba návrhu. Všechny tři vrstvy musí popisovat stejný procesor.

4. Jednoduchý výpočetní program v customasm

Napište krátký program, který na vašem CPU skutečně něco počítá a zároveň předvede důležité vlastnosti návrhu.

Program musí ukázat

  • aritmetiku nebo jiný netriviální výpočet
  • práci s registry
  • alespoň jednu řídicí konstrukci:
    • podmínku
    • cyklus
    • nebo obojí
  • smysluplné použití I/O

Program nemá být pouze

  • jednorázové nastavení několika registrů
  • lineární posloupnost bez rozhodování
  • prosté vypsání konstant bez výpočtu
  • výpočty na neinicializovaných nebo nulových registrech

Co k programu doplňte

  • stručný popis, co program dělá
  • jaké má vstupy
  • co je jeho výstup
  • jak se program spouští v Logisimu
  • proč je zvolený program vhodný jako ukázka schopností CPU

Vhodné příklady programů:

  • součet nebo průměr několika hodnot
  • maximum nebo minimum v poli
  • násobení opakovaným sčítáním nebo square a multiply
  • výpočet faktoriálu nebo mocniny v malé datové šířce
  • zpracování vstupu z klávesnice nebo přepínačů a zobrazení výsledku na displeji, TTY nebo LED matrixi
  • fibonacciho posloupnost
  • collatzova konjektura
  • výpočet GCD nebo LCM
  • ...

Zkrátka, ukázkový program by měl demonstrovat, že chápete programování v asembleru, a měl dostatečně využívat výpočetní sílu vašeho procesoru.

Do vašeho ukázkového programu přidejte i funkci prepareMem, která vyplní paměť hodnotami 0xdb. Tato funkce se nemusí volat, slouží pouze jako ukázka programování. Tato funkce není sama o sobě řešením zadání "jednoduchého výpočetního programu" - musíte si vybrat nějaký vlastní, pouze do něj doplňte tuto funkci "navíc".

Pokud máte nějaký nápad a chtěli byste pomoct odhadnout komplexitu implementace v assembleru, můžete mi napsat.

Doporučení k návrhu

  • Začněte návrhem ISA a teprve z ní odvozujte datovou cestu.
  • U každé instrukce si explicitně rozmyslete, odkud tečou data a kam se ukládají.
  • Snažte se, aby podobné operandy byly ve strojovém kódu na podobných pozicích.
  • Pokud některou schopnost omezíte, vždy si ověřte, že ji lze pohodlně nahradit krátkou sekvencí jiných instrukcí.
  • Zvažujte jednoduchost hardware a jednoduchost programování zároveň.

Studijní opora

Při návrhu vycházejte zejména z:

Shrnutí

Výsledkem má být vlastní, zdokumentovaný, programovatelný a alespoň téměř jednocyklový procesor v Logisimu, ke kterému existuje assembler v customasm a krátký program demonstrující výpočet i práci se zajímavým I/O.

Last change: 2026-05-14, commit: bc26363