今更ながら、名著「CPUの創りかた」を読み、私もロジックICによるCPU自作に挑戦しました。
基本設計
本では4bit CPU「TD4」が紹介されていますが、同じものを作るのではなく、オリジナリティを出したくなるのが自作家というもの。TD4を参考にしつついろいろ考えた結果、最終的には私が普段使っているPICシリーズの影響を多分に受けたアーキテクチャとなりました。
なお作成するCPUの名前ですが、TD4にならい、私のハンドルネームをとってDEN4と呼ぶことにします。
まず、ROM容量。本でも述べられている通りTD4は本当に最小限の機能しか持っていませんが、中でも一番貧弱なのがROM容量だと思います。プログラムカウンタを4bitとしているので、16命令しかプログラミングできません。DEN4では、これを128命令とします。128ステップあれば、そこそこのプログラムが作れます。
次にRAMですが、オリジナルのTD4はRAMを持たず、AレジスタとBレジスタで4bit × 2本のCPUレジスタを持ち、CPUレジスタがRAMを兼ねるという構成でした。これをDEN4では、4bit × 16個のRAMを持ち、CPUレジスタは1本のみという構成にします。いわゆるアキュムレータマシンと呼ばれる構成であり、私が愛用するPICマイコンに近い構成です。CPUレジスタはACC(アキュムレータ)、RAMはPICに倣いレジスタファイルと呼ぶことにします。
そして、ALU。TD4は加算のみでしたが、加算に加えANDとORはできるようにします。ただし、ANDとORはオペランドは即値のみとします。これは、主に想定しているのがビット操作の実現のためであり、レジスタ同士での論理演算はできなくても良いだろうと判断したためです。
I/Oについては、入力と出力をそれぞれレジスタファイルの14番目、15番目に割り当て、レジスタファイルへのアクセスでI/Oへのアクセスができるようにします。この辺も、PICのようなワンチップマイコンと似ています。
最後に命令セット。これは回路の複雑さに直結しますので、極限まで減らし7種類としました。
以下が、TD4とDEN4の比較です。
TD4 | DEN4 | |
ROM | 16B | 128B |
RAM | 無し | 4bit x16本 |
CPUレジスタ | 4bit x2本 | 4bit x1本 |
I/O | 入力4, 出力4 | 入力4, 出力4 |
ALU | ADD | ADD, AND, OR |
フラグレジスタ | キャリー(C) | キャリー(C) |
命令 | 12種 | 7種 |
命令セット
命令は、以下の7種類とします。
なお、1つだけ持つCPUレジスタはACC、レジスタファイルはR0〜R15と書くこととします。
ROMは128命令にしましたが命令長は8bitのままとなるよう、ジャンプ命令は1種類としました。
ニモニック | オペランド | 操作 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
ADDI | Imm | ACC ← ACC + Imm | 0 | 0 | 0 | 0 | i3 | i2 | i1 | i0 |
ANDI | Imm | ACC ← ACC & Imm | 0 | 0 | 0 | 1 | i3 | i2 | i1 | i0 |
ORI | Imm | ACC ← ACC | Imm | 0 | 0 | 1 | 0 | i3 | i2 | i1 | i0 |
ADDR | Rn | ACC ← ACC + Rn | 0 | 1 | 0 | 0 | r3 | r2 | r1 | r0 |
ST | Rn | Rn ← ACC | 0 | 1 | 1 | 0 | r3 | r2 | r1 | r0 |
CLR | なし | ACC ← 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
JNC | addr | PC ← addr if C=0 | 1 | a6 | a5 | a4 | a3 | a2 | a1 | a0 |
ACC … CPUレジスタ(アキュムレータ)
Imm … 即値
Rn … n番地レジスタファイル
addr … ジャンプアドレス(7bit)
先にも書きましたが、回路をなるべく小さくするために、極限まで減らした命令セットとしました。ALU演算の格納先はACCのみ。レジスタファイルへの書き込みはストア命令(ST)のみです。
よくあるmove(転送)命令は無く、即値代入はCLR命令→ADDI命令、レジスタファイルからの転送はCLR命令→ADDR命令と実行することで実現します。
また、フラグはキャリーフラグのみで、無条件ジャンプはありません。無条件ジャンプしたいときはADDI 0x00→JNCと実行することで実現します。