← 返回博客数字比较器

数字比较器详解:相等与大小

推导相等比较器和大小比较器,级联 4 位模块,区分有符号与无符号排序,并验证大于、等于和小于输出。

DennyDenny
阅读约需 7 分钟
Chalkboard feature illustration for “数字比较器详解:相等与大小”

简述: 相等性是逐位 XNOR 结果的归约 AND。无符号大小由 A 与 B 不同的最高有效位决定。有符号大小需要对符号位作不同解释,或解释减法标志。只有当位宽、有无符号性、输出极性和级联输入均已定义时,比较器才是正确的。

比较器将两个位向量转换为一种关系:

A < B, A = B, or A > B

这听起来没有歧义,直到相同的位被赋予不同解释。在四位中,1000 无符号时为 8,但在二进制补码中为 -8。与 0111 比较时,按无符号解释它较大,按有符号解释它较小。

本指南先构建相等比较,再推导无符号大小网络,最后说明有符号比较和模块级联如何改变设计。

定义约定

对于两个有效的 nn 位输入 A 和 B,三输出大小比较器通常产生:

  • G:A 大于 B;
  • E:A 等于 B;
  • L:A 小于 B。

在有效的二值输入模型下:

G+E+L=1G+E+L=1

且不会有两个输出同时为高。这种独热关系依赖于完整的实现和有效逻辑电平。使能输入、低有效接口、未知仿真值或未正确初始化的级联输入都可能改变可见行为。

相等性不依赖有无符号性:位向量要么匹配,要么不匹配。大于和小于则依赖于此。

用 XNOR 实现相等比较

对于一个位位置:

Ei=Ai⊙Bi=Ai⊕Bi‾E_i=A_i\odot B_i=\overline{A_i\oplus B_i}

当两个位相同时,Ei=1E_i=1 。仅当所有位位置均匹配时,整个字才相等:

E=⋀i=0n−1EiE=\bigwedge_{i=0}^{n-1}E_i

对于四位:

E=(A3⊙B3)(A2⊙B2)(A1⊙B1)(A0⊙B0)E=(A_3\odot B_3)(A_2\odot B_2)(A_1\odot B_1)(A_0\odot B_0)

直接原理图使用四个 XNOR 门,随后进行 AND 归约。

人们很容易称其为“无论位宽如何都只有两个门延迟”。那只是一个扇入无限制的布尔级绘图。物理实现可以将归约构造成平衡树、分解为复合单元,或映射至 FPGA 查找表。使用双输入 AND 门时,平衡归约的深度大约随 ⌈log⁡2n⌉\lceil\log_2 n\rceil 增长。

无符号大小:最高位差决定结果

对每一位定义:

Gi=AiBi‾G_i=A_i\overline{B_i} Li=Ai‾BiL_i=\overline{A_i}B_i Ei=Ai⊙BiE_i=A_i\odot B_i

在最高的不同位位置,A 为 1 而 B 为 0 意味着 A 较大;相反则意味着 A 较小。只有当所有更高位均匹配时,较低位才重要。

对于四位无符号值:

G=G3+E3G2+E3E2G1+E3E2E1G0\begin{aligned} G={}&G_3 +E_3G_2 +E_3E_2G_1 +E_3E_2E_1G_0 \end{aligned} L=L3+E3L2+E3E2L1+E3E2E1L0\begin{aligned} L={}&L_3 +E_3L_2 +E_3E_2L_1 +E_3E_2E_1L_0 \end{aligned} E=E3E2E1E0E=E_3E_2E_1E_0

每个 G 项的意思都是“所有更高位打平,且 A 在此位胜出”。每个 L 项表达对称情形。

无符号示例

比较:

A = 0110 (6)
B = 0101 (5)

第 3 位和第 2 位匹配。第 1 位处,A 为 1 而 B 为 0,因此 G1=1G_1=1 。第 0 位无关紧要,因为更高有效位的差异已存在:

G=1, E=0, L=0

这是一项优先级功能,但优先级从最高有效数据位向最低有效数据位运行。

递归比较器单元

与其展开长长的积之和,不如按层级组合各组。假设 H 描述高位组,Lw 描述低位组:

Gall=GH∨(EH∧GLw)G_{\text{all}}=G_H\lor(E_H\land G_{Lw}) Eall=EH∧ELwE_{\text{all}}=E_H\land E_{Lw} Lall=LH∨(EH∧LLw)L_{\text{all}}=L_H\lor(E_H\land L_{Lw})

高位组决定结果,除非它相等;仅在那时低位组才会传递。这个具有结合式特征的组合可形成线性级联或平衡层级。

这些方程解释了 4 位大小比较器 IC 上的扩展输入。该模块在其本地四位相等时,需要低位的 G/E/L 结果。

级联 SN74LS85 模块

SN74LS85 对两个 4 位纯二进制或 8-4-2-1 BCD 字进行比较,并提供三个扩展输入和三个关系输出。

对于八位比较:

  1. 低位器件比较位 3:0。
  2. 将其扩展关系初始化为相等:G_in=0, E_in=1, L_in=0 。
  3. 将其 G/E/L 输出连接至高位器件的对应扩展输入。
  4. 高位器件比较位 7:4 并产生最终结果。

若高半部分不同,本地判定会覆盖低位输入。若高半部分匹配,低位关系便传播。

必须严格遵循数据手册中关于引脚极性、扇出、电压和时序的说明。逻辑递归不能替代电气设计。

有符号二进制补码比较

相等比较对有符号和无符号值使用同一个 XNOR 网络。排序则不同。

方法 1:分别解释符号位

令 sA=An−1s_A=A_{n-1}、sB=Bn−1s_B=B_{n-1}。

  • 若 sA≠sBs_A\ne s_B,符号位为 1 的操作数较小。
  • 若符号相同,对剩余关系作普通的字典序比较即可得到正确排序。

一个方便的硬件变换是在将每个操作数送入无符号比较器之前,反转其 MSB:

A′=A⊕2n−1A'=A\oplus 2^{n-1} B′=B⊕2n−1B'=B\oplus 2^{n-1}

翻转符号位会将二进制补码排序偏置为无符号排序。对于四位:

signed -8 = 1000  → biased 0000
signed -1 = 1111  → biased 0111
signed  0 = 0000  → biased 1000
signed +7 = 0111  → biased 1111

现在,偏置后的值按与有符号数相同的顺序递增。

方法 2:减法并解释标志

若 ALU 计算 R=A−BR=A-B:

  • E 是 Z;
  • 有符号 L 是 N⊕VN\oplus V;
  • 有符号 G 是 Z‾∧N⊕V‾\overline Z\land\overline{N\oplus V}。

无符号小于取决于减法进位约定。若原始进位输出表示未借位,无符号 L 为 C‾\overline C。若采用类似 x86 的借位标志,无符号 L 为 C。CPU 标志指南推导了两种约定。

不要只用 N 表示有符号小于条件不能只使用 N。一次有符号溢出可能反转所存储结果表面上的符号。

两种解释相反的示例

A = 1000
B = 0111

无符号:

8 > 7

二进制补码有符号:

-8 < +7

一个只标注为“A>B”的比较器,在有无符号性明确前并没有足够的规格定义。

时序和实现选择

线性优先级链的深度与位宽成正比。平衡的组组合网络可以降低逻辑深度。综合可能采用:

  • 宽门或复合门;
  • 类前缀的相等/大于组合;
  • ALU 中已存在的减法硬件;
  • FPGA 进位链或查找表资源;
  • 面向特定用例的提前终止结构。

没有任何一种拓扑总是最快。在一种设计中,专用比较器可避免等待算术结果;在另一种设计中,复用加法器可能节省面积。现代处理器还会将比较分散到分支、地址生成、向量及其他执行逻辑中,而不是实现一个单体比较器。

时序路径包括源寄存器的时钟到 Q、输入选择、比较器逻辑、布线、目标建立时间和时钟效应。仅凭门计数无法确定最高频率。

实际用途

精确地址匹配

当地址等于固定值时,相等比较器可产生芯片选择信号。对于按 2 的幂对齐的区域,只需比较高位地址位,并将低位视作偏移量。任意范围则可能使用不等式或分解后的译码逻辑。

总线正确性不止取决于相等性:使能、访问类型、特权和互斥所有权也可能共同限定该选择信号。

阈值和窗口检查

控制逻辑可借助两个大小比较测试:

LOW≤X≤HIGHLOW\le X\le HIGH

必须明确端点是包含还是排除,以及 X 是否有符号。

最小/最大值与比较-选择

大小结果可以驱动复用器:

min = (A < B) ? A : B
max = (A < B) ? B : A

当每个值携带元数据,或需要稳定排序时,处理相等情况的策略至关重要。

排序网络

比较-交换单元将一个比较器与数据路由复用器结合。固定网络分阶段组合这些单元。其延迟取决于比较器深度和比较-交换级数,而不仅是单元数量。

在 DigiSim 中构建并验证

以比较器组件为参考,再用逻辑门构建方程:

  1. 用 XNOR 构建四个 EiE_i 信号。
  2. 将它们归约为 E。
  3. 为每个位位置构建 GiG_i 和 LiL_i 。
  4. 从 MSB 到 LSB 组合它们。
  5. 断言每一对有效输入恰有一个 G/E/L 为高。
  6. 添加 MSB 偏置选项,以在无符号和有符号比较间切换。

在四位下穷举测试很实用:评估全部 16×16=25616\times16=256 对输入。

对于每一对,检查:

  • E 等于位向量相等性;
  • 无符号 G/L 与整数 0–15 一致;
  • 有符号 G/L 与整数 -8–7 一致;
  • 交换 A 和 B 会交换 G 和 L,但保持 E;
  • G、E、L 两两互斥且共同穷尽。

然后级联两个四位模块,并以 0x0F/0x10 、 0x7F/0x80 以及高半部分相等而低半部分不同等边界输入对为目标。

功能仿真器能够确立布尔关系;它不能确立最终工艺中的物理传播延迟、电气兼容性或时序收敛。

参考资料

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