处理器和 FPGA 中的数字电路,都需要按照确定的规则,把二进制输入转换为二进制输出。与门、或门、非门和异或门,就是理解这些规则的基础。通过阅读真值表、组合逻辑门和分析半加器,我们可以看清电路如何做出判断、执行加法,以及 FPGA 如何通过查找表实现逻辑功能。
先看一个简单例子:输入 A 经过非门,连接到输出 Y。当 A 为 0 时,Y 为 1;当 A 变成 1 时,Y 变成 0。在 CircuitVerse 中切换输入,就能观察到这种反转。逻辑门不需要程序循环来告诉它下一步该做什么,输出会按照电路的规则响应输入。
第一章。电路中的零和一,到底是什么意思?
数字逻辑使用两个值:0 和 1。一个二进制数字称为一个比特,也就是一位。在逻辑表达式中,0 可以表示假,1 可以表示真。
在实际电路中,这些值由电信号表示。按照正逻辑约定,低电压表示 0,高电压表示 1。不过,1 并不对应一个统一的电压值。器件会把规定的电压范围识别为有效的低电平和高电平,具体界限取决于器件设计、供电电压和输入规格。
例如,3.3 伏逻辑系统并不要求每个高电平信号都恰好等于 3.3 伏。信号是否有效,取决于它能否满足接收端的输入要求。在保证能识别为低电平和高电平的两个范围之间,信号对应的逻辑值没有保证,但这不代表多出了一种二进制值。
真值表描述逻辑规则,数据手册描述可靠工作所需的电气条件。逻辑仿真主要帮助我们理解前者。
第二章。逻辑门与真值表。
逻辑门按照规定的规则产生输出。通常可以把输入记为 A、B,把输出记为 Y。非门只有一个输入,本文讨论的与门、或门和异或门各有两个输入。
真值表列出所有输入组合,以及每种组合对应的输出。一个二进制输入有两种可能,两个输入有四种组合:00、01、10、11。其中,第一位代表 A,第二位代表 B。三个输入有八种组合;一般来说,n 个二进制输入共有 2ⁿ 种组合。
真值表描述的是信号稳定之后的稳态结果。它并不说明传播延迟、输出电流,也不会显示信号变化期间可能出现的短暂非预期脉冲。
第三章。与门。所有条件都必须成立。
与门的英文名称是 AND。只有所有输入都为 1 时,与门才输出 1。对于双输入与门,A 和 B 必须同时为高电平。
它的逻辑表达式可以写成 Y = A AND B,也可以写成 Y = A · B。在布尔代数中,中间的点表示与运算。按照 00、01、10、11 的输入顺序,输出依次为 0、0、0、1。
例如,一个指示灯只有在“系统已启用”并且“按钮被按下”时才亮起。让 A 表示系统启用状态,B 表示按钮状态,就可以用与门实现这条规则。系统未启用时,单独按下按钮不会点亮指示灯;系统已启用但按钮没有按下时,指示灯也不会亮。
与运算还具有屏蔽作用:A AND 0 始终等于 0,A AND 1 则等于 A。因此,一个输入可以允许另一个输入的逻辑值通过,也可以将其屏蔽。
第四章。或门。至少一个条件必须成立。
或门的英文名称是 OR。只要至少有一个输入为 1,或门就输出 1;只有所有输入都为 0 时,它才输出 0。
逻辑表达式可以写成 Y = A OR B。在布尔代数中,也经常用加号表示或运算,但这里的加号不是算术加法。按照 00、01、10、11 的输入顺序,输出依次为 0、1、1、1。
例如,一个警告指示灯由两个传感器条件控制。任意一个条件成立,都可以触发警告;两个条件同时成立时,警告仍然有效。这种“或”包括两个输入同时为真的情况,因此也称为包含性的或。
需要区分逻辑或与二进制加法:1 OR 1 的结果是单个逻辑值 1,而不是二进制数 10。或门判断的是条件是否满足,并不统计有多少个输入处于有效状态。
第五章。非门。反转逻辑值。
非门的英文名称是 NOT,也称为反相器。它只有一个输入,输出始终与输入的逻辑值相反:输入为 0,输出为 1;输入为 1,输出为 0。
其表达式可以写成 Y = NOT A。在 A 上方加横线,或使用逻辑取反符号,也可以表示相同的运算。
假设 A 表示忙碌状态。在一个简化系统中,如果就绪与忙碌恰好相反,那么 NOT A 就表示就绪。忙碌为 1 时,就绪为 0;忙碌为 0 时,就绪为 1。取反也常用于表达“请求存在,但阻止条件不存在”这样的规则。
非门符号输出端的小圆圈表示取反。将与门的输出取反,就得到与非门 NAND;将或门的输出取反,就得到或非门 NOR。理解这些符号时,关键是记住:非运算会反转逻辑值。
第六章。异或门。两个输入必须不同。
异或门的英文名称是 Exclusive OR,简称 XOR。双输入异或门在两个输入不同时输出 1,在两个输入相同时输出 0。
它的表达式可以写成 Y = A XOR B,也可以写成 Y = A ⊕ B。按照 00、01、10、11 的输入顺序,输出依次为 0、1、1、0。
异或与或运算的关键区别,在于两个输入都为 1 的情况:或门输出 1,异或门输出 0。
在 CircuitVerse 中,可以把同一组 A、B 信号分别连接到与门、或门和异或门,直接比较三种输出。当输入为 00 时,三个输出都为 0;输入为 01 时,与门输出 0,或门和异或门输出 1;输入变为 11 时,与门和或门输出 1,异或门输出 0;输入为 10 时,与门输出 0,另外两个输出 1。最后回到 00,三个输出也都回到 0。整个过程无需改变接线。
对于两个输入,异或可以理解为“恰好有一个输入为 1”,因此能够检测两个二进制位是否不同。
但当多个二进制位连续进行异或运算时,结果表示其中为 1 的位数是否为奇数,这是奇偶校验计算的基础。例如,1 XOR 1 XOR 1 的结果为 1。因此,“恰好有一个输入为 1”的说法,不能直接推广到任意长度的异或门链。
第七章。组合逻辑门,做出判断。
多个逻辑门可以组合起来,表达更复杂的判断规则。考虑三个输入:Enable 表示启用状态,Button 表示按钮状态,Override 表示覆盖控制信号。
要求是:当 Enable 和 Button 同时为 1,或者 Override 为 1 时,输出为 1。表达式为:
输出 = (Enable AND Button) OR Override
电路的连接方式是:Enable 和 Button 接入与门,与门输出接到或门的一个输入,Override 直接接到或门的另一个输入。Override 绕过了与门,因此它可以独立使最终输出变为 1。
在仿真中,可以用三个能够保持状态的输入开关测试这个电路,其中标为 Button 的开关表示按钮的逻辑状态。初始三个输入都为 0,输出为 0。先将 Button 设为 1,输出仍为 0;再将 Enable 设为 1,输出变成 1。把 Enable 恢复为 0,输出随之回到 0。
此时将 Override 设为 1,即使 Enable 为 0,输出也会变成 1。再将 Button 恢复为 0,输出仍保持为 1,因为 Override 仍然有效。最后将 Override 设为 0,三个输入和最终输出便都回到 0。
括号会改变电路含义。如果表达式改成 Enable AND (Button OR Override),那么即使 Override 为 1,Enable 也必须为 1,最终输出才可能为 1。这与前面的规则不同。
这种电路属于组合逻辑:信号稳定后,输出只取决于当前输入,不保存过去的状态。要记住之前发生的事件,需要锁存器或触发器等存储元件。
第八章。用异或门和与门搭建半加器。
逻辑门不仅能做判断,还能执行算术运算。两个一位二进制数相加,会产生一个和位 Sum 和一个进位位 Carry。半加器正是实现这种运算的基本电路。
半加器使用异或门产生和位,使用与门产生进位位:
Sum = A XOR B;Carry = A AND B。
两个逻辑门接收相同的 A 和 B。每个输入信号都分别分支,连接到异或门和与门;异或门的输出接到 Sum,与门的输出接到 Carry。
当 A、B 都为 0 时,Carry 和 Sum 都为 0,按“进位在前、和位在后”的顺序读取,结果为 00。将 B 改为 1,结果变成 01;再将 A 改为 1,Sum 变为 0,Carry 变为 1,结果就是 10。
二进制的 10 表示十进制的 2。也就是说,1 + 1 需要两个二进制位表示结果,进位占据数值权重更高的位置。随后将 B 恢复为 0,A 保持为 1,结果回到 01;再将 A 恢复为 0,结果回到 00。这样就检查了全部四种输入组合。
异或门与与门沿着并行的硬件路径工作,不需要先执行一条异或指令,再执行一条与指令。每条路径都会响应输入,并具有各自的传播延迟。
半加器之所以称为“半”,是因为它没有来自相邻低位的进位输入。全加器会接收这个额外输入。更大的算术电路建立在这些原理之上,并采用经过优化的结构提高性能。
第九章。真实逻辑门的时序与电气限制。
逻辑仿真能够清楚地展示输入与输出之间的关系,但真实硬件还存在电气和时序限制。
传播延迟是从输入发生跳变,到对应输出发生跳变之间的时间。信号经过多个逻辑门时,延迟会沿路径累积。布线和输出负载也会影响时序,因此不能只看逻辑表达式来判断电路的实际速度。
通过不同路径传播的信号,可能在不同时间到达同一个逻辑门。在变化过程中,即使最终结果正确,也可能出现短暂的非预期脉冲,这种现象称为毛刺。
稳态真值表不会描述毛刺,仅靠逻辑仿真也无法验证实际器件的全部电气特性。
组合逻辑本身不需要时钟来根据输入产生结果。在同步系统中,寄存器会在规定的时钟边沿采集结果,相关逻辑必须及时稳定,并满足寄存器的时序要求。这些问题将基本逻辑门与实际的处理器和 FPGA 设计联系起来。
第十章。从逻辑门到 FPGA 查找表。
同一个逻辑功能可以通过不同的物理方式实现。电路板可以使用专门的逻辑门芯片,专用集成电路可以使用标准单元,而 FPGA 可以通过查找表实现逻辑功能。查找表的英文名称是 Lookup Table,简称 LUT。
一个双输入、单输出的查找表存储四个输出位,每种输入组合对应一个。输入信号决定选择哪一个已存储的位,并将其送到输出端。硬件并不是逐行搜索这张表。
按照 00、01、10、11 的输入顺序,与运算对应的输出序列为 0、0、0、1;或运算对应 0、1、1、1;异或运算对应 0、1、1、0。改变存储的值,就能改变查找表实现的逻辑功能。
这些序列表示的是真值表的行顺序,并不是某个厂商规定的配置字面值。实际输入编号与配置位之间的映射关系,需要以器件文档为准。
一个六输入、单输出的查找表存储 64 个输出位,可以实现输入数量不超过六个的任意布尔函数。当一个逻辑功能能够容纳在单个查找表中时,综合工具可能把多个逻辑门合并进去。因此,电路图上画出的三个逻辑门,并不一定对应三个独立的 LUT。
FPGA 还包含寄存器、布线资源、进位电路、存储器等。查找表是其中的核心组成部分,但不是整个器件的全部。
结论。从简单规则到实用硬件。
与运算要求所有输入为 1,或运算要求至少一个输入为 1,非运算反转逻辑值,双输入异或运算检测两个输入是否不同。真值表把这些规则完整地列出来,逻辑门的连接方式则把规则变成控制电路和算术硬件。
从基本逻辑门到半加器,再到 FPGA 查找表,核心都是建立明确的输入与输出关系。实际硬件还需要考虑电压范围、负载和传播延迟。理解这些基础,就能进一步认识 FPGA 如何利用可配置的硬件资源实现数字电路。
