今回は、「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 からダウンロードできます。
CPU全体の回路図は、区切りなどがありませんが、大きく2つに分けることができます。1つは算術とデータメモリーの入出力管理をするサブセクションです。もう一つは、プログラムの実行パスを制御するサブセクションです。
まずは、全体を把握するのではなく、Arithmetic Subsectionを見ていきます。

上記の画像を見ると、レジスターやROMやALU、SignExtend、マルチプレクサーなどがあり複雑に見えますが、やっていることは凄く簡単で、Arithmetic算術は、ALU(Arithmetic Logic Unit)がポイントになります。
シンプルにすると以下のような感じです。
上記の回路では、RAMもレジスターも結局はデータを保持するもので大きいか小さいかの違いなので、シンプルにレジスターを2つにしました。これが加算器につながっています。今回のCPUでは、演算の入力を2つとり、結果を1つ返します。よって加算は以下のようになります。
入力A + 入力B→出力D
また、出力Dは、その後レジスターの入力となるので、以下の形になります。
入力A + 入力B→入力A
つまり加算結果はレジスターに保持されます。クロックが動作している間、この回路は動き続けるので、入力Bの値である1がどんどん足されていき、レジスターにその結果が表示されます。
数値0でリセットしたい場合や、メモリーの情報ではなく即値を使いたい場合は、マルチプレクサーを使って切り替えます。次は、マルチプレクサーも小さな回路で見てみましょう。
小さなマルチプレクサーとレジスターの回路を切り出す。
CPU回路を理解するために、以下の簡単な回路を作成しました。

4bitの入力データ(1111または0000)をマルチプレクサーで切り替えて、入力された4bitデータはクロックが立ち上がる(=線が明るくなった)タイミングでレジスターへ格納されます。またそのデータは、レジスターの出力ピンQから、出力ピン(一番右の4bit)に渡されます。
MUXと書かれている台形記号が、マルチプレクサーで、下についている切り替え信号で、入力されたものを切り替えられます。0で、入力ピンの1111、1で入力ピンの0になります。
またレジスターは、レジスターの左下のピンに0または1を入れると、無効または有効に切り替えることができます。これによりレジスターが動いていない状態できます。

LogisimのRAM回路を使う
RAMも小さな回路を作ってみると、単純なメモリーなのでアドレスを指定して書き込むか読み込むかのどちらかだけなので簡単です。レジスターと同様にクロックの立ち上がりで動作するので、クロックを用意します。またいくつかRAM用のピンがあります。
str: (store)0で入力データが書き込めなくなります。
sel:0でRAM自体が無効になります。
ld: (load)0で、出力ができなくなります。
RAMの入力用(STORE)Dピンと出力用(LOAD)Dピンの表示方法
logisimに用意されているRAMコンポーネントを選択して属性の[Data Interface]を[Separate load and store ports]にすると、上記画像のように、データ保存用のDピンと、データロード用のDピンが用意されます。初期設定では1つなので、初心者のうちは2つのDピンを使ったほうがやりやすいと思います。
まとめ
一見複雑そうな回路も、似たような小さな回路を作ってみると、それが組み合わさったものというのが分かります。プログラミング言語の場合は、関数やクラスなどで明確に分かれますが、回路図の場合は、うまくサブサーキットを作るようにしたりするとよいのかもしれません。
次回は、Execution Path Subsectionをみていきます。
- 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を斜め読み