← 返回博客组合逻辑

多路复用器(MUX)详解:数字系统的数据交通控制器

多路复用器使用 n 条选择线,把 $2^n$ 路输入中的一路连接到单一输出。本文构建 2 选 1 与 4 选 1 MUX,并说明如何将其用作通用函数发生器。

DennyDenny
阅读约需 13 分钟
Chalkboard feature illustration for “多路复用器(MUX)详解:数字系统的数据交通控制器”

概要: 多路复用器使用 nn 位选择码,从 2n2^n 路数据输入中选择一路。对于 4 选 1 MUX,Y=S1‾S0‾D0+S1‾S0D1+S1S0‾D2+S1S0D3Y=\overline{S_1}\overline{S_0}D_0+\overline{S_1}S_0D_1+S_1\overline{S_0}D_2+S_1S_0D_3。把常量接到数据输入端,MUX 就能实现一张真值表;实际 FPGA 的 LUT 则把存储的配置状态与特定于体系结构的选择电路结合起来。

多路复用器用于选择处理器的操作数来源、互连中的响应,以及可编程逻辑中的配置后信号。模拟开关与视频开关解决的是相关路由问题,但其电气行为超出了单比特数字 MUX 的范围。本文将讲解其布尔基础、门级构造、级联方法和函数生成功能。

什么是多路复用器?

多路复用器是一种组合电路,它从若干数据输入中选择一路,并将其转发到一条输出线。选择操作由另一组选择线控制,这组信号编码出与目标输入对应的二进制地址。

对于输入数量为 2 的幂且全部使用的 MUX:

nn 条选择线可以从 2n2^n 路数据输入中选择一路。

一条选择线可寻址两路输入,两条可寻址四路,三条可寻址八路。输入数不是 2 的幂时,可以保留部分选择码不用,或为其定义默认路径;许多实际器件还包含使能或选通端。

带真值表的 4 选 1 多路复用器

4 选 1 多路复用器:两条选择线在四路输入之间作出选择,被选中的输入出现在输出端。

2 选 1 MUX:最简单的数据选择器

2 选 1 MUX 是最基本的构件。它有两个数据输入(D0D_0、D1D_1)、一条选择线(SS)和一个输出(YY)。

选择信号(SS)输出(YY)
0Y=D0Y = D_0
1Y=D1Y = D_1

它的布尔表达式十分直接。设计要求是:S=0S=0 时使 D0D_0 通过,S=1S=1 时使 D1D_1 通过:

Y=S‾⋅D0+S⋅D1Y = \overline{S} \cdot D_0 + S \cdot D_1

一种规范的基本逻辑门实现需要:

  • 一个 NOT 门产生 S‾\overline{S}
  • 两个 AND 门:一个计算 S‾⋅D0\overline{S} \cdot D_0,另一个计算 S⋅D1S \cdot D_1
  • 一个 OR 门把两个 AND 输出合并为最终结果

2 选 1 多路复用器课程

由 AND、OR 和 NOT 门构成的 2 选 1 MUX。S=0 时 D0D_0 通过;S=1 时 D1D_1 通过。

4 选 1 MUX:布尔表达式与门级设计

4 选 1 MUX 有四个数据输入(D0D_0 至 D3D_3)以及两条选择线(S1S_1、S0S_0)。选择线形成一个两位二进制地址,决定哪路输入到达输出。

S1S_1S0S_0输出(YY)
00D0D_0
01D1D_1
10D2D_2
11D3D_3

表中的每一行都对应一个乘积项,其中选择线只“启用”一路数据输入。4 选 1 MUX 的完整布尔表达式为:

Y=S1‾ S0‾ D0+S1‾ S0 D1+S1 S0‾ D2+S1 S0 D3Y = \overline{S_1}\,\overline{S_0}\,D_0 + \overline{S_1}\,S_0\,D_1 + S_1\,\overline{S_0}\,D_2 + S_1\,S_0\,D_3

这个表达式准确说明了所需硬件:

  • 两个 NOT 门,产生 S1‾\overline{S_1} 和 S0‾\overline{S_0}
  • 四个三输入 AND 门,各自用相应的选择组合控制一路数据输入
  • 一个四输入 OR 门,合并全部四个 AND 输出

直接按布尔式绘制的电路包含两个反相、四个乘积项和一次 OR 归约。所谓“七个门”是假定任意三输入和四输入门都各算作一个门;实体标准单元库或 FPGA 可能采用不同方式映射该函数。

展示扩展规律的 4 选 1 多路复用器课程

带函数表与扩展规律的 4 选 1 MUX。nn 条选择线可以从 2n2^n 路输入中选择一路。

在 DigiSim.io 上搭建 4 选 1 MUX

按以下步骤使用分立逻辑门搭建 4 选 1 MUX:

  1. 放置选择线。 将两个 INPUT_SWITCH 元件拖到画布上,分别标记为 S1S_1 和 S0S_0。
  2. 生成反相信号。 放置两个 NOT 门,把 S1S_1 和 S0S_0 分别连接到其中一个,得到 S1‾\overline{S_1} 与 S0‾\overline{S_0}。
  3. 放置数据输入。 添加四个 INPUT_SWITCH 元件,分别标记为 D0D_0、D1D_1、D2D_2 和 D3D_3。
  4. 构建 AND 阵列。 放置四个三输入 AND 门:
    • AND-0:输入为 S1‾\overline{S_1}、S0‾\overline{S_0} 和 D0D_0
    • AND-1:输入为 S1‾\overline{S_1}、S0S_0 和 D1D_1
    • AND-2:输入为 S1S_1、S0‾\overline{S_0} 和 D2D_2
    • AND-3:输入为 S1S_1、S0S_0 和 D3D_3
  5. 合并结果。 放置一个 OR 门,并把四个 AND 输出全部接入。OR 输出就是最终输出 YY。
  6. 添加可视化。 把 YY 连接到 OUTPUT_LIGHT。

切换选择开关,即可把不同数据输入路由到输出。在稳定且有效的选择状态下,只有选中的乘积项被启用,其数据值决定 Y。

级联 MUX:用 4 选 1 单元构建 8 选 1

多路复用器的一项重要特性,是可以通过级联处理更多输入。不必从头设计 8 选 1 MUX,只需用较小单元组合即可。

8 选 1 MUX 需要三条选择线(S2S_2、S1S_1、S0S_0)和八路数据输入(D0D_0 至 D7D_7)。可以用两个 4 选 1 MUX 和一个 2 选 1 MUX 按如下方式构建:

  1. 第一级(两个 4 选 1 MUX):
    • MUX-A 处理 D0D_0–D3D_3,以 S1S_1 和 S0S_0 作为选择线。
    • MUX-B 处理 D4D_4–D7D_7,同样以 S1S_1 和 S0S_0 作为选择线。
  2. 第二级(一个 2 选 1 MUX):
    • MUX-A 的输出连接到最后一级 MUX 的 D0D_0。
    • MUX-B 的输出连接到最后一级 MUX 的 D1D_1。
    • S2S_2 作为最后一级 MUX 的选择线。

当 S2=0S_2 = 0 时,最后一级 MUX 传递 MUX-A 的结果(输入 D0D_0–D3D_3);当 S2=1S_2 = 1 时,则传递 MUX-B 的结果(输入 D4D_4–D7D_7)。较低位选择线 S1S_1 和 S0S_0 决定所选分组中哪一路输入最终到达输出。

这种分层方法可以扩展到任意规模。16 选 1 MUX 可以由两个 8 选 1 MUX 加一个 2 选 1 MUX 构成,也可以让四个 4 选 1 MUX 接入第二级 4 选 1 MUX。

8 选 1 多路复用器课程

带三条选择线的 8 选 1 MUX。它可以由两个 4 选 1 MUX 和一个 2 选 1 MUX 构成。

把 MUX 用作通用函数发生器

只要把 n 个变量连接到选择线,并依照真值表把数据输入接到常量,一个 2n2^n 选 1 MUX 就能实现 n 变量的任意布尔函数。MUX 本身就是逻辑电路,因此这是一种结构化实现,并不意味着可以“免费”获得逻辑。

例如,考虑三变量函数 F(A,B,C)F(A, B, C)。使用 8 选 1 MUX 时:

  1. 把 AA、BB、CC 分别连接到选择线 S2S_2、S1S_1、S0S_0。
  2. 真值表每一行的选择组合都会寻址一路数据输入。如果该行 F=1F=1,就把对应数据输入接 1;如果 F=0F=0,则接 0。

这样,MUX 输出便会复现真值表。FPGA 查找表采用存储的配置位与选择电路,对外提供同样的能力:实现任何不超过 LUT 输入数量的函数。其内部结构与专用级联资源则因器件系列而异。

也可以把一个输入变量接到数据线而非选择线,从而使用较小的 MUX。例如,三变量函数可以由 4 选 1 MUX 实现:只把 AA 和 BB 连接到选择线,再根据需要将各数据输入连接到 0、1、CC 或 C‾\overline{C}。

实例:实现多数函数

三输入多数函数在两个或更多输入为 1 时输出 1,其真值表如下:

AABBCCFF
0000
0010
0100
0111
1000
1011
1101
1111

使用 8 选 1 MUX: 把 AA、BB、CC 连接到 S2S_2、S1S_1、S0S_0。按照 F 列,把数据输入 D0D_0 到 D7D_7 分别连接为:D0=0D_0=0、D1=0D_1=0、D2=0D_2=0、D3=1D_3=1、D4=0D_4=0、D5=1D_5=1、D6=1D_6=1、D7=1D_7=1。除了 MUX 与常量源,不再需要外部数据函数逻辑门。

使用 4 选 1 MUX(简化形式): 把 AA 和 BB 连接到 S1S_1 与 S0S_0,按 ABAB 对真值表行分组:

  • AB=00AB=00:C=0C=0 与 C=1C=1 时 FF 都为 0。连接 D0=0D_0 = 0。
  • AB=01AB=01:C=0C=0 时 F=0F=0,C=1C=1 时 F=1F=1。连接 D1=CD_1 = C。
  • AB=10AB=10:C=0C=0 时 F=0F=0,C=1C=1 时 F=1F=1。连接 D2=CD_2 = C。
  • AB=11AB=11:C=0C=0 与 C=1C=1 时 FF 都为 1。连接 D3=1D_3 = 1。

这样就用更小的 MUX 实现了同一函数,其中 CC 直接连接到两路数据输入。

传播延迟与时序注意事项

与所有实体组合电路一样,MUX 存在传播延迟。在直接的积之和电路图中,选择信号的变化可能依次经过反相器、乘积项与 OR 归约:

tlogical path≈tinvert+tproduct+treductiont_{\text{logical path}}\approx t_{\text{invert}}+t_{\text{product}}+t_{\text{reduction}}

这只是基于拓扑的估算。实际延迟还包括单元选择、输入转换速率、负载、布线、电压、温度,以及所选路径是从数据输入还是选择输入开始。级联选择会增加逻辑级数,但物理上很宽的单级表达式也可能因扇入与布线而变慢。应使用目标器件的时序分析,而不能假设某种拓扑一定比另一种快一倍。

如果新旧数据输入不同,而且内部路径稳定下来的时间不一致,选择信号切换还可能产生短暂的输出脉冲。当结果跨越同步边界时应对其寄存,在规定时间内保持选择信号稳定,并避免把未经限定的 MUX 输出用作时钟或异步写选通。功能仿真可以验证选择逻辑,却未必能模拟实体冒险或延迟。

NN 选 1 MUX 的通用布尔表达式

MUX 的布尔表达式可以推广到任意规模。对于具有选择线 Sn−1,Sn−2,…,S0S_{n-1}, S_{n-2}, \ldots, S_0 和数据输入 D0,D1,…,D2n−1D_0, D_1, \ldots, D_{2^n - 1} 的 2n2^n 选 1 MUX:

Y=∑i=02n−1(Di⋅mi)Y = \sum_{i=0}^{2^n - 1} \left( D_i \cdot m_i \right)

其中 mim_i 是选择变量的第 ii 个最小项。每个最小项都是全部选择变量的乘积;根据 ii 的二进制表示,各变量以原变量或反变量形式出现。例如,在 8 选 1 MUX 中,i=5i=5(二进制 101)对应的最小项是 S2⋅S1‾⋅S0S_2 \cdot \overline{S_1} \cdot S_0。

这个形式清楚表明,MUX 就是最小项之和标准形式的硬件实现。每个布尔函数都有唯一的最小项之和表达式,而把数据输入连接到相应常量,MUX 就能直接实现它。

使能输入

许多商用 MUX IC 包含使能或选通引脚,且常为低电平有效。禁用时的行为取决于具体器件:输出可能被强制为低、强制为高,或在另一类器件中进入高阻态。对于一个抽象的高电平有效使能 E,并规定禁用时强制 Y 为低:

Y=E⋅(S1‾ S0‾ D0+S1‾ S0 D1+S1 S0‾ D2+S1 S0 D3)Y = E \cdot \left(\overline{S_1}\,\overline{S_0}\,D_0 + \overline{S_1}\,S_0\,D_1 + S_1\,\overline{S_0}\,D_2 + S_1\,S_0\,D_3\right)

使能可以简化级联和控制信号限定,但并非每种 MUX 层次结构都需要使能。推挽式 MUX 输出不能误当成三态总线驱动器。

在 DigiSim.io 上搭建级联 MUX 时,可以在最终 OR 输出与使能开关之间添加一个 AND 门,以模拟使能功能。

现实类比:电视输入选择器

例如,四个视频源(游戏机、有线电视盒、蓝光播放器与流媒体设备)需要共享一台电视。MUX 相当于输入选择器:遥控器按钮对应选择线,决定哪个信号源连接到屏幕输出。四个信号源可以持续产生视频数据,但只有被选中的一路经 MUX 送至显示器。

电视输入选择器 MUX 的现实类比

把电视输入选择器理解为 MUX:选择线决定哪个输入源出现在电视上。

多路分配器(DEMUX)

MUX 的相反电路是多路分配器(DEMUX)。MUX 从多路输入中选择一路送往单一输出;DEMUX 则接收单一输入,并根据选择线将其路由到多个输出中的一路。

1 线至 4 线 DEMUX 的布尔表达式为:

Y0=D⋅S1‾⋅S0‾Y_0 = D \cdot \overline{S_1} \cdot \overline{S_0} Y1=D⋅S1‾⋅S0Y_1 = D \cdot \overline{S_1} \cdot S_0 Y2=D⋅S1⋅S0‾Y_2 = D \cdot S_1 \cdot \overline{S_0} Y3=D⋅S1⋅S0Y_3 = D \cdot S_1 \cdot S_0

由此可见,DEMUX 在结构上等同于带使能输入的译码器。当数据输入 DD 充当使能时,选择线上的“地址”决定哪一路输出接收该信号。

1 线至 4 线多路分配器课程

1 线至 4 线 DEMUX:根据两条选择线,把一路输入路由到四路输出中的一路。

多路复用器的应用

多路复用器出现在数字系统设计的每一个层级。下面列出最重要的应用,并说明 MUX 为何不可或缺。

CPU 寄存器文件

在由分立触发器组成的小型寄存器组中,每个异步读端口都可以建模为由寄存器索引选择的字宽 MUX。一个包含八个 8 位寄存器的教学寄存器组,每个读端口需要八组并行的 8 选 1 单比特选择。实体 ASIC 与 FPGA 寄存器文件也可能采用存储器宏、译码字线、位线、专用 RAM 资源或分布式逻辑。MUX 模型描述对外可见的选择行为,并不规定唯一的晶体管拓扑。

ALU 输入选择

ALU 的操作数并不总来自寄存器。有时,操作数是指令中嵌入的立即数,或从存储器读取的数值。在每个 ALU 输入前放置 MUX,控制单元就能选择操作数来源:寄存器文件输出、立即数或存储器数据寄存器。每个 ALU 输入端只需这样一个 MUX,CPU 就能复用同一套 ALU 硬件执行寄存器—寄存器、寄存器—立即数以及存储器—寄存器指令。

存储器地址译码与总线仲裁

当多个目标都可能返回数据时,MUX 可以选择与已译码请求对应的响应。当多个主设备争用同一资源时,仲裁器决定所有权,路由 MUX 则转发被选中主设备的地址、数据和控制信号。MUX 本身不实现公平策略,也不处理请求/授权握手;它只依照仲裁结果路由信号。

FPGA 查找表

FPGA 中常见的逻辑原语是查找表(LUT)。配置状态保存真值表的数值,逻辑输入则选择其中适用的一项。因此,从功能上看,一个 k 输入 LUT 就像由 k 个输入选择的 2k2^k 项真值表。实际 FPGA 系列具有特定于体系结构的 LUT 电路、分裂模式、专用级联多路复用器与布线,所以“一个 64 选 1 MUX”是有用的功能模型,而不是所有器件通用的物理原理图。

实践验证

可在 DigiSim.io 编辑器中搭建以下电路,以验证上述原理:

  1. 用两个 AND 门、一个 OR 门和一个 NOT 门搭建 2 选 1 MUX。 验证全部四种输入组合。
  2. 按照上面的布尔表达式扩展成 4 选 1 MUX。 遍历各个稳定选择组合并探测输出。
  3. 级联两个 4 选 1 MUX 和一个 2 选 1 MUX,构建 8 选 1 MUX。 验证八路输入都能被单独寻址。
  4. 使用 MUX 实现一个布尔函数。 从真值表中任选一个三变量函数,把各数据输入硬连接后编程到 8 选 1 MUX 中。
  5. 搭建 DEMUX 反向执行路由: 把一个信号送往四路输出中的一路。

接下来可以学习译码器与编码器(DEMUX 在结构上的近亲),在取指—译码—执行周期中查看 MUX 如何为 ALU 提供输入,或打开 AND 门元件参考——它是每个 MUX 的主要构件。

参考资料

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