Proč bychom si chtěli vytvořit vlastní procesor?
Asi každý programátor si někdy položil otázku, jak počítač uvnitř funguje, když provádí nějaký program. Na úrovni vyššího programovacího jazyka máme příkazy, proměnné, datové typy, třídy, objekty, funkce a další abstraktní entity. Text programu se přeloží do strojového kódu, který se uloží do operační paměti a procesor jej postupně čte a vykonává. Toto je nejnižší úroveň softwaru, pracující s pojmy jako instrukce a registry. Pod ní začíná hardware.
Když se podíváme z opačného konce, tušíme, že uvnitř integrovaných obvodů v počítači jsou obrovské počty tranzistorů propojených komplikovanou pavučinou vodičů. V literatuře o elektronice (např. v knize od Martina Malého Hradla, volty, jednočipy) se dozvíme, jak tranzistory a další elektronické součástky fungují a jak z nich lze sestavit elementární logické a paměťové obvody. Pokud si chceme základní obvody i „osahat“, můžeme si nakoupit potřebné součástky a podle dostupných návodů si tyto obvody sestavit.
Mezi logickými hradly a strojovým kódem ale pořád zůstává hodně velká mezera plná otázek. Jak naučit elektronický obvod číst instrukce z paměti a provádět požadované operace? Z jakých částí se skládá procesor (CPU) a jak jednotlivé části fungují? Jak CPU komunikuje s pamětí a periferními zařízeními? I na tyto otázky můžeme najít odpovědi. Zde na Rootu to už před lety srozumitelně popsal Pavel Tišnovský v seriálu Jak pracuje počítač?
Pro základní pochopení takové vysvětlení stačí, ale zvídavějším jedincům a „hračičkům” pořád něco chybí. Přes všechny animace, případně emulátory jednoduchých učebnicových procesorů stále nejsou vidět všechny detaily. Také by bylo pěkné mít možnost napsat si jednoduchý program, pokud ne ve vyšším jazyce, tak v assembleru, přeložit ho do strojového kódu, spustit a dívat se, jak počítač dělá něco netriviálního. Například čte znaky z klávesnice a vypisuje je na obrazovku a my přitom do detailů víme, co a jak se uvnitř děje.
Nejlepší způsob, jak dosáhnout těchto cílů, je vyrobit si svůj procesor a doplnit ho dalšími obvody, aby vznikl celý počítač. Myslím tím opravdu postavit funkční kus hardwaru, nikoliv jen naprogramovat emulátor.
Analýza a kopírování existujících konstrukcí
Jedna možná cesta je analyzovat konstrukci a fungování historických procesorů. Na webu se dají najít projekty, které se snaží o reverzní inženýrství CPU. U starých osmibitových procesorů, které si starší z nás pamatují z osmibitových počítačů z přelomu 80. a 90. let minulého století, stačí v podstatě jen odstranit pouzdro integrovaného obvodu a analyzovat snímky čipu pořízené mikroskopem.
Takto se podařilo zjistit detaily konstrukce CPU Intel 8080, použitého (v podobě kopie Tesla MHB8080A) i v československých počítačích IQ 151 a PMD 85. Další podobně analyzované procesory jsou Zilog Z80 (Sinclair ZX Spectrum, nebo jeho československý klon Didaktik Gama), MOS Technology 6502 (Apple I, Apple II, Atari 800XE/XL), nebo i složitější 16bitový Intel 8086 používaný (ve zjednodušené variantě 8088) v původních IBM PC.
Kromě fotografií a analýzy konstrukce čipů jsem narazil i na projekty reimplementace zmíněného 6502 z diskrétních součástek: MOnSter 6502 a C74–6502 CPU. Existují také projekty, které popisují zapojení a logiku těchto procesorů, případně celých počítačů, pomocí jazyků ze skupiny hardware description languages, obvykle VHDL nebo Verilog. Z nich lze generovat softwarově emulované nebo i hardwarové implementace.
Tím se dostáváme k našemu tématu. Když už se tolik nadšenců věnuje analýze a reimplementaci existujících procesorů, můžeme udělat i další krok a zkusit vytvořit nikoliv implementaci podle existujícího vzoru, ale začít od začátku a postavit CPU podle svého vlastního originálního návrhu. Nejprve si ale vysvětlíme několik důležitých zkratek a pojmů.
VHDL, FPGA, ISA, microarchitecture
O VHDL jsme se už zmínili. Je to zástupce třídy hardware description languages, tedy jazyků pro popis hardwaru. Jak tato charakteristika napovídá, zdrojový kód zapsaný v jazyce VHDL popisuje strukturu a chování nějakého elektronického obvodu, např. CPU. Je možné definovat chování jednotlivých malých částí obvodu, logických hradel nebo registrů a následně je pomocí signálů, v podstatě „virtuálních vodičů“, propojovat do komplexnějších celků. VHDL definuje abstraktní logiku chování obvodu, bez ohledu na konkrétní technologii použitou pro jeho fyzickou realizaci.
FPGA, neboli Field Programmable Gate Array, česky programovatelné logické pole, je integrovaný obvod, který se skládá z pole identických logických elementů. Každý element umí počítat libovolnou logickou funkci z několika jednobitových vstupů a výsledek poslat do jednobitového výstupu. Výsledek si také může zapamatovat v jednobitovém registru. Logické elementy jsou navzájem propojeny konfigurovatelnou sítí vodičů a dají se také napojit na vstupně-výstupní piny a komunikovat tak s okolím. Logických elementů jsou k dispozici běžně tisíce, desititisíce i více. FPGA často obsahuje ještě další užitečné obvody, např. bloky paměti RAM, generátory hodinových signálů nebo hardwarové násobičky.
Programování FPGA probíhá tak, že kód VHDL se pomocí „kompilátoru“, zde nazývaného syntetizér, přeloží na posloupnost konfiguračních instrukcí definujících funkce počítané v jednotlivých logických elementech a nastavení propojovací sítě. Tento konfigurační stream se pak nahraje do FPGA. Tím vznikne obvod pracující podle definice ve VHDL. Naším cílem je implementovat CPU.
V jazyce VHDL popíšeme logiku fungování našeho procesoru a dalších obvodů tvořících počítač. Z tohoto kódu pak syntetizujeme konfigurační data a nahrajeme je do vhodného FPGA. Tím získáme softwarově definovaný počítač, který můžeme snadno ladit a upravovat, zároveň to ale bude skutečná hardwarová implementace na úrovni jednotlivých hradel, ne pouhá softwarová emulace.
V titulku této části zbývají ještě dva pojmy k vysvětlení. ISA, neboli Instruction Set Architecture, je specifikace procesoru z pohledu programátora v assembleru. Zahrnuje seznam registrů, datové typy podporované na úrovni strojového kódu, definice chování jednotlivých instrukcí a další vlastnosti CPU viditelné pro software, např. mechanismus přerušení. Naopak mikroarchitektura je konkrétní implementace ISA v hardwaru. Stejnou ISA lze implementovat různými mikroarchitekturami, které se mohou lišit složitostí, výkonem, používáním technik jako pipelining, predikce skoků, velikostí cache a podobně.
Co potřebujeme a kolik to bude stát peněz a času?
O existenci obvodů FPGA a teoretické možnosti použít je pro implementaci mikroarchitektury CPU jsem tušil, ale nikdy dřív jsem se touto myšlenkou nezabýval hlouběji. Měl jsem za to, že jako člověku, který se sice zabývá programováním, ale nemá znalosti a zkušenosti s konstrukcí hardwaru a neví nic o jazycích pro popis hardwaru, by mi dosažení takového cíle trvalo mnohem déle a bylo dražší, než kolik bych do toho byl ochoten investovat. Tento můj pohled se zásadně změnil někdy v prosinci 2023. Přispělo k tomu několik překvapivých zjištění.
Především jsem při procházení e-shopů s elektronickými součástkami zjistil, že vývojová deska obsahující FPGA, potřebné podpůrné obvody (napájení, paměť a komunikační rozhraní pro nahrávání konfiguračních dat) a různé periferie, např. tlačítka, LED, 7segmentový displej a konektory VGA, PS/2 a RS-232, se dá koupit docela levně a základní verze vývojového prostředí je k dispozici zdarma. Pro své pokusy jsem si vybral kit s FPGA Cyclone IV za necelé 3000 Kč v obchodě HWKitchen.
Na stránkách Intelu jsem si stáhl vývojové prostředí Quartus Prime ve verzi Lite pro Linux. Protože stále ještě mám monitor se vstupem VGA a našel jsem doma i VGA kabel, jediné další náklady na hardware bylo několik stokorun za PS/2 klávesnici a kabel s převodníkem mezi RS-232 a USB.
Když jsem začal vážně uvažovat o pořízení FPGA, zjišťoval jsem, který jazyk si zvolit pro jeho programování. Při tom jsem narazil na další knihu již zmíněného autora, Martina Malého: Data, čipy, procesory. Tuto knihu mohu doporučit jako velmi dobře zpracovaný a čtivý úvod pro záčátečníky v programování FPGA. Autor se zabývá především VHDL, o Verilogu se zmiňuje spíše okrajově. Proto jsem si i já vybral VHDL. Při programování se hodí i referenční příručka jazyka, mně se osvědčil VHDL Handbook.
Než se pustíme do návrhu CPU, asi bychom chtěli odhad, zda se výsledek vejde do PFGA, které máme k dispozici, což je Altera Cyclone IV EP4CE6 obsahující 6272 logických elementů. Jako měřítko velikosti můžeme použít počet tranzistorů. Přehledná tabulka s dlouhým seznamem procesorů je na Wikipedii. S naším designem budeme mířit někam mezi MOS Technology 6502, Intel 8080, Zilog Z80 a Intel 8086, obsahující řádově 4 až 30 tisíc tranzistorů.
Můžeme očekávat, že funkcionalita odpovídající jednomu logickému elementu FPGA odpovídá několika tranzistorům v klasickém procesoru. Pro svou konstrukci bychom tedy měli mít v obvodu dostatek místa a pravděpodobně zbude i prostor pro implementaci základních periferií. Uvnitř FPGA jsou i bloky statické paměti RAM o celkové velikosti 30 KiB, což stačí pro jednoduchý počítač.
Poslední otázkou na úvod je časová náročnost celého projektu. FPGA mi dorazilo domů v půlce ledna 2024 a po roce, v lednu 2025, jsem dokončil první verzi kompletního počítače včetně ukázkových programů v assembleru. Asi tři měsíce mi zabralo učení VHDL a první pokusy od nejjednodušších obvodů až po přípravu periferních rozhraní pro budoucí počítač.
Zbylých devět měsíců (z nichž jsem se asi čtyři projektu nevěnoval) trvala konstrukce CPU, následně celého počítače, programování vývojových nástrojů a psaní demonstračních programů. Na projektu jsem pracoval o večerech a víkendech, tedy celkový čas odhaduji přibližně 500 hodin, ekvivalent tří měsíců práce na plný úvazek.
Obsah následujícího dílu
Příště začneme s programováním FPGA. Než se pustíme do návrhu CPU, začneme jednoduchými obvody a připravíme si také řadiče periferních zařízení našeho budoucího počítače: VGA výstup, rozhraní klávesnice PS/2 a sériový port.