わかりました。基本的には、8 対 3 のエンコーダーと 3 対 8 のデコーダーを設計するよう求められています。一緒に働くFAが与えられているので、それは任務のポイントではありません。
まず、エンコーダーとデコーダーがどのように機能するかを定義する必要があります。したがって、真理値表を作成します。
エンコーダー:
Input | Output
01234567 | 421
-----------------
10000000 | 000
01000000 | 001
00100000 | 010
00010000 | 011
00001000 | 100
00000100 | 101
00000010 | 110
00000001 | 111
デコーダーはその逆です。
次に、エンコーダをどのように構築しますか? まあ、一度に1ビットずつ攻撃するだけです。
したがって、入力ビット 1、3、5、または 7 が設定されている場合は 1 の桁であり、それ以外の場合は 0 です。したがって、1、3、5、および 7 に接続された 4 つの入力を持つ巨大な OR が必要です。
2 桁の場合、OR ゲートを 2、3、6、7 に接続する必要があります。最後に、4 桁のゲートを 4、5、6、7 に接続します。これは、余分なビットが存在しないことを確認するためのエラー チェックを行いません。設定していません。ただし、その場合の動作は仕様で定義されていないようなので、おそらく問題ありません。
次に、3 つの行を取得して加算器に供給します。これは簡単なので立ち入りません。
最後に、デコーダーが必要です。これは、エンコーダーよりも少しトリッキーです。
デコーダの真理値表を見てみましょう:
Input | Output
421 | 01234567
----------------
000 | 10000000
001 | 01000000
010 | 00100000
011 | 00010000
100 | 00001000
101 | 00000100
110 | 00000010
111 | 00000001
今回は 3 or ゲートだけで終わりではありません。
これを C ライクなコードで書き留めてみましょう。
if (!input[0] && !input[1] && !input[2])
output[0] = 1
if (input[0] && !input[1] && !input[2])
output[1] = 1
if (!input[0] && input[1] && !input[2])
output[2] = 1
if (input[0] && input[1] && !input[2])
output[3] = 1
if (!input[0] && !input[1] && input[2])
output[4] = 1
if (input[0] && !input[1] && input[2])
output[5] = 1
if (!input[0] && input[1] && input[2])
output[6] = 1
if (input[0] && input[1] && input[2])
output[7] = 1
というわけで、3入力のANDゲートを8つ、NOTゲートを3つ使うことになりそうです!
これはもう少し複雑なので、実装例を作成しました。