进阶 #hardware

比较器

比较器(Comparator)是判断两个二进制数大小或相等关系的组合逻辑电路

什么是比较器?

你在淘宝上搜商品时,可以按”价格从低到高”排序。这个排序靠的是什么?靠的是比较——判断两个数哪个大、哪个小、是否相等。

比较器(Comparator) 就是数字电路中用来做这件事的。它比较两个二进制数,输出它们的大小或相等关系。

1 位相等比较器

先看最简单的:比较两个1 位二进制数 A 和 B 是否相等。

真值表:

ABA = B
001
010
100
111

你可能会认出来——这就是 XNOR(异或非) 门:A XNOR B = NOT (A XOR B)。两个输入相同则输出 1,不同则输出 0。

graph LR
    A[A] --> XOR[XOR]
    B[B] --> XOR
    XOR --> NOT[非门]
    NOT --> EQ[输出<br>A = B]

💡 为什么不用简单的导线? 你可能会想”A 和 B 连在一起,相等就输出 1 不就行了?“但问题是 A 和 B 是两个独立的信号——A=0,B=0 和 A=1,B=1 都是”相等”,不能简单地用一根导线判断。

1 位大小比较器

除了判断相等,有时还要知道哪个大。1 位比较器可以同时输出三种结果:

ABA>BA=BA<B
00010
01001
10100
11010

逻辑表达式:

  • A>B = A AND (NOT B)
  • A=B = A XNOR B
  • A<B = (NOT A) AND B

看,一个简单的与非门组合就实现了大小判断。

N 位比较器

实际应用中很少只比较 1 位——通常是比较两个 N 位二进制数(比如两个 8 位数)。

相等判断

N 位相等判断非常简单:逐位比较,所有位都相等才输出 1。用与门把每位的 XNOR 结果连接起来即可。

graph LR
    A0[A₀] --> XNOR0[XNOR 位 0]
    B0[B₀] --> XNOR0
    A1[A₁] --> XNOR1[XNOR 位 1]
    B1[B₁] --> XNOR1
    A2[A₂] --> XNOR2[XNOR 位 2]
    B2[B₂] --> XNOR2
    A3[A₃] --> XNOR3[XNOR 位 3]
    B3[B₃] --> XNOR3

    XNOR0 --> AND[与门]
    XNOR1 --> AND
    XNOR2 --> AND
    XNOR3 --> AND
    AND --> EQ[A = B]

大小判断

N 位大小比较器需要级联设计——从最高位开始比较:

  1. 比较最高位(MSB):如果 Aₙ > Bₙ,则 A > B,停止
  2. 如果最高位相等,比较次高位
  3. 以此类推,直到某一位分出大小,或所有位都相等

这个过程就像字典里比较两个单词——先比第一个字母,相同再比第二个,直到找到不同。

实际应用

应用说明
排序排序算法需要比较元素大小
条件分支CPU 中的条件判断(if-else)依赖比较器
地址匹配缓存中判断地址是否命中
边界检查判断一个数是否在有效范围内
密码验证判断输入的密码是否与存储的密码相等

小结

比较器用基本的与或非门就能判断两个数的大小和相等关系。它是排序和条件判断的基础,在 CPU 的 ALU 中也有重要应用(为标志位生成提供比较结果)。接下来,我们将学习另一种”存”的电路——比 D 触发器更强大的 JK 触发器与 T 触发器