Implementing a One Address CPU in LogisimのCPU実装を調べる4 ControlUnit

今回は、「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フォーマットになっています。

下位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
CPU Arithmetic Subsection

例えば、数字の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なので、ワイヤーをうまくつないで、表と同じようにしています。

OpCodeをデコーダーで判別

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

小さなデコーダー回路を作ってみる

 

まとめ

今回は、制御装置を調べてみました。制御装置は各ワイヤーまたは回路をON/OFFする機能でした。OpCodeからデコーダーでON/OFFを切り替えるだけなので回路は単純ですが、どのようにOpCodeを設計して、どの回路があるかを把握していなければなりません。このCPUのドキュメントのように必ず表を作っていくとよさそうです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA