回路シミュレーターLogisimの回路自動生成機能

Logisimは、真理値表(Truth Table)と入力ピン、出力ピン、数式(Expresson)、カルノー図を入力することで、回路を自動生成したり、またはすでに作った回路を上記の情報でも見ることのできる「Combinational Analysis」という機能があります。

新規に真理値表から回路を作成

メニューから[Project]->[Analyze Circuit]

入力ピンと出力ピンの追加

Inputsタブで、下側の入力フィールドに入力ピンの名前を書いて、[Add]ボタンで追加です。追加されると中央の一覧表示に加わります。以下の例は、既にAピンを追加して、これからBピンを追加しようとしているところです。

同様に[Output]タブを選択して、出力ピンも設定します。以下画像では、とりあえずQ1ピン、Q2ピンを作成しました。

真理値表の修正

入力ピン、出力ピンが追加されたら、自動で真理値表が作成されています。この時点では、出力ピンが何を出力するかが未定のままなので修正します。真理値表の出力ピンの項目をクリックすると修正できます。入力ピンはできません。

ここまで行うと、自動で数式(Expresson)とカルノー図も作成してくれます。もちろん数式をA+Bなどのように修正することで、真理値表にも同期して反映してくれます。エンコーダーなどの場合は、真理値表を書くよりも数式を書いたほうが簡単だと思います。

数式
カルノー図

回路の生成

ダイアログ下の[BUild Circuit]ボタンを押すと、回路名を付けるダイアログが表示されるので回路名を入力して[OK]で回路が生成されます。

回路が作成されると、以下のようにHello回路のように回路が生成され一覧に追加されますがダイアログは終了しません。自分で×ボタンで閉じます。

 

既存の回路を解析する

Analysisなので、既に作ってある回路から真理値表、式、カルノー図の生成も可能です。適当な回路を作って[Project]->[Analysis Circuit]をクリック。

真理値表、式などを見れてここから修正も可能。

 

複雑な回路を自動生成するのは難しいと思いますが、ちょっとしたエンコーダーやデコーダーを作成する際は、同じ作業をひたすら繰り返すので、真理値表から作成したほうが良いかもしれません。

注意点

http://home.a00.itscom.net/hatada/dc2/chap15/decoder.html

実際に作ればすぐわかりますが、上記サイトにあるような、8入力3出力エンコーダーなど、入門レベルのエンコーダーなどを作る場合、Logisimは、ピンすべてを満たす真理値表を自動生成します。そんため上記サイトの真理値表とLogisimの真理値表にづれが出ている感じがしますが、Logisimは式に書かれている回路を生成します。デジタル回路の入門者だと同じ真理値表が作れなくて戸惑うかもしれませんが問題ありません。

まとめ

Logisimで、マウスでデジタル回路を作成する方法ではなく、入出力ピンと真理値表から回路を生成する方法を学びました。

 

 

LogisimでHex Digit Displayを使ってみます。

JKフリップフロップを学んだことで二進数のカウンターを作れるようになりました。またLogisimにはHex Digit Displayという出力装置があるのでそれを繋げて16進数表記ができるようになりました。

JKフリップフロップで作成したカウンター

2進数の4bitなので、0-15までのカウンターになります。今度はこれを7-Segment Displayで表示してみたいのですが、そのためにはエンコーダー、デコーダーを作ってみる必要があります。どうやって4桁の2進数を、2桁の10進数にして7セグメントに表示すればよいのでしょう。

論理回路シミュレータlogisimで順序回路、DFlipflopを作成

フリップフロップの仕組みを理解するためにDフリップフロップを作成しました。DはDelayの略で、クロック(CLK)の立ち上がりのタイミングでD入力の値をQ出力として保持します。NAND回路4つとNOT回路1つなので非常にシンプルです。

NAND回路4つで作成
D=0の時、Q=1。間違えている?

Logisimの制限

  • Logisim cannot simulate subcircuits whose pins sometimes behave as inputs and sometimes behave as outputs. Components built using Java can have such pins, though: Within the built-in libraries, the Memory library’s RAM circuit contains a D pin that can act both as an input and as an output.

Logisimでは、組み合わせ回路はサブサーキットとして保存して、それをメインの回路図で使うことができます。例えばALUのサブサーキットを作成して、メインの回路図で汎用ロジックICのように部品として使えます。

だだし、入力と出力の振る舞いを持つピンがあるサブサーキットはシミュレートできないようです。ただしbuilt-inライブラリーとMemory Library’sのRAMサーキットはDピンを持っていますが動作するようです。

まだ「ときどき入力と出力の振る舞いを持つ」という意味が分かっていませんが、少なくとも、私がはじめに作成したDフリップフロップをさらに同じ回路につなげるようなことは問題ありませんでした。

 

論理回路シミュレータlogisimで順序回路、JKFlipFlopを学ぶ

Logisimでは最初からFlipFlop回路が用意されているので、これを使って順序回路、フリップフロップの仕組みを学んでいきます。

まず、順序回路とは、出力をもう一度入力として使う回路のことです。これにより前の情報を保持することができます。レジスターやRAM、ROMはフリップフロップを大量に繋げることで実現しているようです。またカウンターは、1,2,3を前の数を踏まえて数え上げていくのでこれにもフリップフロップが必要になります。

Youtubeに、Logisimでカウンターを作る3分ぐらいの動画があったので、これからいろいろ調べていきます。

カウンター

Logisimにある部品を使えばよいだけなので、フリップフロップ仕組みが分かっていなくても、すぐにカウンターを作る事ができました。

Logisimにはあらかじめ回路が用意されている

やっぱり、小さな回路のシミュレーションでも自分で作って動作するとうれしいですね。

最初はなぜこれでカウンターになるのかが分かりませんでしたが、ポイントはクロックです。

一番左のSマークがクロックで、このクロックの立ち上がり(電気が通る=1=薄い緑)で、一番左側のJKフリップフロップが動作します。クロックが薄い緑になるたびに、JKフリップフロップの出力Qが、薄い緑(=ON)または濃い緑(=OFF)になります。

出力Qを次のJKフリップフロップのクロック入力に繋げているのがポイントです。出力Qと出力~Qが交互になるという事は、入力信号に対してQは1/2でしかONにならなくなります。よって右隣りのJKフリップフロップは1/2の速度の動作になっていきます。

またJKフリップフロップは前の情報を保持しているので、2進数の各桁となり、バイナリーカウンターとなります。あとは、2進数を10進数に変換できればよさそうです!

同じものを配線をまとめて縦にして作成

上記でも4桁のカウンターが、0000,0001,0011,0100とカウントアップされているのが確認できます。


SRラッチ

シミュレーションをリセットするとRED LINE!!

正論理のSRラッチを作成した際に、メニューの[Simulate]->[Reset Simulation]をすると、図の下のように、ワイヤーが赤になりおかしくなりましたが、とりあえず入力R押せば正常に動作できました。

Clocked SRラッチ

入力のSet,Resetを1にしてみるとエラーが発生しました。SRフリップフロップはS=1,R=1の時は不定なのでこれは正しい挙動なのだとおもいます。

参考資料

順序回路は、日本語のデジタル回路の入門サイトで学ぶことができるので問題ありませんが、Logisimで試してみたい場合は日本語のサンプルがないため、英語のサイトを調べるがあります。

Leanabout electronics には、順序回路(Sequential Logic)のSR Flip FlopsやJK Flip-flopsのLogisimのファイルがありダウンロードしてLogisimで試せます。

http://www.learnabout-electronics.org/Digital/dig54.php

自分のプロジェクトにロードする方法。

http://www.learnabout-electronics.org/Digital/dig510extra.php#simlist

上記から、該当する.cricファイルを右クリックで適当な場所に保存します。メニューの[Project]->[Load Library]->[Logisim Library…]を選択すると、ダイアログが表示されるので保存した.cricファイルを選択するとロードされます。

Logisim Library…を選択
.circファイルを2つロードした例

Logisimでのタイミングについて

フリップフロップを調べると、出力された信号を入力信号に使うため、クロックの立ち上がりやタイミングが重要になってくることが分かってきます。メニューの[Help]でLogisim Documentationウィンドウを表示して、Logisim References->Value propagation->ShortcomingにLogisimの仕様が詳しく書かれています。

Logisimは教育目的では問題ないですが、産業用回路のデザインには十分でないと書かれています。ある程度割り切って使う必要があります。

 

LogisimでJKフリップフロップ

Logisimではこれはエラーになるようです。

上記のように単純なJKフリップフロップはNAND回路から作る事ができないようです。ですが、いくつか条件がつきますが、JK Master Slave Flip-flopは作れるようです。

http://www.learnabout-electronics.org/Digital/dig510extra.php

Fig. 5.4.3 Level Triggered JK Master Slave Flip-flop

全てNANDで作られている

このサンプルのNOTEに書かれているように、SimulationをResetしたりすると、ワイヤーが赤くなって動かなくなります。その時は、一度NANDのG3につながっているXワイヤーを付け直せば動作します。ひとまずこれで、J=K=1の時に、Qと~Qで0,1を交互に繰り返す仕組みを再現できました。

よく見ると、NANDが8個で動作しているだけです。入力のクロックを入力JはKと同様に1bitの入力にして、自分で押しながら動作を追ってみればすぐに理解できそうです。

回路シミュレーターLogisimでCPUを作成する教材

回路シミュレーターLogisimは、物理的なハードウェアではないので、トライアンドエラーがすぐにできて大変便利です。私でも、ここ数日でAND回路などからはじめてALUなども作れるようになりました。

せっかくなので、簡単なCPUの作り方を調べてみて、50ページぐらいの良い資料を見つけたので紹介です。

Implementing a One Address CPU in Logisim

Gettysburg CollegeのCharles W.Kannさんがhttp://cupola.gettysburg.edu/oer/ でLogisimでのCPUの作り方「Implementing a One Address CPU in Logisim」を公開しています。

他にもIntroduction to MIPS Assembly Language ProgrammingやDigital Circuit Projectsなどの教材もあるようです。

この教材で実際に動作するLogisimのプロジェクトファイルの場所

本人のサイトhttp://chuckkann.com/ から、Logisimで完成したCPUのプロジェクトファイルをダウンロードすることが可能です。

http://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu の下のほうに、Resources部分に、”OneAddressCPU.zip”リンクがあるのでここからダウンロードできます。

この教材の良いところは、実際に動作するプロジェクトファイルがある事です。Youtube動画などの場合は、真似すればLogisimの使い方が分かりますが、プロジェクトファイルが配布されていない場合も多く、何かトラブルが発生した場合に、先に進めなくなる場合は多々あります。

プロジェクトファイルがあると、自分で実装したものとの違いを比較してデバッグできるのでありがたいです。

 

 

論理回路シミュレータlogisimでは順序回路flipflopは難しい

昨日は、論理回路シミュレーターLogisimで、加減算器を作ったりALUを調べたりしていました。このような組み合わせ回路は、以前の動作に依存しないので問題ありませんが、フリップフロップのような順序回路の場合は、Logisimではうまくシミュレートしないようです。

ANDゲートを使って、JK Flip-Flopを作るなどではなく、用意されているJK FlipFlopを使って何かを作るという事は問題ないようです。

 

 

ちょうど、YoutubeにJK Flip Flopを作っている動画があったので試してみましたが、メニューからシミュレーションをリセットしたりすると以下のようになってしまいました。

回路が繋がっていない状態になる

 

http://www.cburch.com/logisim/docs/2.3.0/guide/opts/simulate.html

プロジェクトの設定で、Iterations Until OscillationやAdd Noise To Component Delaysなどがあるので、このようなパラメータで解決できるのかもしれませんが、まだわかりません。

その後調べていたら、以下を見つけました。ちょっと読んで試してみるとよさそうです。

http://electronics.stackexchange.com/questions/43168/what-is-wrong-with-my-d-flip-flop-toggle-switch

論理回路シミュレータlogisimで補数

logisimで減算をやってみます。まずは補数からおさらい。

補数


1の補数

補う(おぎなう)数で、1 + x = 1となる数。2進数だとビットを反転するだけです。つまりNOT回路で”1の補数”をつくれます。

NOT回路で反転するだけで1の補数となる

ビット数が増えても全く同じで、0111の1の補数は、すべてのビットを反転させた1000になります。これもビットの数だけNOT回路を並べればよいだけです。

4bitでも同じで、NOT回路で反転させるだけ

0111 + 1000 = 1111

1の補数の性質

2進数の1の補数は、すべてのビットが1になる数のことです。単純に反転すれば求められます。

0111(元の数) + 1000(1の補数=反転した数) = 1111(すべてが1ビット)

2の補数

2の補数は、「1の補数+1」と覚えてしまえばよいです。性質としては

2進数の2の補数は、足すと桁が上がる数です。

先ほどの2進数4bitの0111で考えると、

0111(元の数) + 1001(2の補数=1の補数に+1) = 10000(桁が上がった)

元の数に2の補数を足すと桁上がりが発生します。これが2の補数です。私たちの使っているコンピューターは、この2の補数でマイナスの値を表現します。

符号付数値表現 4ビットの2の補数

以下は、4bitの符号付き、符号なし数値表現の一覧です。

例えば、1から2の補数による-1を求めるには、

  • 1は2進数で0001。
  • まずは0001を反転して1の補数である1110求めます。
  • 次に、1110に1を加えて2の補数である1111を求めます。
  • これが-1になります。

2から2の補数による-2を求めるには、

  • 2は2進数で0010。
  • まずは0010を反転して1の補数である1101求めます。
  • 次に、1101に1を加えて2の補数である1110を求めます。
  • これが-2になります。

加算

2進数の足し算は私たちが普段やっている足し算と一緒です。まずは単純な3 + 4 = 7をやってみます。

2bit 加算器

4bit 加算器

前回の記事「論理回路シミュレータlogisimで加算回路」で加算器(Full Adder)の中身を詳しく説明しています。

減算

減算(引き算)は、そのまま行わず、マイナスの値を足すという方法でやります。例えば、3 – 4 = -1 なら、3 + (-4) = -1に置き換えます。

4から2の補数による-4を求めるには、

  • 4は2進数で0100。
  • まずは0100を反転して1の補数である1011求めます。
  • 次に、1011に1を加えて2の補数である1100を求めます。
  • -4は2進数で1100になります。

3 + (-4) をやってみましょう。

符号付数値一覧で確認してもわかるように、2の補数表現を使いマイナスの値を足すことで、-1(2進数で1111)が求められました。

2ビット加減算器(あっているはず)

加減算器のポイント

加減算器は、XOR回路で、1の補数を作っているところです。

加算のときは、0と比較するので、入力した値がそのまま出力されます。

減算のときは、1と比較するので、入力が0の場合、出力が1になります。つまり1の補数になります。

減算は、2の補数(=1の補数+1)で計算したいので、上記で作った値に、+1が必要になります。これには、Full Adder のCinから1を入力します。

減算加算の切り替え(減算フラグ)と、Cinからの+1入力を別々に書くと上記のような回路になります。こちらのほうが分かりやすいです。ただし、加算の時は、フラグとCinを0にして、減算の時は、フラグとCinを1にするので、繋いでしまったほう場部品が少なくなります。よって、以下のような回路になります。

補数の仕組みが分からないと難しい

最後に加算器と加減算器を見比べてみる

加算器と加減算器を比較すると、XOR回路の有無だけの違いです。2の補数を使いXOR回路を追加するだけで加算、減算が可能になります。

2bit 加算器
2bit 加減算器

ダウンロード


この記事を書くために書いた回路なので、ファイルが整ってませんが、Logisimのプロジェクトファイルです。参考にしてください。

http://hajimete-program.com/logisim/adder.circ

論理回路シミュレータlogisimで加算回路

論理回路シミュレータlogisimでデジタル回路の勉強」で、Logisimの使い方が分かってきたので、加算器を作ってみました。3枚目のgif画像では、入力を変更して回路の動きを確認しています。プログラミングと同様にすぐにテストできるのは大変便利です。

半加算器は、ANDゲートとXORゲートで作成できます。

半加算器 Half adder

Logisimは、作った回路を部品として使えるので、上記半加算器にHAというラベルを付けて、それを元に1bitの全加算器を作りました。

全加算器 Full adder

最後に、1bitの全加算器を4つ繋げて4bitの加算器を作りました。最下位ビットはは半加算器を使う方法と全加算器を使う方法があるようです。

4bit 加算器 4bit adder

 まとめ

Logisimで4bit加算器を作ってみました。次は加減算器に挑戦してみます。

 

論理回路シミュレータlogisimでデジタル回路の勉強

 

回路シミュレーターは手軽に試せる!

コンピューターについていろいろ調べていたら、logisimというオープンソースの回路シミュレーターを見つけました。AND回路やOR回路などから回路を作成したり、用意されている回路からもいろいろ実験ができます。

回路シミュレーターは、プログラミングと同様にすぐに試せるので入門によさそうです。

使い方の資料

使い方は、以下の日本語資料「論理回路シミュレータLogisimの使い方」を見た後に、Youtubeの動画をいくつか見てみるとよいです。

サブサーキットの作り方

Logisimは、サブサーキットという仕組みがあります。例えばALUのような回路を作って、それを他の図から使えるようにできます。やり方は特になくて、ファイルを分けて回路を作れば良いだけです。以下は英語の動画ですが、6分の動画なので、同じことを試してみるとすぐ理解できるはずです。

 

 

PythonのMatplotlibで指数関数expを表示してみる

Pythonはnumpyとmatplotlibを使うと数学のグラフなどを簡単に表示できるので指数関数を表示してみました。

matplotlibで手軽にグラフを表示!