マインクラフトでDラッチ

Dフリップフロップ回路はデータを保存できるので、複数並べるとレジスターになります。最新のマインクラフトではレッドストーン回路のリピーターで信号を止めることができるため、これで先ずはDラッチ回路を作ってみます。

 

2bitのレジスター

参考資料

https://www26.atwiki.jp/minecraft/pages/26.html#id_c8183ecb

 

Dラッチ回路

画像のようにリピーターを交差するような感じで配置します。

リピーターをこのように並べると、以下Gif画像のように信号が伝わらないように遮断棒がでてきます。

右上のリピーターに、棒が表示される

左側のリピーターのように棒が横たわると、リピーター上を信号が伝わらなくなります。

遮断棒が下りているので、スイッチを押しても信号が伝わらない。

もう一度、リピーターを見てみましょう。リピーターは、レッドストーントーチで出来ています。遮断機が下りて、左のスイッチからの信号が伝わらなくなります。ですが、リピーターのレッドストーントーチは、以前の状態を保持しているので、出力も以前の状態になります。現在のスイッチの変更は関係なくなります。これは遮断機が下りた時の状態を保持している事になります。

つまり、これを並べるとメモリーやレジスターになります。

リピーター上のレッドストーントーチが遮断機が下りても、前の状態を保持

黄色いブロックにレッドストーントーチを横につけてNOT回路を作っていますが、これは、クロックを表す側のリピーターがONになったときに、(=Highになったとき)に、状態を保持するためです。これをハイレベルエッジと言います。

マインクラフトではまだわかりませんが、現実世界のハードウェアでは、このレベルエッジを適宜切り替えて使っているそうです。

 

まとめ

マインクラフトでDラッチ回路を作成しました。次回はDフリップフロップ回路を作って、クロック入力の立ち上がり時のみ入力状態が反映され、それ以外では保持されるようにしてみます。

 

Falstad’s Curcit Simulatorでデジタル回路の書き方(注意点)

この記事では、Falstad’s Curcuit Simulator Appletでデジタル回路を書く方法と注意点を簡単に説明します。アナログ回路が豊富にありますが、デジタル回路の順序回路の勉強のために使うため、そこだけに特化して説明します。またワイヤーの配線時に注意が必要なのでそこも詳しく説明します。

私の現状

Logisimでデジタル回路を学び、最近はマインクラフトで回路を実装してみようといろいろ調べています。Logismは教育用の無料のシミュレータで、レジスターやRAM、ROM、FlipFlop回路などはあらかじめICのような部品として用意されています。これをAND、ORなどの論理回路を使って書きたいですが、Logisimでは、順序回路のようなフィードバックがある回路は信号をシミュレートしていないので正常に動作しません。

マインクラフトでCPUを作ろうとすると、保存する仕組みをマインクラフトで実装する必要があります。ですが、マインクラフトのレッドストーン回路はいろいろ癖があるので、まずはFalstad’s Curcuit Simulator Appletで回路図を書くことにしました。

Falstad’s Curcuit Simulator Appletの基本操作

falstad’s Curcuit Simulatorは、信号のシミュレートもしているので、コンデンサーや抵抗を使うような回路は、電気の流れも確認できます。

視覚的に分かりやすい!

操作は、初心者向きではありません。何らかのシミュレーターなどを使った人向けで、右クリックのコンテキストメニューから各部品を選択するか、キーボードのショートカットで部品を選択します。

削除

Ctrl+Aで全選択して、DELETEキー

または、メニュー[Circuits]->[Blank Circuit]

選択モード

スペースキーで選択モードになります。またはShiftキーで範囲選択でも選択モードになります。スペースキーを押して現在選択モードであるかは、右クリックのコンテキストメニューから確認できます。またアイコンが十字マーク出ない場合は、選択モードです。

ワイヤーが斜めになっていたり、移動したり、引き延ばしたりするときは、選択モードで行うので、スペースキーを使う事をお勧めします。

シフトキーを押しながら範囲選択しているところ

デジタル回路の選択方法

メニューの[Draw]または右クリックで、コンテキストメニューが表示されるので、ここからワイヤーやデジタル回路を選択します。

右クリックして、[Logic Gates, Input and Output]を開いたところ
デジタル回路(論理回路)を書く場合は、コンテキストメニューの[Add Wire]、[Logic Gates, Input And Output]、[Digital Chips]になります。上から5場面目に[Outputs and Labels]があるので、ここからLEDやラベルなども選択できます。

Logisimと同様に順序回路などもICとして用意されている

部品の配置方法

部品の配置方法が独特でコンテキストメニューで選択して、クリックしながら、つまりドラッグで配置します。一般的なソフトウェアは、アイテムを選択してマウスを移動すると、そのアイコンが透過で表示されたりして分かりやすくクリックで配置するものも多いので、これが分かっていないと部品を配置できずに戸惑います。

配線の調整

ワイヤーを選択して、点から点を繋げると接続できます。また選択モードにしてワイヤーを選択すれば移動や長さの調整ができます。

配線の注意!!!

配線は点と点を繋げると接続します。点と線では接続されません。

この回路シミュレータは、点から線に接続すると、赤い点が表示されて接続しません。点から線にワイヤーを引くと、交差する部分が点になるので接続しているように見えますが接続していません。

非常に直感的ではなく、かつエラーが分かりづらいです。ワイヤーを移動したり長さを調節して、必ず点と点で接続してください。

以下画像は、接続していない例です。新しいワイヤーの点を、線に向かって繋げているので、赤点がひょうじされて接続されていません。

交差して赤い点が表示されるが接続されていない!!!

次の画像は、新しいワイヤーの点を、別のワイヤーの点にむかって繋げているので、白点が表示されて接続されています。

ワイヤーは点と点で接続!!!

SRラッチの例

以下画面の上部のSRラッチは、ワイヤーの点と線で繋げようとしているため、赤点が表示されて接続されていません。一方、下のSRラッチは、ワイヤーの長さを調節して、点と点で繋げているため、白点で表示されて接続されています。

ワイヤーを選択して、回路図のワイヤーなどの上でマウスボタンを押し続けると以下のように部品とワイヤーの接続点が確認できます。また赤点が出た場合は、右下のメッセージで、[2 bad connections]のように表示されていますが、これも非常に分かりづらいです。

 

まとめ

Falstad’s Curcit Simulatorで論理回路を作るときの操作方法を説明しました。非常に独特な操作方法ですが、わかってしまえば手軽に試せます。Logisimは使いやすいですが、順序回路をうまく扱えないので、このFalstad’s Curcit Simulatorを併用するとよさそうです。

 

マインクラフトのレッドストーン回路でマルチプレクサー

今回は、マインクラフトで組み合わせ回路のマルチプレクサーを作りました。2bitの信号を切り替えるだけですが、マインクラフトでは単純に回路図をレッドストーン回路で実現すると、1つ1つのブロックが多いため最適化する必要があるのが分かりました。

logisimで作ったマルチプレクサーの回路図
マインクラフトでマルチプレクサーを実装

画面キャプチャーのように、2ビットの切り替えだけでも何も考えずにブロックを配置するとこの大きさです。マインクラフトは、レッドストーンは15個分の信号しか伝わらないため、大きくすればするほどリピーターで調整する必要があります。

16ビットのマルチプレクサーを作るとなると、ブロックの並べ方をしっかり学ばないといけないようです。

 

マインクラフトのレッドストーンでXOR回路

マインクラフトのレッドーストーンで排他的論理和のXOR回路を作成しました。

 

http://minecraft.gamepedia.com/File:StandardLogicGates.png

 

今回作成した排他的論理和XOR回路

マインクラフトでは、レッドストーンとブロックを繋げてさらにレッドストーントーチを置くことでNOT回路になります。そして高低差をうまく使うことで小さなサイズで、XOR回路を作る事が可能です。

一度Logisimで、回路図を書いてみました。レッドストーン回路はどこが接続されているのかわかりづらいですが、以下のような回路図にしてしまうと分かりやすいです。また、XOR回路の出力にNOT回路を付けるとXNOR回路になります。

 


スタックマシンのlogisimのサンプルを探す。

[Implementing a One Address CPU in Logisim]で1つのレジスターを使うハーバード・アーキテクチャのシンプルなCPUを作成しました。スタックマシンは演算にRAMなどのスタック領域を用意してレジスターはないはずです。

今の知識では回路図を書くのは無理なので、Logisimでstack machineの実装を探したら、UMBC(ユニバーシティ・オブ・メリーランド, ボルティモア・カウンティー)の

https://www.csee.umbc.edu/~chang/cs313.s13/

シラバス の後半の「Thu 04/11」から、アセンブリ言語とLogisimの講義でこの時のスライドとホームワークのlogisimの回路図があるので参考になりそうです。

 


Logisimで比較回路(Comparator)を学ぶ

Logisimで組み合わせ回路(Combinational Logic)の比較回路(Comparator:コンパレータ)を学んでいきます。比較回路は、単純に2つの入力を比較して、その状態を出力します。

ひと桁の二進数の入力Aを考えると0か1です。

入力A
0
1

比較するので、入力Bも考えると、これも0か1なので、入力Aと入力Bは、以下4通りの組み合わせがあります。

入力A 入力B
0 0
1 0
0 1
1 1

この表から、二進数で入力A、Bを比較すると、出力は値が同じ時、Aが小さい時、Aが大きい時の3パターンあることが分かります。AとBが両方とも0または1の時は、A-B=0と考えることもできます。

  • A=Bの時は、0=0,1=1
  • A<Bの時は、A0<B1
  • A>Bの時は、A1>B0

これで出力のパターンが3つにまとまったので真理値表にします。

入力A 入力B A<B A=B A>B
0 0 0 1 0
1 0 0 0 1
0 1 1 0 0
1 1 0 1 0

各出力の式を求める

A<Bの出力は、~AB

A=Bの出力は、~(~AB + A~B)

A>Bの出力は、A~B

つまり、A=Bは、A<BとA>Bの出力ピンをXNOR回路の入力とすればよいです。XNOR回路の求め方ですが、難しく考えるよりかは真理値表で、1001となってたらXNOR回路だ!と覚えてしまうのがよさそうです。

A=B
1
0
0
1

XNORを使わない解説が以下にあり分かりやすいです。

http://www.s-graphics.co.jp/nanoelectronics/kaitai/logicgate/4.htm

論理式、カルノー図、ベン図を学習すると、真理値表などを踏まえて回路図に落とせるようです。

いろいろな回路シミュレータ

Logisimは教育用回路シミュレータとして操作性が良く便利です。ですが順序回路の挙動が不自然なのでちょっと残念です。似たようなシミュレータをいくつか探してみました。

Atanua

昔はライセンス販売していましたが、今はライセンスも無料で、ソースコードもgithubで公開しています。7400シリーズのICなどが用意されていています。

http://sol.gfxile.net/atanua/index.html

atanuaを使ったチュートリアルなどはないようなので、入門情報やこれでCPUをを作るよりかは何か学んできてからそれをAtanuaで試すのがよさそうです。

 

Circuit Wizard

商用ですが、登録すると制限付き版が使えるのでダウンロードしてみました。以下のように回路が光るので入門によさそうですが、この制限付き版では、自分で回路を作るのは可能でしたが、シミュレートはできませんでした。また、購入金額や日本語の案内がないのも残念です。

 

ReTro

つい先ほど見つけたのですが、これもLogisimに近い感じのシミュレータのようです。公式サイトにCPUのサンプルも4つ載っているので後でやってみます。

http://robotics.ee.uwa.edu.au/retro/

 

 

flastad circuitjs

チュートリアルや入門情報がないので、他で電子回路やロジックICについて学んでから使う必要がありますが、これは電流がアニメーションして、電流や電圧も表示できるので非常に分かりやすいです。

使い始めは右クリックでコンテキストメニューを開いて、各部品を追加するので使い方に戸惑うかもしれませんがショートカットを覚え始めると途端に効率の良さが分かるようになります。

まだ触り始めなのでわかりませんが、Logisimのような回路の階層構造は作れるのかわかりません。

http://www.falstad.com/circuit/circuitjs.html

また、オープンソースです。https://github.com/sharpie7/circuitjs1

Digital

Logisimに触発されて作られた回路シミュレータDigialです。名前が一般名詞なので検索しづらいのが残念です。FlipFlop回路なども問題なく動作します。Flasted circuitjsのように、メニューから部品を選択する形式なのでlogisimで回路シミュレータをはじめたひとはとっつきづらいかもしれません。

サンプルも非常に豊富で素晴らしいのですが、チュートリアル等のドキュメントが不足していて使い方が分かりません。ユーザーがいないため簡単なチュートリアル記事などがなく、せっかくよいツールなので残念です。

https://github.com/hneemann/Digital

 


Implementing a One Address CPU in LogisimのCPU実装を調べる5 複製してみる

これまでの作業で「Implementing a One Address CPU in Logisim」のアセンブリ言語と回路図がすべてわかりました。最後に同じ回路を作ってみます。

各ソフトウェア

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

自分でCPUを作ってみる

ただ教科書を読むだけでなく、実際に全部作ってみると、どこを理解していないか確認できるので、実装してみます。

CPU全体

マシン語を実行して0005+0002=0007の実行後のループ(=halt)状態

ALU

ALUは、加算、減算のみです。Overflowフラグを用意するため15bitの桁上がり(Carry Out)と16bitの桁上がりのどちらかがある場合をOverflowにします。Logisimに付属している加算器ICは、ビット数は変更できますが、Overflowフラグの出力ピンはありません。そのため15bit加算器と、1bit加算器をそれぞれ計算して、あとで繋げることで16bitの加算にしています。

なぜ15bitと1bitに分けるかですが、最上位ビットは正負のビットなので、正の数の場合は15bitで表し16bitになる場合は桁上がりです。また負の数は最上位ビットを1にして、17bitになったら桁上がりです。そのため、Overflowフラグは、15bitと16bitの桁上がりを確認する必要があります。

16bitの演算となると、ワイヤーがとても面倒なのが分かりました。

Control Unit

制御装置は、入力のInstructionで、各装置(=各IC)をOn/Offする信号を送るだけなので単純な回路です。

Sign Extend

8bitを16bitに拡張する回路図です。

 

ダウンロード

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

まとめ

今回、回路シミュレーターLogisimと「Implementing a One Address CPU in Logisim」でCPUを作ってみました。気付いただけでも回路図は抵抗やコンデンサーなどもないし、順序回路FlipFlop回路も動作しないし、出来たCPUは加算器と減算器しかないし、実物で動作できないし…と課題は沢山あります。

ですが、今回CPUを作成するまで多くの発見がありました。

  • 回路シミュレータは、トライアンドエラーがやりやすい
  • 初心者でも失敗を恐れずに試せる
  • 論理回路を小さく作ってみて、そこから大きくしていくプログラミングと同等な感覚が分かった
  • アセンブリ言語(仕様)を作るという事はCPUを作る事
  • よく図解されているCPUの基本構成の制御装置、ALU、レジスター、PC、メモリーなどが理解できた。
  • アセンブリ言語の分岐は、if文でありfor文である。

また、50ページ教材で、CPUの論理回路とアセンブリ言語の実装を学べたのは非常に有意義であるとともに、複雑なものを複雑なまま学習していることが多いと感じさせられました。


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のドキュメントのように必ず表を作っていくとよさそうです。


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)だけです。制御回路も簡単な回路で、この回路がどのような命令があって何をしたいのかを理解すれば、問題ありません。

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