组合逻辑:译码、编码、选择与加法
1. 设计动机
"组合逻辑(Combinational Logic)"指输出只由当前输入决定、不含记忆的电路。工程里反复出现四种需求:地址→选通某一路(译码)、多片数据→挑一路送出去(选择/MUX)、两数比大小(比较)、两数相加(加法)。
每次都从门开始搭太累,于是芯片厂把这些常用结构做成标准模块。理解它们的内部结构、延迟和资源权衡,是画任何数字系统框图的基础。
本章讲四类最常用的组合模块:加法器(Adder)、译码器(Decoder)、多路选择器(Multiplexer, MUX)、比较器(Comparator)。它们是 CPU、数据通路、地址译码的积木。
2. 原理与逻辑图
2.1 全加器 Full Adder
一位全加器输入 (低位进位),输出和 、进位 :
把 4 个全加器串起来,低位的进位输出接高位的进位输入,就是 4 位行波进位加法器。
2.2 译码器 Decoder
位地址输入, 条输出,同一时刻只有被选中的那一条为有效电平。3-8 译码器(如 74HC138)把 3 位地址翻译成 8 条片选之一,是存储器/外设地址译码的核心。注意 74HC138 的 8 条输出 和使能端 均为低电平有效——未选中时输出为高,选中时才拉低。
2.3 多路选择器 MUX
路数据输入 + 路选择输入,由选择信号挑一路送到输出。它既是"数据开关",也是"用数据实现任意逻辑函数"的工具(把真值表填在 D 输入上即可)。
2.4 比较器 Comparator
比较两个 位二进制数 ,输出 、、 三个标志。从最高位逐位比较:高位先分出大小,相等才继续比低位。
3. 静态分析(真值表)
全加器真值表:
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
3-8 译码器真值表(E=1 使能):
| A2 A1 A0 | 有效输出 |
|---|---|
| 000 | Y0=1 |
| 001 | Y1=1 |
| 010 | Y2=1 |
| 011 | Y3=1 |
| 100 | Y4=1 |
| 101 | Y5=1 |
| 110 | Y6=1 |
| 111 | Y7=1 |
4. 动态分析(进位传播延迟)
行波加法器的延迟是"逐位等进位"。最低位算完,进位才到第二位;第二位算完,进位才到第三位…… 位加法器总延迟约 倍全加器进位延迟。下面用 4 位加法器、输入 0111 + 0001(即 7+1,进位一路翻转)示意各位 S 与进位 C 的到达时刻:
S3 和 C4 要等到第 4 级才稳定——这就是行波加法器的速度瓶颈。快加法器(超前进位 Carry-Lookahead)用额外逻辑提前算出所有进位,把延迟从 降到 。
5. 运算结构与资源权衡
- 加法器级数:行波进位省门但慢;超前进位快但门数多。 位时 trade-off 明显。
- 译码器扩展:2 片 3-8 译码器可拼 4-16,用最高位做片选。
- MUX 做逻辑:一个 MUX 能实现任意 变量函数——把真值表的输出直接接在数据端。这是 FPGA LUT 的原理。
- 比较器级联:多片 4 位比较器可级联成 8/16 位,高位输出决定结果,低位只在高位相等时起作用。
6. 元件取值与工程权衡
- 分立 vs 集成:小逻辑(几门)用 74HC 系列搭;数据通路/宽位运算直接用 FPGA/ASIC 综合,不手焊门。
- 加法器位宽:按运算量程选,多余位会拖慢进位链。带符号运算注意补码符号扩展。
- 译码器使能端:利用使能 E 做片选/级联,别浪费成接地。
- MUX 宽度:选择信号 位数 = ,8 选 1 需要 3 位选择线。
7. 完整设计示例
- 需求:输入 4 位 BCD(0000~1001),输出 7 段 LED 的 a~g 段亮灭。
- 列真值表:0 显示
abcdef亮(g 灭),1 显示bc亮……1010~1111 是无关项。 - 化简:用卡诺图圈出每一段的与项,如共阴接法段 在数字 0/2/3/5/6/7/8/9 点亮,故 。
- 实现:综合成组合逻辑块,输入 BCD,输出 7 位段码。
- 验算:输入
0011(3) 应显示 a,b,c,d,g → 段码1111001。 - 注意:七段码共阴/共阳接法输出极性相反,选型时确认。
8. 仿真与实验
在 Logisim 中:
- 搭 4 位行波加法器,输入两组拨码开关,输出接 LED,验证 3+5=8、7+1=8(看进位)。
- 拖出 74HC138 风格 3-8 译码器,输入拨码,观察同一时刻只有一条 LED 亮。
- 搭 4 选 1 MUX,用 S1S0 选择 D0~D3 中的哪路送到 Y。
- 用 4 位比较器比较两个开关数,观察 A>B/A=B/A<B 哪个 LED 亮。
扩展与变种电路
扩展1:3 线-8 线译码器 3-to-8 Decoder
地址译码的主力:3 位地址翻译成 8 条独热(one-hot)片选,常配使能端做级联。
- 内部由 8 个 3 输入与门组成,每个与门对应一个最小项;地址码选中哪个最小项,对应输出变高。
- 使能 E=0 时所有输出强制无效,可用来做片选或扩成 4-16 译码器。
- 用途:存储器地址译码(选通哪颗 RAM)、LED 数码位选、数据分配器。
设计要点:n 位地址译出 条线;3-8 是 74HC138 标准。取值/对比:译码器 vs MUX——译码器是"一根线选通",MUX 是"多路选一路",二者对偶。适用:地址译码、片选;不适用:数据路由(那是 MUX 的活)。
- 现象:两片 3-8 拼 4-16,地址高位一切换,两片同时输出有效,总线冲突。
- 原因:高位地址应反相后分别接两片的使能,让任一时刻只使能一片。
- 解决:最高位 A3 直接接第 0 片 E,A3 反相接第 1 片 E,保证互斥。
扩展2:4 选 1 多路选择器 4-to-1 MUX
用 2 位选择信号从 4 路数据里挑一路输出,是数据路由和"用数据实现逻辑"的核心。
- 。
- S1S0=00 选 D0,01 选 D1,10 选 D2,11 选 D3。
- 用 MUX 实现逻辑:把 2 个变量接选择端 S1S0,另 2 个变量的组合值(0/1)接到 D0~D3,即可实现任意 4 变量函数,无需额外门。
设计要点:MUX 是 FPGA LUT 的物理原型。取值/对比:分立用 74HC153(双 4 选 1);宽数据通路用 FPGA 综合。适用:数据多路切换、函数发生器;不适用:高速并行(MUX 是串行选一路)。
- 现象:切换 S1S0 瞬间,输出 Y 出现极窄毛刺。
- 原因:各路 D 到达 MUX 时间不等,切换选择时旧路先断、后路未到,中间出现竞争。
- 解决:MUX 输出后接一级寄存器同步采样;不要把 MUX 输出直接当时钟。
扩展3:4 位数值比较器 4-bit Comparator
从最高位逐位比较两个数,输出三态标志,常用于量程判断、阈值比较。
- 逐位异或判等:。
- 大于/小于从最高位优先: 当 ,或 且 ,依此类推。
- 级联:高位不等时直接定结果,低位输入仅在高位全相等时有效。
设计要点:比较器 = 异或 + 与/或树。取值/对比:分立用 74HC85(4 位比较器);宽位用 FPGA。适用:阈值报警、排序、地址匹配;不适用:浮点比较(需专用 IP)。
- 现象:两个负数比较结果反了。
- 原因:比较器默认无符号,把补码最高位当成普通数值位,负数最高位为 1 被当成大数。
- 解决:有符号比较时最高位要单独处理符号,或直接选带符号比较的 IP。
9. 常见坑与故障现象
- 行波加法器进位没算完就读结果:高速时钟下,加法结果还在"行波"传播,寄存器已经沿采样,读到中间错值。要么降频,要么换超前进位加法器。
- 译码器使能悬空:E 悬空可能被噪声随机使能,两片外设同时被选中、总线打架。使能端必须接死。
- MUX 输出直接接时钟:切换瞬间的毛刺被当时钟沿,触发器误触发。MUX 输出只能接数据端。
- 比较器位宽不够:只比低 4 位,高 4 位不同却判相等。比较器必须从最高位开始。
10. 自测题
4 位行波加法器做 7+1(0111+0001),为什么 S3 和最终进位 C4 最晚才出来?
进位从 FA0 开始逐位"行波":FA0 算出 C1 才能算 FA1,FA1 算出 C2 才能算 FA2……S3 依赖 C3,C4 依赖 S3 的进位链。位数越高,等待前面进位的时间越长,所以最高位和最终进位最晚稳定。
用一个 8 选 1 MUX 能实现任意 3 变量逻辑函数吗?怎么接?
能。把 3 个变量 A/B/C 接选择端 S2/S1/S0,把真值表里每个最小项对应的输出值(0 或 1)接到 D0~D7。MUX 直接"查表"输出函数,无需额外门。这正是 FPGA LUT 的原理。
两片 3-8 译码器怎么拼成 4-16?
最高位 A3 直接接第 0 片使能,A3 反相接第 1 片使能。A3=0 时只第 0 片工作(译出 Y0~Y7),A3=1 时只第 1 片工作(译出 Y8~Y15),低 3 位 A2A1A0 两片并联。
11. 参考资料
- M. Morris Mano, Digital Design,组合逻辑模块(加法器、译码器、MUX、比较器)章节
- sources/notes/free-textbooks-digest.md