← 返回博客组合逻辑

译码器与编码器:驱动七段显示器

译码器将二进制编码转换为一位有效信号或段输出,编码器则执行反向转换。本文构建 BCD 转七段显示驱动器,并说明优先编码器。

DennyDenny
阅读约需 12 分钟
Chalkboard feature illustration for “译码器与编码器:驱动七段显示器”

简述: 启用的高有效二进制译码器将 nn 位编码映射到 2n2^n 个输出中一个被置位的输出;低有效版本反转此约定。普通编码器假定输入是一位有效,优先编码器则为多位有效输入定义胜者。BCD 到七段显示模块是码转换器,而非一位有效译码器,因为多个段输出可以同时有效。

译码器与编码器在紧凑的二进制索引和更宽的信号集之间转换。它们出现在地址选择、指令控制、事件编码、显示逻辑和许多其他接口中。名称描述逻辑方向,但完整接口还需要极性、使能行为,以及无效或同时输入的策略。

本文从布尔表达式出发构建 BCD 转七段显示驱动器,说明共阳极与共阴极显示器的区别、优先编码器及其在中断处理中的作用,并给出在 digisim.io 中实现这些电路的方法。

什么是译码器?

二进制译码器是一种组合电路,将 nn 位输入映射到多达 2n2^n 个输出中的一个选定输出。在下方高有效示例中,选定输出为高,其余为低。真实译码器 IC 通常提供使能,且可能采用低有效输出,此时选定线为低。

2 至 4 译码器课程

一个 2 至 4 译码器:2 位输入选择 4 个输出中哪个为高。输入 10(二进制 2)激活输出 Y2Y_2 。

2 至 4 译码器:真值表和布尔表达式

A1A_1A0A_0Y0Y_0Y1Y_1Y2Y_2Y3Y_3
001000
010100
100010
110001

每个输出都是输入变量(取反或不取反)的唯一 AND 组合:

Y0=A1‾⋅A0‾Y_0 = \overline{A_1} \cdot \overline{A_0} Y1=A1‾⋅A0Y_1 = \overline{A_1} \cdot A_0 Y2=A1⋅A0‾Y_2 = A_1 \cdot \overline{A_0} Y3=A1⋅A0Y_3 = A_1 \cdot A_0

规范积之和绘图使用两次反相和四个双输入 AND 项。综合后的 ASIC 或 FPGA 可能将相同功能映射为不同的单元或查找表。

扩展至更大译码器

3 至 8 译码器遵循相同布尔模式,具有八个最小项。一般而言,直接积之和形式每个输出有一个最小项。这是教学构造,并非普适物理门数要求;大型译码器通常采用层级结构。

七段显示器

七段显示器使用按数字 8 图样排列的七个 LED 段显示十进制数字。每个段标为 a 至 g:

 ━━━━━(a)
││
(f)   (b)
││
 ━━━━━(g)
││
(e)   (c)
││
 ━━━━━(d)

为显示 0 至 9 的任意数字,我们选择性点亮相应段组合。例如,数字“7”要求 a、b 和 c 段亮,而 d、e、f 和 g 段熄灭。

共阴极与共阳极

七段显示器有两种物理配置,设计驱动电路时这一区别很重要:

  • 共阴: 所有段 LED 共用接地(阴极)连接。其阳极被驱动为高时,该段点亮。在此配置中,译码器输出为高有效:逻辑 1 点亮一段。
  • 共阳: 所有段 LED 共用正电源(阳极)连接。其阴极被拉低时,该段点亮。在此配置中,译码器输出必须为低有效:逻辑 0 点亮一段。

DigiSim 的逻辑七段组件使用高有效段命令。对于物理显示器,输出极性只是接口的一部分:还应提供限流,确认驱动器能否提供或吸收所需电流,并遵守每段及封装功耗限制。

七段译码器并非一位有效译码器

七段译码器与标准二进制译码器根本不同。4 至 16 译码器一次恰好激活一个输出;七段译码器会同时激活多个段(数字“8”点亮全部 7 段)。它是具有 7 个独立输出函数的组合逻辑电路,每个函数均由相同的 4 位 BCD 输入导出。

BCD 转七段:真值表

BCD(二进制编码十进制)使用 4 位表示数字 0 至 9。译码器将每个数字映射到适当段图样:

数字DDCCBBAAabcdefg
000001111110
100010110000
200101101101
300111111001
401000110011
501011011011
601101011111
701111110000
810001111111
910011111011

BCD 值 10 至 15 位于十进制数字编码之外。其显示图样由设计决定:应按系统约定定义空白、错误字形、十六进制 A–F 或无关项行为。

推导段输出的布尔表达式

七个段各自都是四个 BCD 输入 DD、 CC、BB 、AA 的布尔函数。要推导这些表达式,需查看哪些数字点亮各段并写出积之和(或使用卡诺图进行最小化)。

a 段(顶部横段)

a 段在数字 0、2、3、5、6、7、8、9 时亮,在 1 和 4 时灭。列出 a=1a=1 的最小项:

a=D‾ C‾ B‾ A‾+D‾ C‾ B A‾+D‾ C‾ B A+D‾ C B‾ A+D‾ C B A‾+D‾ C B A+D C‾ B‾ A‾+D C‾ B‾ Aa = \overline{D}\,\overline{C}\,\overline{B}\,\overline{A} + \overline{D}\,\overline{C}\,B\,\overline{A} + \overline{D}\,\overline{C}\,B\,A + \overline{D}\,C\,\overline{B}\,A + \overline{D}\,C\,B\,\overline{A} + \overline{D}\,C\,B\,A + D\,\overline{C}\,\overline{B}\,\overline{A} + D\,\overline{C}\,\overline{B}\,A

用卡诺图最小化后(将 BCD 输入 10–15 视作无关项),可化简为:

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

或者等价地:a=D+B+A⊕C‾a = D + B + \overline{A \oplus C}(AA 与 CC 的 XNOR)。

g 段(中部横段)

g 段在数字 2、3、4、5、6、8、9 时亮,在 0、1、7 时灭。最小化表达式为:

g=D+(B⊕C)+(B⋅A‾)g = D + (B \oplus C) + (B \cdot \overline{A})

或展开为:g=D+(B⋅C‾)+(B‾⋅C)+(B⋅A‾)g = D + (B \cdot \overline{C}) + (\overline{B} \cdot C) + (B \cdot \overline{A})。

d 段(底部横段)

d 段在数字 0、2、3、5、6、8、9 时亮,在 1、4、7 时灭。最小化表达式为:

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

其余四段(b、c、e、f)遵循相同流程:列出最小项,决定无效输入策略,在卡诺图上绘制结果,然后提取最小化表达式。商用 74x47/48 系列驱动器实现指定的 BCD 到段行为,但其内部网络不必匹配这些特定方程。

处理无效 BCD 输入

BCD 仅使用输入值 0 至 9,但 4 位输入可以表示 10 至 15。对这些无效输入,显示器应显示什么?常见方法有三种:

  1. 使显示器空白: 所有段关闭。这给出定义结果,却可能隐藏上游故障,除非另有诊断报告。
  2. 无关项处理: 将输入 10–15 视为优化自由度。这可简化逻辑,但所得图样未定义,只在这些输入不可能影响显示器时可接受。
  3. 显示十六进制数字: 对十六进制显示器,输入 10–15 映射到字母 A 至 F,需要额外段图样。

上述表达式采用无关项方法。专门的 BCD 转七段指南推导了全部七个函数,并说明何时这种假设成立。

在 digisim.io 上构建七段驱动器

按以下步骤构建可工作的显示驱动器:

  1. 放置 BCD 输入。 添加四个 INPUT_SWITCH 组件,标记为 DD、 CC、BB、AA 。
  2. 生成反相。 放置四个 NOT 门,产生D‾\overline{D}、C‾\overline{C}、B‾\overline{B}、A‾\overline{A}。
  3. 构建段逻辑。 对每一段(a 至 g),用 AND 和 OR 门实现其布尔表达式。先从使用上方最小化表达式的 a 段开始。
  4. 连接显示器。 放置 SEVEN_SEGMENT_DISPLAY 组件,并将每个段输出连接至显示器上对应的段输入。
  5. 系统测试。 将输入开关切换遍历所有 BCD 值 0000 至 1001,验证每个输入显示正确数字。

若需快捷方式,使用 DIGIT_DISPLAY组件。对于门级练习,应测试全部十个有效数字和全部六个无效编码,而不要在一个可见示例后停止。

什么是编码器?

编码器执行译码器的反向操作。它接收 2n2^n 条输入线(其中至多一条应有效),并产生一个 nn 位二进制编码,标识哪条输入有效。

功能译码器编码器
方向二进制编码至一位有效一位有效至二进制编码
输入nn 位2n2^n 条线
输出2n2^n 条线nn 位
示例地址至存储器芯片选择键盘按键至扫描码

简单 4 至 2 编码器

基本 4 至 2 编码器有 4 个输入(D3D_3、 D2D_2、D1D_1、D0D_0)和 2 个输出(Y1Y_1 、Y0Y_0)。布尔表达式为:

Y1=D2+D3Y_1 = D_2 + D_3 Y0=D1+D3Y_0 = D_1 + D_3

仅当任一时刻恰有一个输入有效时,它才正确工作。若多个输入同时有效,输出将产生歧义。

优先编码器

真实系统中,多个输入可同时有效。优先编码器仅编码优先级最高的有效输入(通常为索引最高者),以消解该歧义。

D3D_3D2D_2D1D_1D0D_0Y1Y_1Y0Y_0有效编码的输入
0000XX0无
0001001D0D_0
001X011D1D_1
01XX101D2D_2
1XXX111D3D_3(最高优先级)

X 表示“无关项”。只要更高优先级输入有效,就忽略较低优先级输入。有效输出表示是否存在任意有效输入,这对需要区分“输入 0 有效”和“没有输入有效”的下游逻辑很重要。

中断处理中的优先编码器

优先编码器的重要应用之一是中断控制器。在微处理器系统中,多个硬件设备(键盘、网卡、定时器、磁盘驱动器)可通过置位中断请求线同时请求 CPU 响应。

优先编码器可识别最高等级的合格请求并产生其索引。完整中断控制器还会记录待处理事件、应用屏蔽与优先级状态、交付协议定义的中断标识符或向量、跟踪服务,并保留未选中的请求。无状态编码器本身无法使低优先级请求保持待处理。

Intel 8259A 是一种历史控制器示例,结合了请求、屏蔽、服务中、优先级解析与向量生成功能。将整个器件简化为八输入编码器会遗漏这些有状态功能。

在 digisim.io 上构建 3 至 8 译码器

以下是构建完整 3 至 8 译码器的分步指南:

  1. 放置输入。 添加三个 INPUT_SWITCH 组件,标记为 A2A_2、 A1A_1、A0A_0 。
  2. 生成反相。 为 A2‾\overline{A_2}、A1‾\overline{A_1}、A0‾\overline{A_0} 放置三个 NOT 门。
  3. 构建 AND 阵列。 放置八个 3 输入 AND 门。每个门接收原始和反相输入的唯一组合:
    • Y0=A2‾⋅A1‾⋅A0‾Y_0 = \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}
    • Y1=A2‾⋅A1‾⋅A0Y_1 = \overline{A_2} \cdot \overline{A_1} \cdot A_0
    • Y2=A2‾⋅A1⋅A0‾Y_2 = \overline{A_2} \cdot A_1 \cdot \overline{A_0}
    • …继续至…
    • Y7=A2⋅A1⋅A0Y_7 = A_2 \cdot A_1 \cdot A_0
  4. 添加输出。 将每个 AND 输出连接至 OUTPUT_LIGHT。切换输入时,任意时刻应恰有一个灯亮。
  5. 添加使能线(可选)。 将每个输出与使能信号做 AND,创建一个启用的译码器,可用于存储器地址译码。

应用

存储器地址译码

在处理器系统中,译码器帮助选择哪个存储器或 I/O 目标响应某地址。连接至两个高位地址位的 2 至 4 译码器可将空间划分为四个相等的 2 的幂区域。其他映射需要额外地址位和访问限定符。若目标共享三态总线,总线控制逻辑必须确保至多一个输出被使能;许多现代片上互连以多路复用响应而非内部三态布线实现。

键盘编码

扫描键盘矩阵产生行/列观测。优先编码器可以有意将若干有效列线缩减为一个索引,但会丢失其他同时按下的键。需要多键无冲的设计会保留并处理完整矩阵状态。电气鬼键、触点去抖、扫描码生成和优先级是独立问题。

显示系统

BCD 到七段转换用于时钟、仪表、家电和记分牌。在复用显示器中,多个数字位置可共享段驱动。控制器呈现一个图样并启用对应数字,然后前进。应从闪烁、相机、亮度、占空比和器件限制选择完整帧及每位刷新率;不存在通用的 1 kHz 阈值。若驱动器和数字选择延迟会造成鬼段,应插入消隐。

CPU 中的指令译码

在小型教学 CPU 中,4 位操作码可馈入 4 至 16 译码器,所选线在取指—译码—执行周期中参与 ALU、寄存器和存储器控制。真实指令译码可以是分级、表驱动、微代码化或分布式的,控制信号通常将操作码信息与时序状态及其他指令字段相结合。

时序与冒险

组合输出不会同时改变。当若干输入位改变时,一个最小项译码器可能短暂选择旧输出、无输出,或在物理硬件中因反相和非反相路径延迟不同而选择意外输出。七段网络可瞬间显示过渡图样。

若消费者同步采样,则使用寄存输入或输出。对于复用显示器,若鬼影重要,应在数字/图样切换期间消隐。对于芯片选择和写使能,应分析冒险并满足目标器件时序要求,而不能仅依赖静态真值表。

练习

  1. 构建 2 至 4 译码器,使用四个带适当反相的 AND 项。验证每个启用输入组合恰有一个输出为高,禁用时没有输出为高。
  2. 连接七段显示器,从零实现至少 a 和 g 段的布尔表达式,再将输出连到 SEVEN_SEGMENT_DISPLAY。
  3. 创建 4 至 2 编码器,将 4 个按钮中哪个被按下编码为 2 位二进制编码。
  4. 向编码器添加优先逻辑,使同时按下两个按钮时编号更高的按钮胜出。
  5. 构建带显示的完整 BCD 计数器,将 COUNTER 连接到七段译码器,观察其自动从 0 计数至 9。

继续学习计数器与状态机,为译码器提供计数输入;或者打开AND 门组件参考——每个译码器输出的主要构件。多路复用器解决相反的路由问题,参见多路复用器指南。

参考资料

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