概要
「CPUの創りかた」のTD4で使用されているロジックICとは一部異なるものを使用して互換CPUを製作してみました。この記事では便宜的に「TD4alt」と呼ぶことにします。
主な相違点
TD4 | TD4alt | |
---|---|---|
レジスタ | 74HC161(4bitカウンタ) * 4個 | 74HC174(Dフリップフロップ) * 3個 |
プログラムカウンタ | 74HC161の機能を利用 | 74HC283を使用 |
レジスタの出力選択 | 74HC153(4チャネル2回路) * 2個 SELECT AとSELECT B |
74HC157(2チャネル4回路) * 3個 S0とS1 |
レジスタの入力選択 | 74HC161の/LOADピン /LOAD0~/LOAD3(負論理) |
74HC157のSELECTピン T0~T3(正論理) |
ROM | 8回路DIPスイッチ * 16個 | SRAM SRM2B256LMX55 * 1個など |
命令デコーダ | 一部で3入力NANDを使用 | 2入力のAND/ORとNOTを使用 プログラム入力モードに対応 |
ブザー | あり | なし |
レジスタと入出力選択
TD4altで使用する74HC174にはDフリップフロップが6回路入っているので、これを3つ用いてレジスタA・B・OUT・PC・CFを構成しました(1回路余ります)。また、74HC157を用いて入出力制御を行いました。どの様な配線になっているかを模式的に表した図を以下に載せます。
ROM(というかプログラムメモリ)
TD4altではSRM2B256LMX55という32キロバイトのSRAMをROMとして16バイトだけ使用します。まずは配線の模式図をご覧ください。
このSRAMは以下の様に動作します。
- A3:0でアドレスを指定する
- D7:4とD3:0でデータの入出力を行う
- /OEがLowの間、指定アドレスのデータが出力される
- /WEがLowになった時に指定アドレスにデータが入力される
各スイッチの役割は以下の様になります。プログラムを入力する時以外は全てOFFにする必要があります。
- SW2をONにするとプログラム入力モードになる
- DIPSW-8で入力データを指定する
- SW1で指定アドレスに指定データが入力される
プログラム実行時のROM周辺の流れ
- CLKがHighになる
- /OEがHighになりSRAMからのデータの出力が無効になる
- 同時にPCレジスタから次のアドレス信号が入力される
- CLKがLowになる
- /OEがLowになりSRAMから次のデータ(命令)が出力される
(下位4bitはIm3:0からALUへ、上位4bitはOp3:0から命令デコーダへ伝わる)
プログラム入力時のROM周辺の流れ
- DIPSW-8で命令コードをD7:4とD3:0に指定する
- SW1を押して/WEをLowにして指定したデータをSRAMに書き込む
- 手動でCLK信号を送り、PCを次に進める
入力時は、SW2によってWRITE信号がHighのため、74HC125(3ステートバッファ)がD7:4の命令コードを遮断し(High-Z)、Op3:0は代わりにGNDに繋がって信号は全てLowになります。WRITE信号のNOTとのAND回路でも十分かと思いますが、便利そうで買ってしまった74HC125にしました。
命令デコーダ
TD4altでは2入力のAND/ORとNOTで代用しました。また、負論理の/LOAD0~3ではなく、正論理のT0~3で出力レジスタを指定するのと、プログラム入力モード(WRITE信号)があるため、TD4とはちょっとだけ違う回路になっています。模式図を以下に示します。
プログラム入力モードにおいては、入力した命令(特にジャンプ命令)が即座に実行されては困りますので、Op3:0を強制的にLowにしています。Op3:0が全てLowの時、もしWRITE信号がLowであればT0がHighになり「A ← A + Im」が実行されますが、WRITE信号がHighであればT0~T3が全てLowになり「A + Im」が実行されるだけでどのレジスタにも代入されません。唯一CF(キャリーフラグ)を保持するレジスタが影響を受けますが入力時の動作に問題はありません。
また、結果論ですが、ANDが4回路、ORが4回路、NOTが5回路となり、各ロジックIC1個ずつに収められました。
さいごに
これまで電子工作はブレッドボード上でマイコン使ってセンサーを読んで7SEGで表示くらいのことしかやったことがなく、未だにろくに回路図も書けないなかで、いきなりアレンジしたものに挑戦しましたが、なんとか無事ゴールできました。実は当初8bitCPUにいきなり挑戦するつもりでしたが、TD4altでもブレッドボードもワイヤーもジャンパーピンも色々な部品を買い足す必要があって、念のため4bitCPUにしておいて良かったです。
CPUの仕組み自体は「CPUの創りかた」だけでなく「コンピュータの構成と設計」などでつまみ食いして分かった気になってましたが、実際に作って動かしてみると感動もさることながら、夢と配線の広がりが尋常ではないですね。
また、勢いでDE10-Liteも買ってしまったりしましたが、今はとりあえずTD4altをユニバーサル基板で実装しようと作業を進めています。何か特筆すべき点があったら記事にしたいと思います。