逻辑门基础:与门、或门、非门、与非门、或非门、异或门
各位同学,咱们今天聊聊最基础的东西——逻辑门。你可能觉得这太简单了,不就是几个门电路嘛。但我跟你说,我做了十几年数字电路设计,见过太多工程师在复杂系统里栽跟头,追根溯源,往往是对这些基本门的理解不够透彻。说白了,整个数字世界,就是由这些门搭起来的。
1. 与门(AND Gate)
与门的逻辑,用大白话说就是「全1出1,有0出0」。两个输入都是高电平,输出才是高电平。我在项目中遇到过一个小问题:一个使能信号和时钟信号做了与门,结果使能信号有毛刺,导致时钟被切出了短脉冲。嗯,从那以后我对与门的输入信号质量就特别敏感。
| A | B | Y = A & B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
电路符号上,与门是一个平头形状,左边两个输入,右边一个输出。我个人习惯在原理图上把与门画得稍微大一点,方便看走线。
2. 或门(OR Gate)
或门正好反过来——「有1出1,全0出0」。只要有一个输入是高电平,输出就是高电平。你想想看,这像不像并联开关?任何一个开关闭合,灯就亮。
| A | B | Y = A | B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
电路符号是弧形头,有点像子弹头。我建议你在画或门的时候,注意输入端的圆弧要平滑,不然仿真器可能会报warning。
3. 非门(NOT Gate / 反相器)
非门最简单,就一个输入一个输出,输出是输入的取反。0变1,1变0。为什么说它重要?因为几乎所有复杂逻辑里,你都需要把信号反一下。我记得刚入行时,有个老工程师跟我说:「没有反相器,你连个D触发器都做不出来。」后来我深以为然。
| A | Y = ~A |
|---|---|
| 0 | 1 |
| 1 | 0 |
符号是一个三角形后面带个小圆圈。那个小圆圈代表取反,在数字电路里,这个小圆圈随处可见。
4. 与非门(NAND Gate)
与非门就是与门后面加个非门。先做与运算,再取反。所以它的真值表跟与门正好相反——「有0出1,全1出0」。
| A | B | Y = ~(A & B) |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
电路符号就是在与门输出端加个小圆圈。这里有个知识点:理论上,只用与非门就能搭出任何逻辑电路。我在FPGA项目里验证过,确实如此。所以有些教材说与非门是「通用门」,不是没道理的。
5. 或非门(NOR Gate)
或非门是或门加非门。先做或运算,再取反。真值表是「有1出0,全0出1」。
| A | B | Y = ~(A | B) |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
符号是或门输出端加个小圆圈。或非门也是通用门,不过在实际工程中,我更喜欢用与非门,因为CMOS工艺下与非门的性能通常更好一些。
6. 异或门(XOR Gate)
异或门有点意思——「相同出0,不同出1」。两个输入一样,输出0;两个输入不一样,输出1。
| A | B | Y = A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
电路符号跟或门有点像,但输入端多了一条弧线。异或门在加法器、校验电路里用得特别多。我曾经在做一个CRC校验模块时,用了一整排异或门做并行计算,那布线布得我头都大了。
核心要点:这六种门是数字电路的「字母表」。你写的任何Verilog代码,最终综合出来都是这些门的组合。理解它们的真值表和符号,是看懂原理图的第一步。
我的小技巧:记真值表不用死记。与门想成「串联开关」,或门想成「并联开关」,非门就是「反一下」。与非和或非就是在后面加个「反」。异或就是「比较器」——比较两个输入是否相同。
注意:实际芯片中,逻辑门的输入不能悬空。悬空的输入会像天线一样接收噪声,导致输出乱跳。我曾经见过一块板子,就是因为一个与非门的输入没接,导致整个系统间歇性死机。查了三天才找到原因。
知识体系总览
下面这张图,我把这六种门的关系和分类画出来了。你可以看到,与门和或门是基础,加上非门就衍生出与非门和或非门。异或门稍微特殊一点,它其实可以用与门、或门、非门组合出来。
好了,这一章的内容就这些。记住,逻辑门是数字电路的砖瓦,把砖瓦认清楚了,后面盖房子才不慌。可可精品资料库