Implementing a One Address CPU in LogisimのCPU実装を調べる3 Execution Path Subsection

今回は、「Implementing a One Address CPU in Logisim」CPU-MainというCPU全体が書かれている回路図の作りを見ていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

今回は、Execution Path Subsectionを見ていきます。

複雑そうだが…

はじめてこの回路図を見たときは、こんなの分からないと思ったものですが、毎回小さな回路を自分で作り直しているうちに、単純な回路だとわかりました。ポイントは、画像中央のPCが何をしているかです。

PC=Program Counter(プログラムカウンター)とは、現在プログラムの実行している場所を示しています。言い換えると、現在実行しているプログラムメモリーのアドレスを指しています。

回路が起動したときは、PC=0000 0000 にして、クロックが動き続ける間、1を足していきます。つまりプログラムメモリーのアドレスを0001、0002と増やしていくだけです。

加算回路とレジスター

カウンター回路

まずは、1を加算するカウンター回路です。加算器(Adder)とレジスターのみです。加算器は、レジスターから受け取った値0と1を足して、結果1を出力します。その出力1は、レジスターの入力なので、レジスターに保持され、さらにレジスターから1が出力されます。

次は、

加算器は、レジスターから受け取った値1と1を足して、結果2を出力します。その出力2は、レジスターの入力なので、レジスターに保持され、さらにレジスターから2が出力されます。

というように加算が続きます。

このカウンターにRAMを付けると?

先ほどの加算器とレジスターを使った、1を足しているカウンター回路の出力先に、RAM回路の入力A(Address)を付けると、メモリーの位置を移動している事になります。下記のがどうだと、Clearボタンを押したときに、レジスターが0にリセットされて、それが出力されるので、RAMのアドレス0番地を指すようになります。

現在、RAMに00だけしか書かれていませんが、ここにマシン語を入れておけば、その指示したアドレスの値をRAMは出力ピンDから出力します。

また、アドレスを0,1,2,3,4と動かすほかに、任意のアドレスに移動したい場合は、上記のようにマルチプレクサーと、切り替え信号を用意して、レジスターの入力を切り替えればよいです。

任意のアドレスの移動

beqz(Branch-if-equal-zero)回路

RAMはカウンター回路が動いている間、1,2,3…と移動アドレスを指示していきます。このCPUで任意のアドレスに移動する場合は、ALUの値と0を比較して同じで、かつ、マシン語でbeqz命令が送られてきた場合に、両方を満たしているので、AND回路から1が出力されます。マルチプレクサーは、これを分配の信号として使います。

RAMが出力したデータと分配

RAMから出力されたデータはマシン語で以下のフォーマットです。

16-bit machine instruction formatとなっています。

  • 4-bit Op Code
  • 4-bit ALU Opt
  • 8-bit Immediate or Address

よって、上位8bitのOpCodeとALUOptは、制御回路(Control Unit)の入力になり、下位8bitの即値またはアドレスは、データメモリーとALUに渡されます。

まとめ

このCPUのほとんどの回路図を見てきただけでなく理解できました。あとは制御装置(Control Unit)だけです。制御回路も簡単な回路で、この回路がどのような命令があって何をしたいのかを理解すれば、問題ありません。

次回は、制御装置の回路図を見ていきます。


コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA