マルチプレクサとデマルチプレクサ
The Elements of Computing Systems に沿って基本の論理ゲートを実装している。
NOT, AND, OR, XOR のような耳慣れた論理に加えて、 Multiplexor と Demultiplexor という耳慣れない回路が、基本の論理ゲートとして扱われていた。そもそも論理ゲートというものを、「2つの入力を1つの出力に合成するもの」のように捉えていた僕にとっては、複数の入出力を持ちうるこれらのゲートは異色の存在に思われた。ノートの書写しにはなるが、TILとして書いておきたい。
multiplexor
マルチプレクサは、3つの1ビットの入力を受け取り、1つの1ビットの出力を与える。入力のうち1つはセレクタと呼ばれ、このセレクタがフラグとして立っているかどうかで、残りの2つの入力のうちどちらが出力されるかが決定される。
真理表を書くと次のようになる。
input1 | input2 | selector | output |
---|---|---|---|
0 | 0 | 0 | 0 (=input1) |
0 | 1 | 0 | 0 (=input1) |
1 | 0 | 0 | 1 (=input1) |
1 | 1 | 0 | 1 (=input1) |
0 | 0 | 1 | 0 (=input2) |
0 | 1 | 1 | 1 (=input2) |
1 | 0 | 1 | 0 (=input2) |
1 | 1 | 1 | 1 (=input2) |
高級言語であれば、IFを使って条件分岐するような処理になる。
bool input1, input2, selector; // 入力処理 if (selector) printf("%d", input2); else printf("%d", input1);
論理ゲートで実装する上では、こうなる。
demultiplexor
デマルチプレクサは、2つの1ビットの入力を受け取り、2ビットの出力を行う。今度も2つの入力のうち一方がセレクタであり、セレクタの値によって、出力ビットのどちらに入力ビットを出力するかが決定される。
真理表は次の通り。
input | selector | output |
---|---|---|
0 | 0 | 00 |
0 | 1 | 00 |
1 | 0 | 10 |
1 | 1 | 01 |
高級言語であれば、さながらこうなるだろう。
bool input, selector; // 入力処理 if (selector) printf("0%d", input); else printf("%d0", input);
実装はこうなる。