简述: 启用的高有效二进制译码器将 位编码映射到 个输出中一个被置位的输出;低有效版本反转此约定。普通编码器假定输入是一位有效,优先编码器则为多位有效输入定义胜者。BCD 到七段显示模块是码转换器,而非一位有效译码器,因为多个段输出可以同时有效。
译码器与编码器在紧凑的二进制索引和更宽的信号集之间转换。它们出现在地址选择、指令控制、事件编码、显示逻辑和许多其他接口中。名称描述逻辑方向,但完整接口还需要极性、使能行为,以及无效或同时输入的策略。
本文从布尔表达式出发构建 BCD 转七段显示驱动器,说明共阳极与共阴极显示器的区别、优先编码器及其在中断处理中的作用,并给出在 digisim.io 中实现这些电路的方法。
什么是译码器?
二进制译码器是一种组合电路,将 位输入映射到多达 个输出中的一个选定输出。在下方高有效示例中,选定输出为高,其余为低。真实译码器 IC 通常提供使能,且可能采用低有效输出,此时选定线为低。

一个 2 至 4 译码器:2 位输入选择 4 个输出中哪个为高。输入 10(二进制 2)激活输出 。
2 至 4 译码器:真值表和布尔表达式
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 | 0 | 1 |
每个输出都是输入变量(取反或不取反)的唯一 AND 组合:
规范积之和绘图使用两次反相和四个双输入 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。译码器将每个数字映射到适当段图样:
| 数字 | a | b | c | d | e | f | g | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
| 3 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
| 4 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
| 5 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 6 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 7 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 8 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 9 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
BCD 值 10 至 15 位于十进制数字编码之外。其显示图样由设计决定:应按系统约定定义空白、错误字形、十六进制 A–F 或无关项行为。
推导段输出的布尔表达式
七个段各自都是四个 BCD 输入 、 、 、 的布尔函数。要推导这些表达式,需查看哪些数字点亮各段并写出积之和(或使用卡诺图进行最小化)。
a 段(顶部横段)
a 段在数字 0、2、3、5、6、7、8、9 时亮,在 1 和 4 时灭。列出 的最小项:
用卡诺图最小化后(将 BCD 输入 10–15 视作无关项),可化简为:
或者等价地:( 与 的 XNOR)。
g 段(中部横段)
g 段在数字 2、3、4、5、6、8、9 时亮,在 0、1、7 时灭。最小化表达式为:
或展开为:。
d 段(底部横段)
d 段在数字 0、2、3、5、6、8、9 时亮,在 1、4、7 时灭。最小化表达式为:
其余四段(b、c、e、f)遵循相同流程:列出最小项,决定无效输入策略,在卡诺图上绘制结果,然后提取最小化表达式。商用 74x47/48 系列驱动器实现指定的 BCD 到段行为,但其内部网络不必匹配这些特定方程。
处理无效 BCD 输入
BCD 仅使用输入值 0 至 9,但 4 位输入可以表示 10 至 15。对这些无效输入,显示器应显示什么?常见方法有三种:
- 使显示器空白: 所有段关闭。这给出定义结果,却可能隐藏上游故障,除非另有诊断报告。
- 无关项处理: 将输入 10–15 视为优化自由度。这可简化逻辑,但所得图样未定义,只在这些输入不可能影响显示器时可接受。
- 显示十六进制数字: 对十六进制显示器,输入 10–15 映射到字母 A 至 F,需要额外段图样。
上述表达式采用无关项方法。专门的 BCD 转七段指南推导了全部七个函数,并说明何时这种假设成立。
在 digisim.io 上构建七段驱动器
按以下步骤构建可工作的显示驱动器:
- 放置 BCD 输入。 添加四个 INPUT_SWITCH 组件,标记为 、 、、 。
- 生成反相。 放置四个 NOT 门,产生、、、。
- 构建段逻辑。 对每一段(a 至 g),用 AND 和 OR 门实现其布尔表达式。先从使用上方最小化表达式的 a 段开始。
- 连接显示器。 放置 SEVEN_SEGMENT_DISPLAY 组件,并将每个段输出连接至显示器上对应的段输入。
- 系统测试。 将输入开关切换遍历所有 BCD 值 0000 至 1001,验证每个输入显示正确数字。
若需快捷方式,使用 DIGIT_DISPLAY组件。对于门级练习,应测试全部十个有效数字和全部六个无效编码,而不要在一个可见示例后停止。
什么是编码器?
编码器执行译码器的反向操作。它接收 条输入线(其中至多一条应有效),并产生一个 位二进制编码,标识哪条输入有效。
| 功能 | 译码器 | 编码器 |
|---|---|---|
| 方向 | 二进制编码至一位有效 | 一位有效至二进制编码 |
| 输入 | 位 | 条线 |
| 输出 | 条线 | 位 |
| 示例 | 地址至存储器芯片选择 | 键盘按键至扫描码 |
简单 4 至 2 编码器
基本 4 至 2 编码器有 4 个输入(、 、、)和 2 个输出( 、)。布尔表达式为:
仅当任一时刻恰有一个输入有效时,它才正确工作。若多个输入同时有效,输出将产生歧义。
优先编码器
真实系统中,多个输入可同时有效。优先编码器仅编码优先级最高的有效输入(通常为索引最高者),以消解该歧义。
| 有效 | 编码的输入 | ||||||
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | X | X | 0 | 无 |
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | |
| 0 | 0 | 1 | X | 0 | 1 | 1 | |
| 0 | 1 | X | X | 1 | 0 | 1 | |
| 1 | X | X | X | 1 | 1 | 1 | (最高优先级) |
X 表示“无关项”。只要更高优先级输入有效,就忽略较低优先级输入。有效输出表示是否存在任意有效输入,这对需要区分“输入 0 有效”和“没有输入有效”的下游逻辑很重要。
中断处理中的优先编码器
优先编码器的重要应用之一是中断控制器。在微处理器系统中,多个硬件设备(键盘、网卡、定时器、磁盘驱动器)可通过置位中断请求线同时请求 CPU 响应。
优先编码器可识别最高等级的合格请求并产生其索引。完整中断控制器还会记录待处理事件、应用屏蔽与优先级状态、交付协议定义的中断标识符或向量、跟踪服务,并保留未选中的请求。无状态编码器本身无法使低优先级请求保持待处理。
Intel 8259A 是一种历史控制器示例,结合了请求、屏蔽、服务中、优先级解析与向量生成功能。将整个器件简化为八输入编码器会遗漏这些有状态功能。
在 digisim.io 上构建 3 至 8 译码器
以下是构建完整 3 至 8 译码器的分步指南:
- 放置输入。 添加三个 INPUT_SWITCH 组件,标记为 、 、 。
- 生成反相。 为 、、 放置三个 NOT 门。
- 构建 AND 阵列。 放置八个 3 输入 AND 门。每个门接收原始和反相输入的唯一组合:
- …继续至…
- 添加输出。 将每个 AND 输出连接至 OUTPUT_LIGHT。切换输入时,任意时刻应恰有一个灯亮。
- 添加使能线(可选)。 将每个输出与使能信号做 AND,创建一个启用的译码器,可用于存储器地址译码。
应用
存储器地址译码
在处理器系统中,译码器帮助选择哪个存储器或 I/O 目标响应某地址。连接至两个高位地址位的 2 至 4 译码器可将空间划分为四个相等的 2 的幂区域。其他映射需要额外地址位和访问限定符。若目标共享三态总线,总线控制逻辑必须确保至多一个输出被使能;许多现代片上互连以多路复用响应而非内部三态布线实现。
键盘编码
扫描键盘矩阵产生行/列观测。优先编码器可以有意将若干有效列线缩减为一个索引,但会丢失其他同时按下的键。需要多键无冲的设计会保留并处理完整矩阵状态。电气鬼键、触点去抖、扫描码生成和优先级是独立问题。
显示系统
BCD 到七段转换用于时钟、仪表、家电和记分牌。在复用显示器中,多个数字位置可共享段驱动。控制器呈现一个图样并启用对应数字,然后前进。应从闪烁、相机、亮度、占空比和器件限制选择完整帧及每位刷新率;不存在通用的 1 kHz 阈值。若驱动器和数字选择延迟会造成鬼段,应插入消隐。
CPU 中的指令译码
在小型教学 CPU 中,4 位操作码可馈入 4 至 16 译码器,所选线在取指—译码—执行周期中参与 ALU、寄存器和存储器控制。真实指令译码可以是分级、表驱动、微代码化或分布式的,控制信号通常将操作码信息与时序状态及其他指令字段相结合。
时序与冒险
组合输出不会同时改变。当若干输入位改变时,一个最小项译码器可能短暂选择旧输出、无输出,或在物理硬件中因反相和非反相路径延迟不同而选择意外输出。七段网络可瞬间显示过渡图样。
若消费者同步采样,则使用寄存输入或输出。对于复用显示器,若鬼影重要,应在数字/图样切换期间消隐。对于芯片选择和写使能,应分析冒险并满足目标器件时序要求,而不能仅依赖静态真值表。
练习
- 构建 2 至 4 译码器,使用四个带适当反相的 AND 项。验证每个启用输入组合恰有一个输出为高,禁用时没有输出为高。
- 连接七段显示器,从零实现至少 a 和 g 段的布尔表达式,再将输出连到 SEVEN_SEGMENT_DISPLAY。
- 创建 4 至 2 编码器,将 4 个按钮中哪个被按下编码为 2 位二进制编码。
- 向编码器添加优先逻辑,使同时按下两个按钮时编号更高的按钮胜出。
- 构建带显示的完整 BCD 计数器,将 COUNTER 连接到七段译码器,观察其自动从 0 计数至 9。
继续学习计数器与状态机,为译码器提供计数输入;或者打开AND 门组件参考——每个译码器输出的主要构件。多路复用器解决相反的路由问题,参见多路复用器指南。



