← 返回博客数字译码器

BCD 转七段译码器:从数字到显示

使用真值表、卡诺图最小化和经典 74LS47 驱动芯片,将四位 BCD 数字映射到数字显示器的七个段。

DennyDenny
阅读约需 10 分钟
Chalkboard feature illustration for “BCD 转七段译码器:从数字到显示”

简述: BCD 转七段译码器接收一个 4 位二进制编码十进制数字(0–9),并控制七段显示器上相应的 a–g 段点亮。映射关系由 10 行真值表定义;各段的布尔表达式由该表推导并通过卡诺图化简,可使用 74LS47(共阳极)或 74LS48(共阴极)等芯片实现。

七段显示器广泛用于时钟、家用电器、计算器、记分牌和仪表。当系统提供 BCD 数字而非七路独立段信号时,小型组合电路会把 4 位编码转换为相应的 LED 段图样。该电路即 BCD 转七段译码器,也是布尔代数和卡诺图的典型实际应用。

本文说明 BCD 与段命名约定,建立真值表,推导各段的布尔方程,对比共阳极与共阴极接线,并介绍实现完整功能的 74LS47/74LS48 芯片。文末所列仿真器模板可用于实际接线验证。

什么是 BCD?

BCD(二进制编码十进制)是一种以 4 位表示每个十进制数字 0 至 9 的编码。与纯二进制表示不同,BCD 不使用编码 1010 至 1111(十进制 10–15)。

十进制数字BCD(4 位)A B C D
000000 0 0 0
100010 0 0 1
200100 0 1 0
300110 0 1 1
401000 1 0 0
501010 1 0 1
601100 1 1 0
701110 1 1 1
810001 0 0 0
910011 0 0 1
10–151010–1111未使用(无关项)

本文采用的约定为:A 是最高有效位,D 是最低有效位。有些教材采用相反顺序;在重新标记变量后,方程相同。

为什么使用 BCD 而非直接二进制?十进制数字可直接映射到以数字为中心的显示器,固定小数位的十进制量也可在不转换为二进制小数的情况下保存所存储的十进制数字。只有当数学结果适合所选数字位数和小数位时,算术才是精确的;除法及其他非终止结果仍需要舍入规则。

比较存储效率必须明确基准。BCD 为每个十进制数字使用 4 位,而十种符号的信息量为 log⁡210≈3.322\log_2 10\approx3.322 位。每个 BCD 半字节的理论编码空间约有 16.9% 未使用;等价地,4 位比 log⁡210\log_2 10 多约 20.4%。对于特定的有界整数范围,应比较二进制与 BCD 的实际位宽,而不能直接套用单一百分比。

六个未使用代码——1010 至 1111——在最小化段方程时可以成为无关项条目,但前提是系统保证其显示输出无关紧要。若无效代码可能在复位、总线转换或故障期间出现,应为它指定明确的空白或错误图样。无关项是设计许可,并非硬件永远不会呈现该输入的声明。

七个段

标准七段显示器有七个排成 8 形状的 LED,按惯例标为 a 至 g:

   ┌───a ───┐
   ││
   f         b
   ││
   ├───g ───┤
   ││
   e         c
   ││
   └───d ───┘
  • a 是顶部水平段。
  • b 是右上垂直段。
  • c 是右下垂直段。
  • d 是底部水平段。
  • e 是左下垂直段。
  • f 是左上垂直段。
  • g 是中间水平段。

每个十进制数字点亮特定的段集合:

数字点亮的段
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

DigiSim 的 SEVEN_SEGMENT_DISPLAY 元件以这个确切顺序接收七个输入;DIGIT_DISPLAY 是更高层的抽象,直接接收四位 BCD 输入,并在内部处理译码。

完整真值表

将 BCD 编码与段映射结合,可得到一张有 16 行(10 个有效项 + 6 个无关项)和 7 个段列的表:

ABCD数字abcdefg
000001111110
000110110000
001021101101
001131111001
010040110011
010151011011
011061011111
011171110000
100081111111
100191111011
1010—×××××××
1011—×××××××
1100—×××××××
1101—×××××××
1110—×××××××
1111—×××××××

该表假设采用高电平有效的段驱动逻辑信号,即 1 表示点亮该段。共阴极驱动器通常可采用这一极性,共阳极驱动器则通常使用低电平有效输出。物理驱动级在电流方向、压降和输出结构上也有所不同;两者的差异并非只是在原理图中增加一个反相器。

推导段方程

上表的每一个段列都是四个输入的一个布尔函数。由于有六行无关项,卡诺图最小化得到的表达式比朴素的积之和短得多。这项技术就是采用积之和方法并进行卡诺图化简。

段 a

段 a 在数字 0、2、3、5、6、7、8、9 时点亮,在 1、4 时熄灭。将无关项进行最优处理后,卡诺图最小化得到:

a=A+C+B⋅D+B‾⋅D‾a = A + C + B \cdot D + \overline{B} \cdot \overline{D}

(这里的 B‾\overline{B} 表示 NOT B;有些书写作 B′B' 。)项 B‾⋅D‾\overline{B} \cdot \overline{D}——B 和 D 都为零——高效覆盖 0 和 2;B⋅DB \cdot D——两者都为一——覆盖 3、5、7、9;仅 AA 覆盖 8 和 9(以及无关项 10–15);仅 CC 覆盖 2、3、6、7。

该表达式的每个乘积项使用一个AND,再进行 OR 归约。精确的单元或晶体管数取决于逻辑系列、补信号可用性和综合映射。

段 b

段 b 在 0、1、2、3、4、7、8、9 时点亮,在 5、6 时熄灭。卡诺图给出:

b=B‾+C‾⋅D‾+C⋅Db = \overline{B} + \overline{C} \cdot \overline{D} + C \cdot D

段 c

段 c 在 0、1、3、4、5、6、7、8、9 时点亮,仅在 2 时熄灭。卡诺图给出:

c=B+C‾+Dc = B + \overline{C} + D

这是所有表达式中最简单的一个——仅有三项,因为只有一行零输出,而无关项填满了图的其余部分。

段 d

段 d 在 0、2、3、5、6、8、9 时点亮,在 1、4、7 时熄灭。卡诺图给出:

d=B‾⋅D‾+C⋅D‾+B⋅C‾⋅D+B‾⋅C+Ad = \overline{B} \cdot \overline{D} + C \cdot \overline{D} + B \cdot \overline{C} \cdot D + \overline{B} \cdot C + A

段 e

段 e 在 0、2、6、8 时点亮,在 1、3、4、5、7、9 时熄灭。卡诺图给出:

e=B‾⋅D‾+C⋅D‾e = \overline{B} \cdot \overline{D} + C \cdot \overline{D}

注意两个项都共享 D‾\overline{D}——等价地,e=D‾(B‾+C)e=\overline{D}(\overline{B}+C)。在此输入约定下,偶数是段 e 点亮的必要条件,但不是充分条件:数字 4 的 D=0D=0,而 e 仍然熄灭。因式分解形式可使用一个 OR 后接一个 AND,再加上所需的反相。

段 f

段 f 在 0、4、5、6、8、9 时点亮,在 1、2、3、7 时熄灭。卡诺图给出:

f=A+B⋅C‾+C‾⋅D‾+B⋅D‾f = A + B \cdot \overline{C} + \overline{C} \cdot \overline{D} + B \cdot \overline{D}

段 g

段 g——中间横段——在 2、3、4、5、6、8、9 时点亮,在 0、1、7 时熄灭。卡诺图给出:

g=A+B⋅C‾+C⋅D‾+B‾⋅Cg = A + B \cdot \overline{C} + C \cdot \overline{D} + \overline{B} \cdot C

这些表达式是在所述高电平有效和无关项假设下的一种有效最小化结果。等价的最小形式可能看起来不同,商用译码器的内部网络也不必与这种教材式积之和相同。

共阳极与共阴极

七段显示器本身有两种物理接线方式。二者的区别在于每个 LED 的哪一侧与单个公共引脚相连。

共阴极

全部七个 LED 的阴极(负端)连在一起,接到连接地的公共引脚。每个阳极单独驱动。要点亮一个段,将其阳极驱动为高电平。

  • **驱动器输出:**高电平有效——1 点亮该段。
  • **真值表解释:**直接与上表一致。
  • **配套芯片:**74LS48——输出为高电平有效。

共阳极

全部七个 LED 的阳极连在一起,接到连接 V_CC 的公共引脚。每个阴极单独驱动。要点亮一个段,将其阴极拉低。

  • **驱动器输出:**低电平有效——0 点亮该段。
  • **真值表解释:**反转每一个输出列。
  • **配套芯片:**74LS47——输出为低电平有效(开集电极)。

在布尔层面,改变极性可由输出反相表示。在物理硬件中,应选择能够提供或吸收所需电流的驱动器,并在每条点亮段的电流路径中放置限流元件。绝不可将 LED 段直接接到不受限制的电压源。

74LS47 与 74LS48

74LS47 和74LS48 是 TTL BCD 至七段译码器/驱动器功能器件。它们是有用的参考,但应从数据手册中选择并接线准确的可订购器件,而不能把名称视为只在极性上不同的可直接替换抽象。

芯片输出极性显示器类型
74LS47低电平有效(开集电极)共阳极
74LS48高电平有效(带内部上拉)共阴极

经典器件的引脚命名通常将 A 标为最低有效 BCD 输入,D 标为最高有效位。本文方程则约定 A 为 MSB、D 为 LSB。在将方程用于 74LS47/48 引脚级设计前,必须先对应调整变量名称。

两种芯片还都包含三个有用的辅助输入:

  • **LT(灯测试):**拉低时,无论 BCD 输入为何,均强制点亮全部七个输出。用于验证每个 LED 是否正常。
  • RBI(波纹消隐输入):与 BCD 输入 0000 一同拉低时,使显示器熄灭而不是显示 0。用于抑制多位显示器中的前导零——00073 变为 73 。
  • **BI/RBO(消隐输入 / 波纹消隐输出):**用于覆盖消隐和波纹消隐链的双功能引脚。其行为取决于其他控制输入;应遵循器件功能表,而非将其视为普通的双向逻辑引脚。

这三个引脚组合起来,便可将多个译码器/显示器对级联成多位数字显示器,其中前导零会自动消失。

无效 BCD 输入(1010–1111)的行为由芯片定义,并产生有其特性的非数字段图样——可作为调试信号,但不可移植。

现实应用

BCD 至七段译码常见于带有数字显示的设备:

  • 数字时钟——计数器或存储的时间数字送入组合段生成逻辑,通常再经由多路复用驱动器。秒和分需要模 60 行为,通常分解为个位和十位数字。
  • 计算器和仪表——多个数字可能通过多路复用共用段驱动。控制器一次选择一个数字及其段模式。刷新率、峰值电流、占空比、亮度和鬼影必须一并设计。
  • 多位电压表与频率计数器——计数器为 BCD 编码寄存器提供输入,寄存器送入译码器,译码器点亮各段。
  • 记分牌和里程表——采用相同的多路复用技巧,通常配合更明亮的 LED 阵列。

在 DigiSim 中构建

打开DECODER 元件,查看通用译码器这一构建块。对于 BCD 至七段这一特定场景,可以放置一个内置转换功能的 DIGIT_DISPLAY,也可以手工构建译码器,再将七个输出接到 SEVEN_SEGMENT_DISPLAY。

将四个输入开关接为 A、B、C、D(从最高有效位到最低有效位)。先用上述方程实现段 a:

  1. 两个 AND 门:一个实现 B⋅DB \cdot D,另一个实现 B‾⋅D‾\overline{B} \cdot \overline{D}。
  2. 一个四输入 OR,将 AA 、 CC 和两个 AND 输出合并。

在 BCD 代码 0–9 间切换开关,验证段 a 在正确情形下点亮。随后按上述方程添加 b 至 g 段。

最后测试编码 10–15。若将其作为无关项,应记录实际显示图样,并确认显示器可见时上游逻辑会阻止这些编码。若设计需要故障指示,则应以明确定义的空白或错误字形替代无关项,并重新化简。

组合逻辑路线的后续文章 BCD:二进制编码十进制基础介绍 BCD 加法、结果超出有效 BCD 数字或产生十进制进位时的加 6 校正,以及压缩与非压缩 BCD 存储。配合驱动七段显示器的译码器与编码器阅读,可系统理解少量二进制输入如何在多种显示图样中选择一种。

参考资料

将想法变成真正可运行的电路。