ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CMOS门电路详解:从非门、OD门到三态门的原理与工程实践

CMOS门电路详解:从非门、OD门到三态门的原理与工程实践 数字电路的教材也好、网课也好讲CMOS门电路的章节往往是很多人的分水岭。有人在这里彻底弄懂了数字逻辑的物理本质也有人在这里背了一堆真值表和符号却始终觉得和实际电路隔着一层。如果只看逻辑表达式和真值表那CMOS门电路和普通的7414、7400没啥区别你会在后续接触IO口设计、总线通信、电平匹配、驱动能力时发现处处踩坑但又说不清问题出在哪。这篇内容我打算把CMOS门电路里最常用的几类——非门、与非门、或非门、OD门、传输门、三态门从电路结构到逻辑功能再到实际使用注意事项完整地捋一遍。这当中有一部分是教科书上的常识也有一部分是工程实践里的经验比如OD门的上拉电阻怎么选、传输门为什么能双向导通、三态门的高阻态到底是怎么回事。适合刚学完数电基础、准备做板级设计或FPGA开发的朋友也适合回过头来补基础、准备笔试面试的嵌入式工程师。看完之后你至少能解决一个很实际的问题为什么在一个设计里有些引脚可以直接连有些引脚就是要串电阻、加上拉。1. 为什么必须吃透CMOS门电路1.1 从数字芯片的最底层谈起数字电路里我们天天在跟0和1打交道。但0和1在物理上是什么其实就是一个电压范围。对CMOS工艺来说通常接近电源电压VDD的电位算高电平1接近地GND的电位算低电平0。问题是这个电平是通过什么电路产生的答案就是CMOS门电路。CMOS的全称是Complementary Metal Oxide Semiconductor互补金属氧化物半导体。关键就在“互补”两个字——它同时使用PMOS管和NMOS管让电路在稳定状态时几乎不消耗电流只有在状态翻转的瞬间才有动态功耗。正是这个特性让CMOS成为当今数字芯片的绝对主流工艺。从这个意义上说CMOS门电路不只是数电课本里的一章它是所有数字芯片的“细胞”。无论是CPU里几亿个晶体管组成的复杂逻辑还是FPGA里可配置的查找表结构底层都是由一个个CMOS门构成的。你把CMOS门电路的电流路径、导通条件、输出特性这些基本功打扎实了后面学什么都不会虚。1.2 只背真值表够不够我见过不少同学能把与非门、或非门的真值表倒背如流逻辑表达式也写得贼快但到了实验室就懵了——用两个非门搭个锁存器输出不稳定不知道怎么排查做按键消抖时想加一个上拉电阻不知道该选10k还是4.7k碰到OD门输出看着波形上沿慢慢爬上去和推挽输出完全不同。这些问题的根源就是只看到了逻辑层没看到晶体管层。本篇要做的就是把这两层结合起来。每讲一类门电路我都会从互补的PMOS/NMOS结构出发先看管子的连接方式再推导它实现的逻辑功能最后落到实际应用场景里。这样你在看数据手册里的输出结构图时就不会再觉得那是一堆看不懂的符号而是一眼就能认出它属于推挽结构、开漏结构还是三态结构。2. 非门反相器CMOS门电路的基本单元2.1 电路结构一个PMOS加一个NMOS先看最基础的非门也叫反相器。它的电路结构特别简单上面一个PMOS管下面一个NMOS管两个管子栅极连在一起作为输入漏极连在一起作为输出PMOS源极接VDDNMOS源极接地。这就是教科书上那张经典的图。这个结构是怎么实现“输入1、输出0输入0、输出1”的我们分两种情况来分析。输入为低电平0比如接地时PMOS管的栅源电压 Vgs 0 - VDD -VDD绝对值大于PMOS的开启电压 |Vtp|PMOS导通NMOS管的 Vgs 0 - 0 0V小于NMOS的开启电压 VtnNMOS截止。于是输出端通过PMOS管被拉到VDD输出高电平1。反过来输入为高电平1VDD时PMOS管的 Vgs VDD - VDD 0截止NMOS管的 Vgs VDD大于 Vtn导通。输出端通过NMOS管被拉低到地输出低电平0。所以非门的工作原理可以总结成一句话输入电平决定唯一一个导通的管子PMOS导通时输出高NMOS导通时输出低两个管子交替工作永远不会同时导通。这就是“互补”结构的核心思想。2.2 电压传输特性与噪声容限看非门的电压传输特性曲线你会发现一个很有意思的地方输出并不是在输入电压刚好等于VDD/2时才跳变而是在一个很小的范围内完成翻转。这个边界部分两个管子会同时处于导通状态也就在这个区域形成了比较大的电流。输入电压越接近电源电压或者地电路越稳定抗干扰能力越强。由此引出了两个非常重要的参数——输入高电平阈值 VIH 和输入低电平阈值 VIL。简单来说输入电压高于VIH电路一定可靠地判定为高电平输入电压低于VIL电路一定可靠地判定为低电平。两者之间是非法区间尽量避免输入信号长时间停留在这个范围。噪声容限反映的是电路对噪声的“容忍度”。高电平噪声容限 NMH VOH_min - VIH低电平噪声容限 NML VIL - VOH_max。CMOS电路的噪声容限通常能做到接近电源电压的30%~40%比TTL电路要好很多这也是CMOS能成为主流工艺的重要原因之一。2.3 实际电路里的非门一个非门看似简单但在实际电路里用处非常大。时钟反相、信号缓冲后再反相、按键输入取反、振荡器里的延迟级都会用到非门。用两个非门首尾相接可以组成一个静态存储单元——也就是锁存器的基础形态在数字IC后端设计里工程师还会通过调整反相器中PMOS和NMOS的尺寸比来优化翻转阈值和驱动能力。如果你在做板级调试有一个很实用的点当某个信号线悬空时CMOS门的输入端电位不定输出状态可能是乱的还会产生抖动电流。所以输入端尽量不要悬空不用时要接固定电平。这个习惯在FPGA和MCU的GPIO配置里同样适用。3. 与非门和或非门组合逻辑的栋梁3.1 与非门NMOS串联PMOS并联与非门在CMOS工艺里是一个非常经典的结构。先看NMOS部分两个NMOS管Q1、Q2串联在输出端和地之间也就是说只有Q1和Q2同时导通输出端才有下拉到地的通路。再看PMOS部分两个PMOS管并联在VDD和输出端之间只要有任意一个PMOS导通输出端就能被上拉到VDD。我们来推逻辑输入A和B都为高电平时NMOS都导通下拉通路建立输出被拉到低电平0。两个PMOS都截止不会形成上拉竞争。A、B中任意一个为低电平时对应连接的NMOS截止下拉通路断开同时对应输入的PMOS导通输出通过PMOS被上拉到高1。A、B都为低电平时两个NMOS都截止两个PMOS都导通输出高1。看出门道了吧这个结构天然实现了“只有输入全高输出才低”的逻辑也就是 Y (A·B)的非写成表达式就是 Y ~(A B)这就是与非门。3.2 或非门NMOS并联PMOS串联与非门是把NMOS串起来、PMOS并起来或非门正好相反NMOS并联PMOS串联。NMOS并联意思是两个NMOS中任意一个导通输出端就能被拉到地。PMOS串联意思是两个PMOS必须同时导通输出端才能被上拉到VDD。所以A、B任意一个为高电平时对应的NMOS导通输出直接被拉低到0。A、B都为低电平时两个NMOS都截止下拉通路断开同时两个PMOS都导通PMOS串联通路建立输出被上拉到1。这个功能就是 Y (AB)的非也就是或非门。从结构上来对比与非门的NMOS串联会带来一个副作用导通路径上多了一个管子的导通电阻整体下拉能力变弱。所以设计大扇入的与非门时要考虑驱动能力是否够用。而或非门的PMOS串联会让上拉能力下降而PMOS的迁移率本来就比NMOS低同样的尺寸下PMOS导通电阻更大所以或非门的上升沿通常比与非门慢。这些细节在模拟版图设计或高速时序优化时会成为关键约束。3.3 从结构推导逻辑表达式的通用思路看到这里你应该已经捕捉到一个可以举一反三的规律。在CMOS静态逻辑门里通常有一个上拉网络PDNPulldown Network和一个上拉网络PUNPull-up Network两者互补。PDN用NMOS实现负责把输出拉到地PUN用PMOS实现负责把输出拉到VDD。电路满足任何稳定的输入组合下只有一个网络导通另一个网络截止。推导逻辑时可以先只看PDN写出输出为0的条件再根据德摩根定律推导出输出为1的条件。或者从PUN的角度直接分析。比如一个三输入与非门PDN就是三个NMOS串联三个输入全为高时输出才为0所以Y ~(A·B·C)。三输入或非门PDN是三个NMOS并联任意一个输入为高输出就为0所以 Y ~(ABC)。这个方法非常实用。拿到一个不认识的CMOS门电路图先找PDN再看PUN用逻辑表达式一推功能立刻清楚了。3.4 扇入、扇出与噪声容限的实际影响扇入就是一个门的输入数量。与非门扇入越大串联的NMOS越多下拉路径的电阻越大输出低电平会偏离地电压更远抗干扰能力下降。同时输入端电容也在增加对前一级的驱动能力要求更高。在FPGA或标准单元库里通常会把大扇入门拆成几级小扇入门来保证时序。扇出是一个门的输出能驱动多少个负载门和输出电阻、负载电容都有关系。扇出过大输出边沿变缓信号完整性变差。一个比较保守的方法是在设计初期控制扇出不超过8高频设计还要根据时序分析结果做调整。实际调试时如果发现级联门电路的波形有毛刺除了检查电源去耦也要看看是不是扇出过大导致边沿斜率不够输入在VIH/VIL之间停留时间过长让下级电路进入线性区产生了不稳定的中间态。4. OD门开漏输出能“线与”、能调电平的输出结构4.1 开漏结构到底缺了什么前面讲的推挽输出输出级既有上拉PMOS又有下拉NMOS所以输出高电平时是主动通过PMOS往VDD拉输出低电平时主动通过NMOS往地灌。但OD门——开漏输出门在结构上做了一件事把PMOS上拉管拿掉了只剩下一个NMOS下拉管输出端直接引出。这就是“开漏”名字的来源漏极是开着的。没了上拉管OD门自己无法输出高电平。你说它输出高实际上输出管截止输出端处于高阻状态电平不固定。必须由外部在上拉一个电阻到某个电源电压才能在管子截止时把输出拉到高电平。这样做看似“残缺”却带来了两个极其有用的能力电平转换和线与逻辑。4.2 上拉电阻怎么取一个不算复杂的计算题OD门应用好坏上拉电阻是核心。上拉电阻太大负载电容充电慢上升沿变缓限制了通信速率上拉电阻太小灌电流过大会造成功耗增加甚至损害驱动管。一般有两个边界条件。最小值的约束是灌电流限制。当OD门输出低电平时NMOS导通电流从外部上拉电源流过电阻进入NMOS。这个电流不能超过数据手册里规定的最大灌电流否则会损伤器件。公式很简单R_min (Vpullup - VOL_max) / IOL_max。假设上拉电压5VVOL_max0.4VIOL_max20mA那R_min就是230Ω左右。最大值的约束是上升时间。RC充电时间常数大约等于R × C_load负载电容包括输入级的栅电容和走线分布电容。假设负载电容10pF想在上拉电阻形成的RC电路里让上升沿在一定时间内完成可以按RC常数来估算。比如要求上升时间小于1μs粗略按3τ到5τ计算τR×C假设允许3τ1μs则R33kΩ。实际工程中I2C总线的上拉电阻常见值在1kΩ~10kΩ之间配合不同总线电容和速率要求来选。4.7kΩ是很多场合的万金油选择。经验判断是总线速度越高负载电容越大上拉电阻就越要取小一些。4.3 I2C总线里的OD门为什么能多个设备挂一起去查I2C总线的物理层规范你会发现一个关键要求SDA和SCL两根线都是开漏结构外部接上拉电阻。这是I2C能实现多设备共享总线的基础。I2C协议里多个设备的SDA引脚全部挂到同一条线上。平时所有设备都不驱动靠上拉电阻把电平拉高总线处于空闲状态。任何一个设备要发送低电平时就把自己对应的NMOS导通把总线拉低。两个设备同时拉低总线也是低不会产生短路。如果要发送高电平设备不驱动NMOS截止总线由上拉电阻拉到高。这样就实现了“线与”逻辑——多个设备共享总线不会因为驱动冲突而烧毁。如果我们用推挽输出的端口直接接I2C总线会发生什么假设两个设备分别尝试输出相反电平一个推挽输出高另一个推挽输出低那就是电源到地之间形成低阻通路电流瞬间增大轻则信号错误重则烧毁IO口。这就是为什么I2C协议规定一定要用开漏或开源结构。4.4 OD门做电平转换的接线方式OD门的另一个常见用途是电平转换。假如有一个3.3V的传感器要接5V的SPI接口而传感器的DOUT引脚是OD输出那就可以把它的上拉电阻接到5V电源上这样输出高电平时就是5V完美匹配5V逻辑。反过来也可以5V OD门输出上拉到3.3V让5V器件安全地“说”3.3V的逻辑。这种转换电路简单、成本低但有两个注意点。第一转换后只解决了逻辑电平的问题上升沿的快慢取决于上拉电阻和负载电容如果高速信号需要陡峭的边沿可能要考虑用专用电平转换芯片。第二上拉的电源电压不能超过OD门输出管的漏源击穿电压查看器件绝对最大额定值否则一拉高就容易击穿。4.5 OD门最常见的3个坑坑一忘记加上拉电阻。有些朋友把OD门当普通推挽输出用发现输出总是低或者高电平只有零点几伏查了半天才发现少了一颗电阻。这个错误特别容易在初学阶段和硬件原型阶段出现。坑二上拉电阻选太大导致沿太慢。有位朋友在做一个低速的EEPROM读取用了100kΩ的上拉实际测量上升沿达到数十微秒通信直接失败。后来换成4.7kΩ问题立刻消失。在信号完整性测试时记得用示波器确认边沿斜率。坑三用推挽结构模拟OD门的行为。有些GPIO可以配置为开漏模式但并非所有MCU的GPIO都支持而且内部可能有保护二极管或钳位结构如果外部上拉电压高于MCU电源电压有可能通过保护二极管往VDD漏电造成电压倒灌。设计时要查阅GPIO结构图必要时串接隔离电阻。5. 传输门和模拟开关一个能传“所有电压”的门5.1 传输门的结构与导通条件传输门的结构非常有意思它不是用来输出固定0或1的而是用来“传输”输入信号的。电路由一个NMOS和一个PMOS并联组成两个管子的源极和漏极分别相连形成两个端口A端和B端控制信号C和C非分别接NMOS栅极和PMOS栅极。当 C1、C非0时NMOS导通、PMOS导通A和B之间形成低阻通路信号可以双向传输。当 C0、C非1时两个管子都截止A和B之间呈高阻态相当于断开了。有人会问一个NMOS不就够了吗确实单独一个NMOS也能传输信号但它只能传好低电平和接近VDD-Vtn的电压传输高电平时会有阈值损失。单独一个PMOS能传高电平但传低电平会损失。两个管子并联可以确保0到VDD整个范围内都通畅。这就是为什么传输门要采用互补结构。5.2 为什么模拟信号也能传传输门的一个特殊之处在于它本身不区分数字和模拟。只要导通两端的电压就在理想情况下保持一致没有“整形”功能。所以它既能传数字信号也能传模拟信号。这一点和普通的逻辑门完全不同。在实际芯片里模拟开关芯片比如CD4066的核心就是传输门。音频信号切换、采样保持电路里的开关、可编程增益放大器里的电阻网络切换都是在用传输门。使用时注意信号幅度不能超过工作电压范围也不能低于地电位否则内部寄生二极管会导通造成信号失真甚至损坏器件。传输门在导通时其实有一个阻值在几十欧姆到几百欧姆之间的导通电阻并不是理想导线。导通电阻的大小受输入电压影响在信号接近电源中间值时导通电阻最大。这一点在设计精密模拟电路时需要考量。好在现代芯片通常用加大尺寸或并联多个传输门来降低导通电阻。5.3 用传输门搭一个二选一多路器传输门最简单的应用就是二选一多路选择器。两个传输门TG1和TG2TG1的导通条件是选择信号S1TG2的导通条件是S0两路输入A和B分别接两个传输门的输入端输出端接到一起。当S1时TG1导通输出A当S0时TG2导通输出B。这种结构在FPGA的可配置逻辑单元和数字IC的MUX单元里非常常见因为传输门速度快、占用面积小。但要小心多个传输门输出端直接相连时必须保证任意时刻只有一个传输门导通否则两个不同的信号会在输出端打架产生短路电流。5.4 传输门和普通逻辑门的本质区别普通逻辑门是“有源驱动”输出端总能提供拉电流或灌电流。传输门是“无源开关”它对信号没有放大作用只提供通路。传输门的输出幅度和输入完全一样也不存在推挽结构那种强上拉强下拉能力。所以在把它当开关用时前级信号驱动能力够不够后级负载电容大不大都要通盘考虑。如果前级是一个高阻抗的RC信号源经过传输门后又驱动一个大电容负载信号会变得更弱这是传输门的一个限制。6. 三态门不仅输出0和1还能“放手”6.1 为什么需要高阻态普通推挽CMOS门只有两种输出状态高电平和低电平。现在想象一个场景多个设备的输出要接到同一条数据总线上如果每个时刻只有其中一个设备发送数据其他设备都必须把输出断开。断开是什么状态既不高也不低就是高阻态用字母Z表示。三态门就是支持三种输出状态的门电路高电平、低电平、高阻态。它多了一个使能控制端EN。当EN有效时它就是个正常门输出0或1当EN无效时输出端与内部电路断开呈现高阻态相当于引脚被“释放”了。你需要理解高阻态不是电压而是没有驱动。实际电平由一个外部元件决定可能是上拉电阻拉高、下拉电阻拉低也可能因为悬空而不定。读高阻态引脚的电压没有意义必须等某个设备把它驱动到确定电平后再读。6.2 三态门在总线上的作用三态门最常见的应用场景就是数据总线。在传统单片机里多个外设共享一组8位数据线CPU通过片选信号来控制每个外设的三态缓冲器。当某个外设被选中时它把数据放到总线上其他外设的三态输出处于高阻态不干扰总线。这就实现了多器件分时共享同一组引脚。SPI外设也有类似的设计多个从机的MISO引脚通常可以并联但每个从机只有在片选信号拉低时才驱动MISO其他时间输出高阻。如果没有三态功能两个从机同时向MISO灌电流或拉电流通信就会出错甚至损坏IO口。在PCB布局上尽量让多个三态门的输出到总线的走线长度接近减少分支引起的反射。总线末端是否加终端匹配电阻需要根据信号速率、走线长度和驱动能力来评估。6.3 三态门与OD门的对比一个容易混淆的考点三态门和OD门都包含高阻状态但适用场景和电路结构完全不同。三态门在使能无效时输出高阻使能有效时能主动输出高或低电平驱动能力强OD门永远需要外部上拉输出低电平时主动拉低输出高电平时其实是不驱动靠上拉电阻拉高。如果做笔试或面试这个对比经常被问到。从波形上看三态门使能后能快速输出低电平或高电平OD门输出高电平时波形上升沿总是带着RC充电的曲线。从使用场景看三态门适合总线分时复用驱动信号OD门适合线与逻辑、电平转换和I2C这类多主设备共享总线的协议。6.4 三态门使用的注意事项先想清楚初始状态。系统上电时如果三态门的使能信号时序不可控可能出现多个设备同时驱动总线的情况。很多设计中会在FPGA配置一个默认安全的GPIO状态让三态门在初始化期间保持高阻避免总线冲突。再注意总线保持。三态门输出高阻后总线电平并没有被驱动。如果总线上挂着电平敏感的输入必须外部配一个上拉或下拉电阻使总线在高阻期间保持确定的电平否则输入可能因为浮空而漂移产生不定逻辑。这在按键检测、控制线、中断线上特别常见。最后一个容易忽略的问题是ESD保护。高阻输出引脚在插拔或带电操作时更容易积累静电设计时通常要加ESD防护器件或确保芯片自带的保护二极管能够承受。7. 把知识串起来实际工程中的3个排查案例7.1 案例一I2C上拉电阻导致的通信偶发失败当时做一块传感器采集板I2C总线上挂了3个从设备通信偶发性失败有时开机半小时后才出现一次。用示波器看波形SDA的上升沿明显偏软高电平到达VIH的时间太长靠近上限。总线上拉用了10kΩ而总线电容因为走线长和过孔多实测已经超过50pF。算下来RC充电时间已经到了微秒级别在400kHz快速模式下很容易出错。排查过程比较简单先换2.2kΩ上拉电阻再用示波器复测波形上升沿显著改善连续跑了一晚上压力测试没再报错。这个案例说明I2C上拉电阻并非照抄参考设计就行要结合总线长度、器件数量、通讯速率综合评估。后来我把这项目的上拉电阻设计改成可调焊盘兼容4.7k和10k的使用场景方便调试时快速切换。7.2 案例二GPIO推挽和开漏配置弄反了这个案例来自一次产品返修。板子上一个状态指示灯用MCU GPIO直接驱动LEDLED串联限流电阻接到VDD。正常应该配置成推挽输出但同事在初始化代码里把GPIO配置成了开漏模式。结果是LED永远不亮因为开漏输出只有下拉能力无法主动输出高电平去点亮LED。排查时读取GPIO寄存器配置确实写的是开漏改成推挽后LED正常。这个错误听起来很低级但在实际项目里确实会出现尤其是在复用引脚多、初始化代码由多个文件拼凑的情况下。遇到输出电平正常但外设不动作的问题时先检查GPIO模式再看输出结构别急着怀疑芯片坏了。顺便说一下在配置开漏模式时还要确认GPIO是否有内部上拉可用如果内部上拉阻值太大驱动能力不足也可能导致电平异常。7.3 案例三三态门高阻导致的中断误触发在设计按键外部中断时按键一端接地、另一端接MCU引脚。如果引脚没有配置内部上拉按键断开时引脚悬空电平不定中断可能被反复触发或者检测到随机的边沿。这个问题的本质就是三态引脚或高阻输入导致电平浮空。把引脚改成带上拉输入模式或者再加一颗10k外部上拉电阻中断就恢复正常了。这其实和三态门有关系很多MCU的GPIO在输出模式下可以配置为推挽或开漏在输入模式下则有浮空、上拉、下拉等选项引脚内部本质上都是一个带使能逻辑的IO pad。理解三态门后你会更容易理解GPIO输入输出方向切换时的电平保持问题也更容易理解为什么换用不同GPIO库时初始状态可能完全不同。7.4 常见问题速查表现象可能原因排查步骤OD门输出高电平不对没加上拉电阻或上拉电阻取值过大检查电路是否漏加示波器看上升沿时间I2C通信偶发失败上拉电阻偏大、总线电容偏大换小电阻优化走线降低总线速率总线输出冲突发热两个推挽输出同时驱动总线检查片选/使能时序确认是否都处于高阻按键中断乱触发输入引脚悬空、电平漂移启用内部上拉/下拉或外部接电阻CMOS门输入悬空时输出不定输入端悬空悬空输入引脚接到固定电平三态门SMU测试读到的电平异常高阻状态下总线无驱动先确认总线已由某一设备主动驱动8. 写在最后的个人经验回到开头说的那个分水岭。我在学习 CMOS 门电路时最大的感受是真值表只是结果电路结构才是原因。如果你能习惯性地在脑子里把逻辑符号翻译成“哪些管子导通、哪些管子截止、电流走什么路径”那门电路这块就算真正过了关。这几类门电路不是孤立的知识点。非门是所有门的底板与非和或非是组合逻辑的骨架OD门把输出电平的控制权交给了外部上拉电阻三态门把输出通断交给了使能信号传输门则更进一步干脆做成一个双向透明的模拟开关。理解它们的差异和互补关系对做电路设计、做驱动开发、甚至阅读芯片数据手册都有直接帮助。最后给一个小建议学到这里不妨拿起手边的逻辑芯片比如74HC00、74HC04、74HC125用面包板搭几个小电路用万用表和示波器实测一下输出波形、高阻态电平、上拉电阻的影响。不少知识在黑板上感觉懂了真正动手量过之后才算变成自己的。
返回列表