FPGA01_3-8译码器的设计与应用

3-8译码器的简单实现与应用

3-8 译码器的设计

用三个 bit 的输入信号来得到八个 bit 的输出信号,一个十分自然的思路便是使用二进制编码:毕竟我们有 $2^3=8$ 。如果我们将作为输入信号的三个 bit 记作 $I_0, I_1, I_2$, 作为八个输出信号的 bit 记作 $O_0, O_1, \dots, O_8$ ,那么我们可以作出如下的真值表:

Index$I_2$$I_1$$I_0$$O_0$$O_1$$O_2$$O_3$$O_4$$O_5$$O_6$$O_7$
000010000000
100101000000
201000100000
301100010000
410000001000
510100000100
611000000010
711100000001

很显然,如果我们将 $O_0, \dots, O_7$ 作为八个布尔函数来看的话,它们都只有唯一一个值为1的最小项,所以这个最小项便是它们的最简表达式。因此我们有

O0=I2I1I0,O4=I2I1I0O1=I2I1I0,O5=I2I1I0O2=I2I1I0,O6=I2I1I0O3=I2I1I0,O7=I2I1I0\begin{aligned} &O_0=\overline{I_2I_1I_0},\qquad O_4=I_2\overline{I_1I_0}\\ &O_1=\overline{I_2I_1}I_0,\qquad O_5=I_2\overline{I_1}I_0\\ &O_2=\overline{I_2}I_1\overline{I_0},\qquad O_6=I_2I_1\overline{I_0}\\ &O_3=\overline{I_2}I_1I_0,\qquad O_7=I_2I_1I_0\\ \end{aligned}

通过 Logisim-Evolution 与布尔函数画出电路图并模拟运行如下:

3_8_Decoder_Properties.gif

由图可知,电路符合我们的要求。

使用 2-4 译码器实现 3-8 译码器

这是一个 2-4 译码器的电路结构

2_to_4_Decoder.png

现在我们需要用两个 2-4 译码器来实现一个 3-8 译码器。既然作为输入信号的八个三位二次元组合 $000,001,\dots,111$ 对应着八个仅一个对应的输出端为高电位的结果,我们可以将这八位输出端分割为高四位与低四位,分别由两个 2-4 译码器来控制。

但是因为在我们这里,译码器的输出会且仅仅出现一个 $1$ ,而两个译码器的输出拼接会产生两个 $1$ 出来 (例如 $0010\ 0100$),这样的结果不符合我们对译码器输出的要求,因此我们需要给两个译码器分别安装一个使能端,在同一时间内,只能有一个使能端开启,即同一时间内只能有一个译码器为激活状态,而未激活的译码器结果应输出 $0000$.

假设高四位译码器的使能端接收信号记作 $E_H$,输出的四位信号记作 $O_H$,输出结果对应的二位输入为 $I’_H$, 低四位的使能端记作 $E_L$,输出记作 $O_L$ ,输出结果对应的二位输入为 $I’_L$,三位输入记作 $I_0,I_1,I_2$,则相应的真值表如下:

Index$I_2$$I_1$$I_0$$E_H$$E_L$$O_H$$O_L$$I’_H$$I’_L$
00000100000001X00
10010100000010X01
20100100000100X10
30110100001000X11
4100100001000000X
5101100010000001X
6110100100000010X
7111101000000011X

观察真值表,我们可以得到一些重要性质,这对我们设计电路有巨大作用:

  1. 当 $I_2$ 为低电位, $E_H$ 关闭, $E_L$ 开启,当 $I_2$ 为高电位, $E_H$ 开启, $E_L$ 关闭
  2. $I’_H$ 与 $I’_L$ (如果使能端未关闭) 的组合始终与 $I_1I_0$ 的组合相同

综上,我们可以直接将 $I_0$ 与 $I_1$ 都同时接入两个译码器,同时引入 $I_2$ 作为使能端,一个取反值接入低四位译码器,另一个取原值接入高四位译码器。电路图如下:

首先是安装使能端的 2-4 译码器

2_to_4_Decoder_with_Enabler.png

以及由其构造的 3-8 译码器

3_8_By_2_4_Decoder_Properties.gif

借助 3-8 译码器进行楼道灯控制

楼道灯控制是指:在一个楼道中,有三个开关控制一盏灯是否亮,且改变其中任意一个开关的状态时,灯的状态都会随之改变。

例如,若某一时刻时,三个开关的状态分别是闭合、断开、闭合,而此时灯灭,则此时,将任意一个闭合的开关断开,或者将任意一个断开的开关闭合,则灯亮(即三个开关均闭合,或三个开关的状态分别为闭合、断开、断开,或三个开关的状态分别为断开、断开、闭合时,灯均亮)

听起来有点像异或:每当有一位输入的信号改变,最后输出的1位信号都要改变。但是我们这里需要使用 3-8 译码器,一个直观的思路就是通过译码器的 8 位输出来控制灯的开关。注意到改变其中任意一个开关的状态,相当于将输入的二次元组合转为另一个相邻的二次元组合,这让我们想到格雷码,进而发现,假如我们将灯的开关状态作为一个关于 $I_0,I_1,I_2$ 的布尔函数,可以做出一个卡诺图:

$I_0$ / $I_1,I_2$00011110
0$1_0$$0_1$$1_3$$0_2$
1$0_4$$1_5$$0_7$$1_6$

因此,我们可以将 $O_0, O_3, O_5, O_6$ 接入一个或门,用于控制灯的开关,另外四个信号作为无用信号排除。

得到的电路图如下:

3_8_light_control.gif

使用 Hugo 构建
主题 StackJimmy 设计