好的,所以基本上你被要求设计一个 8-to-3 编码器和一个 3-to-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。所以我们只需要一个巨大的 OR,其中 4 个输入连接到 1、3、5 和 7。
对于 2s 数字,我们需要将 OR 门连接到 2、3、6、7。最后,对于 4s 门,将它们连接到 4、5、6、7。这不会进行任何错误检查以确保额外的位没有设置。虽然,这种情况下的行为似乎没有被规范定义,所以它可能没问题。
然后你拿你的三行并将它们提供给你的加法器。这很容易,所以我不会进入它。
最后你需要一个解码器,这比编码器要复杂一些。
让我们看一下解码器真值表:
Input | Output
421 | 01234567
----------------
000 | 10000000
001 | 01000000
010 | 00100000
011 | 00010000
100 | 00001000
101 | 00000100
110 | 00000010
111 | 00000001
这次我们不能只使用 3 或门就可以收工了。
让我们用类似 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
所以,看起来我们将使用 8 个 3 输入与门和三个非门!
这个有点复杂,所以我做了一个示例实现: