DENKIグループ★電子工作ブログ★

趣味でガラクタ工作をやっています。作ったものについてまとめていきます。

4bit CPUの自作に挑戦!

今更ながら、名著「CPUの創りかた」を読み、私もロジックICによるCPU自作に挑戦しました。

CPUの創りかた渡波郁、マイナビ出版(2003)

基本設計

本では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と実行することで実現します。

アーキテクチャ

f:id:DENkiGroup:20220127200020j:plain
DEN4のブロック図

実装

基本的にTD4に倣い、74HCシリーズで各ブロックを構成しました。レジスタファイルとROMだけは汎用ICのみで組むまでの気力がなかったため、PICマイコンでエミュレートしています。
リセット回路はTD4とほぼ同じです。クロック回路もTD4と同じようにRC回路とシュミットトリガインバータを使ったもので、1kHzに調整しています。

f:id:DENkiGroup:20220125211928p:plain
完成写真

さいごに

これだけ単純化した設計でも、今までの作品より遥かに配線量が多く、はんだ付けとデバッグに多くの時間を費やしました。学生時代にFPGAで16bit CPUを設計したことを思い出し、FPGAの偉大さが身に染みてわかりました。笑 そのときに設計した16bit CPUとは比べ物にならないほど単純なのに、実際にはんだ付けして作るとこれほど大変とは...
しかし、実際に自分で設計し、モノとして作ると愛情もひとしおです。皆さんも、ともに自作CPUの沼にハマりませんか。