今回は、「Implementing a One Address CPU in Logisim」CPU-MainというCPU全体が書かれている回路図の制御装置(Control Unit)の作りを見ていきます。
各ソフトウェア
このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。
制御装置(CU=ControlUnit)とは
CPUの制御装置は、マシン語の命令に従って、回路のワイヤーのON/OFFをします。このCPUの命令フォーマットは以下の16bitフォーマットになっています。
1 |
|4bit オペコード | 4bit ALUOpt | 8bit 即値またはアドレス| |
下位8bitはデータメモリーまたはALUに送られて、即値なら加算減算に使い、アドレスならそのメモリーのデータを参照します。
8-11bitのALUOptは、ALUの入力になります。ALUはこの値から加算か減算のどちらかの演算処理を選択します。
最後12-15bitは、OpCode(オペコード)で制御装置に渡され、この値により各ワイヤーのON/OFFを行います。以下がマシン語の命令に対する各ワイヤーのON/OFFの一覧表です。
Operation | OpCode | WriteAc | ALUSrc | ClrAc | MemWr | Beqz |
---|---|---|---|---|---|---|
即値命令 | 0x1 | 1 | 1 | 0 | 0 | 0 |
メモリー命令 | 0x2 | 1 | 1 | 0 | 0 | 0 |
クリアレジスター(clac) | 0x3 | 1 | x | 1 | 0 | 0 |
ストア(stor) | 0x4 | 0 | x | x | 1 | 0 |
ゼロジャンプ(beqz) | 0x5 | 0 | x | x | 0 | 1 |

例えば、数字の5を足し算をする場合、表の一番上の行の「即値命令」になります。この時は、以下のように複数の回路を有効化、無効化します。
- 制御装置にOpCode(オペコード)0x1を渡す。
- WriteAC=1にしてAC(Accumulator)を有効化
- ALUSrc=1にして、[Select ALU Input]マルチプレクサーをデータメモリーではなく、数字5を使うように切り替え
- ClrAC=0にして、AC(Accumulator)の入力を、ALUからの出力に切り替え
- MemWr(Memory Write)=0にして、データメモリーを書き込めないように無効化
- Beqz(Branch if equal zero)=0で、分岐処理の回路を無効化
制御装置の実装
制御装置は、先ほどの一覧表示に従ってOpCodeが入力されたら、それに対して各回路を有効または無効にしているだけです。以下は即値命令(0x01)時の制御装置の状態です。デコーダー(Decd)にInstructionの上位ビット0001=0x1が入力として渡ってきます。OpCode=0x01の場合は、WriteAC=1、ALUSrc=1なので、ワイヤーをうまくつないで、表と同じようにしています。

デコーダーが回路が分かりづらければ一度、以下のような簡単な回路を作ってみて動かしながらやってみると、理解できると思います。

まとめ
今回は、制御装置を調べてみました。制御装置は各ワイヤーまたは回路をON/OFFする機能でした。OpCodeからデコーダーでON/OFFを切り替えるだけなので回路は単純ですが、どのようにOpCodeを設計して、どの回路があるかを把握していなければなりません。このCPUのドキュメントのように必ず表を作っていくとよさそうです。
- Implementing a One Address CPU in LogisimのCPU実装を調べる5 複製してみる
- Implementing a One Address CPU in LogisimのCPU実装を調べる4 ControlUnit
- Implementing a One Address CPU in LogisimのCPU実装を調べる3 Execution Path Subsection
- LogisimのPlexersの使い方とInclude Enables?属性
- Implementing a One Address CPU in LogisimのCPU実装を調べる2 Arithmetic Subsection
- Implementing a One Address CPU in LogisimのCPU実装を調べる1ALU
- Implementing a One Address CPU in LogisimのCPU実装を調べる1符号拡張
- Implementing a One Address CPU in Logisimのアセンブリ言語仕様
- コンピューター・アーキテクチャを調べる
- Implementing a One Address CPU in Logisimを斜め読み