多路选择器的级联与扩展:路数和位宽怎么长大
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**入门层(beginner)**数字逻辑基础第三十一篇。MUX 基础 和组合数据通路里 MUX 是 2:1、4:1 的小家伙,真实数据通路里常见的是「32 位宽、从 8 个寄存器里选一个」这种大 MUX。这一篇讲它怎么由小 MUX 长出来,以及长在硅上时的代价。
本文要回答的问题
- 「位宽不够」和「路数不够」分别怎么扩展?两者为什么是正交的?
- 怎么用 4:1 搭 8:1、用 2:1 搭 16:1?MUX 树有几级、延迟怎么算?
- 一个很宽的 MUX 在硬件里有哪几种实现(与或、三态、传输门)?
- one-hot 选择和二进制选择各有什么好处?
- RTL 里一个大
case会综合成什么?
一、位扩展:并排,每片管一位
要做一个「4 路 32 位」MUX,而手上只有 4:1 的1 位 MUX——用 32 片,第 i 片的 4 个输入接 4 路数据的第 i 位,32 片的选择端 S1S0 并在一起接同一组选择信号,32 个输出拼起来就是 32 位结果。
关键直觉:选择逻辑只做一次,数据位并排复制。无论多宽,选择信号那一套译码/门控是共享的,增加的只是数据通路的门。这和 加法器位片级联 的「每一位一片、进位串联」不同——MUX 各位之间没有横向依赖,所以加宽只涨面积、不涨延迟。
二、字扩展:叠成 MUX 树增加路数
要从 4 路扩到 8 路、16 路,就把 MUX 分层叠成树。用两级 4:1 搭 8:1:
D0 D1 D2 D3 ─► 4:1 ─┐
S0 S1 ├─► 2:1 ─► Y (S2 选上/下半个树)
D4 D5 D6 D7 ─► 4:1 ─┘
S0 S1- 第一级:两片 4:1 各自从 4 路里按低位
S1S0选出 1 路,得到两个候选; - 第二级:一个 2:1 按新增的最高位
S2从两个候选里二选一。
通用规律:用 k:1 MUX 搭 N:1,树的级数 = logₖ N(用 2:1 搭 16:1 要 4 级)。每一级都带来一层门延迟,所以路数翻倍、选择延迟线性于级数。高位宽又要快时,会用更大的基(如一次 8:1)压层数,或用 one-hot/译码后并行的结构减少串联。
三、宽 MUX 在硅上的三种长相
同一个「N 选 1」功能,物理实现有三类,时序和面积差别明显:
| 实现 | 结构 | 特点 |
|---|---|---|
| 与-或两级(译码+MUX) | select 先译码成 one-hot,每路数据和自己的选择信号相与,再全部相或 | 规则、易布局,N 大时或门输入多、慢 |
| 三态总线 | 每路数据过一个三态缓冲挂同一根线,仅选中路使能 | 线与式、省面积,但要保证同时刻只一个使能,片内已较少、多见于 IO/总线 |
| 传输门树 | CMOS 传输门(pass transistor)搭成选择网络,select 互补控制通断 | 面积小、延迟随串联管数增长,标准单元里常被等效 MUX 替代 |
二进制 select vs one-hot select:二进制选择(log₂N 位)省控制线但要先译码;one-hot(N 位中恰一个为 1)选择本身就是「使能」,无需译码器、路径更短更规则,one-hot 状态机和仲裁常用它,代价是控制线多。
四、RTL 里的大 MUX:case / 三元链 / 索引
// 写法一:索引,最贴近「N 选 1」
assign y = bank[sel];
// 写法二:case(组合逻辑务必 default 全覆盖,避免推断锁存器)
always_comb
unique case (sel)
2'd0: y = a;
2'd1: y = b;
2'd2: y = c;
default: y = d;
endcase
// 写法三:三元运算符链,综合器可重排成平衡树
assign y = (sel==2'd0) ? a : (sel==2'd1) ? b : (sel==2'd2) ? c : d;要点:①组合 always 里每个分支都要给 y 赋值、写 default,否则不完整 case 推断锁存器;②综合器通常不会傻按书写顺序串成长链,而会按时序约束把选择器重排成平衡 MUX 树降延迟(见 STA 里 data path 的优化);③在 FPGA 里大 MUX 落到级联 LUT 和多路选择器原语上,过宽会显著占用布线资源,深而宽的选择往往改用分布式/块存储器查表。
五、数据通路里的典型面孔
- ALU 操作选择:操作码经译码后用一棵 MUX 在「加/与/或/移位」结果间选输出(见组合数据通路);
- 寄存器堆读端口:N 个寄存器按读地址做 N 选 W 位宽 MUX;
- 总线/交叉开关:多主设备到多从设备的大 MUX 矩阵;
- 写回/旁路选择:流水线里从前递、内存、寄存器堆多个来源选一个。
与现有篇目的衔接
总结
一句话总结:扩展 MUX 有两个正交方向——位扩展是「并排复制、每片管一位、选择端共享」,各位之间无横向依赖,加宽只涨面积不涨延迟;字扩展是「分层叠成 MUX 树」,用 k:1 搭 N:1 需要 logₖN 级,路数翻倍则选择延迟随级数线性增长,又宽又快时用更大的基或 one-hot 并行来压层数;同一个 N 选 1 在硅上可由「译码+与或」「三态总线」「传输门树」实现,二进制 select 省线但要译码、one-hot 不译码但控制线多;RTL 里索引/case/三元链都综合为 MUX 网络,组合分支必须 default 全覆盖以免锁存器,综合器会按时序把它重排成平衡树,FPGA 上过宽的 MUX 吃 LUT 和布线、常改由存储查表实现——ALU 输出选择、寄存器堆读口、交叉开关、流水线旁路,都是这套积木的直接组合。
两种扩展常一起用:先按字扩展搭出「N 路 1 位」,再按位扩展复制 W 份,得到「N 路 W 位」。