LogisimのPlexersの使い方とInclude Enables?属性

Logisimではあらかじめ用意されている回路の属性に[Include Enables?]という項目があり、これをYesにすると、その回路を有効または無効化できる1bitの入力ピンが用意されます。デフォルトでは[Include Enables?]はYesになっているのでこの入力ピンが表示されています。Plexersの中では、Multiplexer、Demultiplexer、Decoderが[Include Enables?]を持ちます。

設定方法

設定方法は、Logisimで回路を選択すると属性情報で表示できます。[Include Enable?]が見えるので、この値をNoにすると、ピンがなくなり、回路は常に有効になります。

何故このような仕組みがあるのか?

デジタル回路の勉強をはじめたときは、AND回路やOR回路を繋げてLEDを光らせたりするだけなので、1bitを流して有効化無効化する意味があまり分かりませんでした。ですが、CPUなどのように回路が大きくなってくると、加算処理の時はこの回路は動作させなくない、またはRAMからデータを取得するときはこの回路は動作させたいなど、操作によって使う回路が異なってくるのが分かりました。この時切り替えるスイッチが欲しいのですが、それを行うのがこの[Include Enables?]の入力ピンでした。

Plexers回路のおさらい

Logisimに標準であるPlexers回路を使って簡単な回路図を作成しておさらいします。

Bit Selector

その名の通り、複数ビットから1bit選択するときに使います。属性を変更すれば、n-bitの選択も可能です。

4bitの入力信号から、選択して1bit出力

Multiplexer

2つの入力ピンから選択信号で、どちらかを選んで出力します。また[Include Enables]属性がYesの場合は、この回路の有効無効を切り替えられます。以下の画像では、右下の「0で回路停止」の入力ピンを1にしているので、この回路が有効化され動作しています。

マルチプレクサーは、2つの入力のいずれかを選択

Demultiplexer

デマルチプレクサーは、マルチプレクサーの反対で、選択信号で、2つの出力ピンのどちらかを選んで出力します。

デマルチプレクサーは、2つの出力のいずれかを選択

Decoder

デコーダーは、n-bitの入力をそれぞれ異なる出力に流すことができます。

まとめ

回路の[Include Enables]属性の使い方とLogisimのPlexers回路をおさらいしました。マルチプレクサーやデコーダーなどで入力と出力をまとめたり分けたりできます。

これの応用としては、以下のように、1つの信号で、様々な回路を有効化無効化する制御装置(Control Unit)があります。

  • 0001信号の場合は、加算処理時の複数回路を有効にして、他の回路をすべて無効。
  • 0002信号の場合は、レジスターの値を確認して、0なら、プログラムカウンターを動かす。そのための回路のみを有効化し、他の回路は無効化。

Implementing a One Address CPU in LogisimのCPU実装を調べる2 Arithmetic 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 からダウンロードできます。

CPU全体の回路図は、区切りなどがありませんが、大きく2つに分けることができます。1つは算術とデータメモリーの入出力管理をするサブセクションです。もう一つは、プログラムの実行パスを制御するサブセクションです。

まずは、全体を把握するのではなく、Arithmetic Subsectionを見ていきます。

Arithmetic – 算術部分

上記の画像を見ると、レジスターやROMやALU、SignExtend、マルチプレクサーなどがあり複雑に見えますが、やっていることは凄く簡単で、Arithmetic算術は、ALU(Arithmetic Logic Unit)がポイントになります。

シンプルにすると以下のような感じです。

 

上記の回路では、RAMもレジスターも結局はデータを保持するもので大きいか小さいかの違いなので、シンプルにレジスターを2つにしました。これが加算器につながっています。今回のCPUでは、演算の入力を2つとり、結果を1つ返します。よって加算は以下のようになります。

入力A + 入力B→出力D

また、出力Dは、その後レジスターの入力となるので、以下の形になります。

入力A + 入力B→入力A

つまり加算結果はレジスターに保持されます。クロックが動作している間、この回路は動き続けるので、入力Bの値である1がどんどん足されていき、レジスターにその結果が表示されます。

数値0でリセットしたい場合や、メモリーの情報ではなく即値を使いたい場合は、マルチプレクサーを使って切り替えます。次は、マルチプレクサーも小さな回路で見てみましょう。

小さなマルチプレクサーとレジスターの回路を切り出す。

CPU回路を理解するために、以下の簡単な回路を作成しました。

入力を切り替えると、レジスターと出力ピンの値が1111また0000になる

4bitの入力データ(1111または0000)をマルチプレクサーで切り替えて、入力された4bitデータはクロックが立ち上がる(=線が明るくなった)タイミングでレジスターへ格納されます。またそのデータは、レジスターの出力ピンQから、出力ピン(一番右の4bit)に渡されます。

MUXと書かれている台形記号が、マルチプレクサーで、下についている切り替え信号で、入力されたものを切り替えられます。0で、入力ピンの1111、1で入力ピンの0になります。

またレジスターは、レジスターの左下のピンに0または1を入れると、無効または有効に切り替えることができます。これによりレジスターが動いていない状態できます。

レジスターを0で無効にしているので、入力を切り替えてもレジスターは動作しない。

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実装を調べる1ALU

Implementing a One Address CPU in Logisim」は最後の5ページで、Logisimで作成したCPU実装の解説をしているので実際にこのCPUを動かしてみながら、回路図を調べていきます。

各ソフトウェア

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

5.2 The ALU

ALU(Arithmetic Logic Unit)は、加算減算をサポートします。またOverflowフラグも持っています。16bitのIntegersのサイズは、-32768から32767なので、27000+25000=52000や、-27000+-25000=-52000の場合、桁あふれが発生します。

このCPU作成とは別に、「論理回路シミュレータlogisimで加算回路」で詳しく加減算回路を書きました。これで加算回路に減算を追加する方法が分かります。

オーバーフローフラグの注意点

http://www.c-jump.com/CIS77/CPU/Overflow/lecture.html

桁あふれの場合に何故、15bit目のCarryOutと16bit目のCarryOutをとってXORで桁あふれフラグを用意するかですが、最上位ビットは正負のフラグなので、正数の場合、16bitは0で、15bitどおしの計算になります。この時、桁あふれを起こしたら15bitの演算結果でCarrayOutが出力されます。一方負の数の場合は、16bitを使って表現するので、16bit目のCarryOutが出力されます。

符号付き計算の場合は、16bitのCarryOutだけではなく、15bit目も見る必要があります。

4bit加算器

いかに4bitの加減算回路を作成し、計算結果の3bit目と4bit目のXORを取得しオーバーフローフラグを確認してみました。

+7(0111) + +1(0001) = +8(1000) 桁あふれ

 

-8(1000) – +1(0001) = -9(0111) 桁あふれ
-8(1000) + +7(0111) = -1(1111) 桁あふれ無し

ALUは16bit幅なので、ワイヤーが多く戸惑いますが、実際には上記のような4bit幅で作れる回路を16bit幅にしただけです。