Turing Complete
Not Gate
NANDでNOT回路を作る。
NOTは入力が逆転する。
NANDを1つだけ使うとすると、入力は1つだけであるため、NANDには常に同じ入力が入ると考えられる。
NAND表を見るとNN,TTの場合、出力が逆転している。
AND Gate
NANDとNOTでAND回路を作成する。
AND回路は上記Desired outputの通りTTの時だけTを出力する。
NAND回路の出力と見比べてみると出力がすべて反対になっているので、NANDの出力をNOTすればよい。
また、Not GateでNOTをNANDで実現できたので、NAND+NANDでもANDを実現できる。
最初にNOTを持ってきてもできると思ったが、ショートを起こし失敗した。
OR Gate
NANDとNOTでOR回路を作成する。
OR回路は上記Desired outoutの通りTがひとつでもあればTを出力する。
NAND回路の出力と見比べてみるとFFとTTの部分が反対になっているので、2つの入力をそれぞれNOTしたものをNANDに食わせればよい。
TFおよびFTはNOTによる影響は受けない。
ドモルガンの法則で考える。
!(P || Q) == !P && !Q
↓
P || Q == !(!P && !Q)
NOR Gate
NANDとNOTでNOR回路を作成する。
NOR回路は上記Desired outoutの通りTがひとつでもあればFを出力する。
OR Gateの出力と反対になっているので、NOTをとればよい。
ALWAYS ON
NOR(NANDでもよい)とANDの出力のORをとるといつでもTになることがわかる。
SECOND TICK
TFの時だけTにする問題。
INPUT2のNOTした結果をANDするとよい。
別解としてINPUT1のNOTをNORしてもよい。
XOR GATE
SECOND TICKの応用だと考えた。
THIRD TICKをまず考える。つまり、FTの時のみTになるやつ。
それとSECOND TICKの結果のORをとればよい。
THIRD TICKはINPUT1のNOTのANDをとればよい。
BIGGER OR GATE
愚直だがORのORをとればよい。
BIGGER AND GATE
愚直だがANDのANDをとればよい。
XNOR GATE
XOR GATEで使ったORをNORに変えればよい。
CIRCULAR DEPENDENCY
コンポーネントの出力がそのコンポーネントの入力になっている回路をまず作る。
2つ以上のコンポーネントで作成する。
DELAYED LINES
まず、ディレイラインを一つ使って出力を把握してみる。
初回のディレイラインの状態はFであるため、出力は必ずFになる。
このとき、入力がFなのでディレイラインの状態はFになる。
2回目、入力はT。であるが、ディレイラインの状態はFであったため、出力はFになる。
ただ、この時ディレイラインにTが入力されたため、状態はTになる。
すべて出力した結果は以下の通り、期待値は現在の出力より1テンポ遅れていることがわかる。
ディレイラインをもう一つ追加し、1テンポ遅らせる。
DOUBLE TROUBLE
Tが2つ以上の場合、Tを出力する。
インプットの全組み合わせ(4C2=6)でANDをとる。
一つでもTになれば2つ以上Tがあると判断できる。
もっとうまい方法があるのではないか。。
ODD NUMBER OF SIGNALS
インプットが2つの場合、XOR1つで再現できる。
XORを各インプットにつなげることで実現できた。
COUNTING SIGNALS
入力がTになっている数を出力する。
入力数は4つ。出力する数は0から4。
出力コンポーネントには3つの入力がある(上からO1、O2、O3)
O1がTになると1、O2がTになると2、O3がTになると4が出力される。
複数Tにした場合、数が出力に合算される。
今回出力したい値Aと出力コンポーネントの入力O1,O2,O3の対応表は以下の通り。
A | O1 | O2 | O3 |
---|---|---|---|
0 | F | F | F |
1 | T | F | F |
2 | F | T | F |
3 | T | T | F |
4 | F | F | T |
出力O1,O2の期待する入力に着目する。
O1は数が奇数の時にTにしたい。「ODD NUMBER OF SIGNALS」の回路で実現できる。
O2は数が2以上の場合(4を除く)、Tにしたい。「DOUBLE TROUBLE」の回路が利用できそう。
ただし、「DOUBLE TROUBLE」は入力が4の場合、Tを出力するため、改良が必要。
OR部分をXORに置き換えた。また、中央のXORは3入力がTの時にFを出力したいので、2つ使用した。
DUOBLE THE NUMBER
Byte Splitterと8 bit Makerというコンポーネントを使用する。
前者は1byte入力をbitに分割して8つの出力にする。
後者はSplitterの逆で、bitの入力をbyteに変換する。
今回の問題は入力を2倍にして出力する必要がある。
bit演算では1bitずらすと数が2倍になるので線もずらす。
HALF ADDER
半加算器を作る。
繰り上がりを表すCarryはANDで表現できる。
SumはXORで表現できる。
BYTE NOT
8bit入力を反転させたい。
各bitをNOTでつなげばよい。
BYTE OR
1bit毎にORをつければよい。