N位二进制代码可以用来存储 2N 个不同的编码信息元素。这正是编码器和解码器的用武之地。
编码器 将 2N 条输入线转换为 N 位代码,而 解码器 则将 N 位代码解码为 2N 条输出线。
1. 编码器 –
编码器是一种组合逻辑电路,它将 2N 条输入线形式的二进制信息转换为 N 条输出线,这些输出线代表输入的 N 位代码。对于简单的编码器,我们假设在任意时刻只有一条输入线处于激活状态。让我们以 八进制转二进制 编码器 为例。如下图所示,一个八进制转二进制编码器接收 8 条输入线并生成 3 条输出线。
真值表 –
D6
D4
D2
D0
Y
—
—
—
—
—
0
0
0
1
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
从真值表中我们可以看到,当 D0 激活时,输出为 000;当 D1 激活时,输出为 001;当 D2 激活时,输出为 010,依此类推。
实现方法 –
根据真值表,当输入的八进制数字为 1、3、5 或 7 时,输出线 Z 为激活状态。类似地,当输入八进制数字为 2、3、6 或 7 时,Y 为 1;而当输入八进制数字为 4、5、6 或 7 时,X 为 1。因此,布尔函数如下所示:
X = D4 + D5 + D6 + D7
Y = D2 +D3 + D6 + D7
Z = D1 + D3 + D5 + D7
因此,我们可以使用或门 来实现该编码器,如下所示:
这种编码器的一个局限性是,在任意给定时间只能有一个输入处于激活状态。如果有多个输入同时激活,输出将是未定义的。例如,如果 D6 和 D3 同时激活,我们的输出将是 111,而这实际上是 D7 的输出。为了克服这个问题,我们使用 优先编码器。当所有输入都为 0 时,会出现另一种歧义。在这种情况下,编码器输出 000,而这实际上也是 D0 激活时的输出。为了避免这种情况,我们可以向输出添加一个额外的位,称为 有效位,当所有输入都为 0 时该位为 0,否则为 1。
优先编码器 –
优先编码器是一种赋予输入优先级的编码器电路。当多个输入同时激活时,具有较高优先级的输入将优先,并生成对应的输出。让我们以 4 线到 2 线优先编码器为例。从真值表中我们可以看到,当所有输入都为 0 时,我们的 V 位(即有效位)为零,输出不被使用。表中的 ‘x‘ 表示 “无关”条件,即它可以是 0 也可以是 1。这里,D3 具有最高优先级,因此,无论其他输入是什么,只要 D3 为高电平,输出必须为 11。而 D0 具有最低优先级,因此只有当 D0 为高电平且其他输入线为低电平时,输出才会是 00。类似地,D2 对 D1 和 D0 拥有较高优先级,但低于 D3,因此只有当 D2 为高电平且 D3 为低电平时(D0 和 D1 无关),输出才会是 010。
真值表 –
D2
D0
Y
—
—
—
0
0
x
0
1
0
0
x
1
1
x
0
x
x
1
实现方法 –
可以清楚地看到,有效位为 1 的条件是至少有一个输入应为高电平。因此,
V = D0 + D1 + D2 + D3
对于 X:
=> X = D2 + D3
对于 Y:
=> Y = D1 D2’ + D3
因此,4线到2线优先编码器可以实现如下:
2. 解码器 –
解码器是一种组合逻辑电路,它执行编码器的反向操作,将 n 条输入线转换为 2ⁿ 条输出线,并且对于每种输入组合,只有一个输出处于激活状态。
让我们以 3线到8线 解码器为例。
真值表 –
Y
D0
D2
D4
D6
—
—
—
—
—
0
1
0
0
0
0
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
1
1
0
0
0
0
实现方法 –
当 X = 0, Y = 0 且 Z = 0 时,D0 为高电平。因此,
D0 = X’ Y’ Z’
Sim