CMOS 复合门与动态逻辑:用晶体管直接搭函数
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」进阶层(intermediate)数字逻辑基础第二十九篇。逻辑门与晶体管讲了反相器和与非/或非,这一篇给你一套从任意布尔式直接画 CMOS 晶体管电路的方法,并打开动态逻辑这扇门。
本文要回答的问题
- 给一个
Y = A·B + C之类的式子,怎么直接确定 NMOS/PMOS 各怎么接? - 为什么上拉网络和下拉网络一定「串并对偶」?为什么输出总带反相?
- AOI、OAI 复合门为什么比「与门+或门+非门」拼起来更省更快?
- 传输门能怎么直接实现函数(MUX、异或)?
- 动态逻辑的「预充—求值」省在哪,电荷分享、单调性、多米诺又是怎么回事?
一、构造法则:下拉实现函数,上拉严格对偶
回忆 CMOS 门的结构(见 CMOS 反相器/与非门):输出和 GND 之间是一串 NMOS 下拉网络(PDN),输出和 VDD 之间是一串 PMOS 上拉网络(PUN)。任意时刻两者恰好一个导通(输出 0 或 1),稳态时没有 VDD→GND 直流通路。构造任意函数 Y = F(输入) 的口诀:
- 下拉网络实现 F 本身:NMOS 满足「串联 = 与」(两个都导通才通路)、「并联 = 或」(任一导通就通路)。把 F 写成积之和,乘积项里的变量用串联 NMOS,各乘积项之间并联。
- 上拉网络实现对偶:PMOS 的串并联关系与 NMOS 恰好互换——NMOS 串联处 PMOS 并联,NMOS 并联处 PMOS 串联(同时 PMOS 栅极接原变量/反变量的极性也要对应)。它实现的是 F 的反函数的「对偶形」,保证 PDN 断时 PUN 通、反之亦然。
- 因为「下拉导通」对应输出 0,而下拉按 F 导通,所以单级 CMOS 静态门输出天然是反相的:你直接实现的是
Y = F̄。要非反相函数,要么输出再加一级反相器,要么用德摩根把函数改写成反相形式实现。
例:实现 Y = (A·B + C) 的非,即 Y = (A·B + C)̄(一个 AOI 型复合门)
- 下拉:A、B 两个 NMOS 串联(实现 A·B 这一项),这一串再与 C 的 NMOS 并联(实现 +C);
- 上拉:对偶——A、B 两个 PMOS 并联,再整体与 C 的 PMOS 串联。
VDD
│
C-PMOS
│
┌─────┴─────┐
A-PMOS B-PMOS ← 上拉:A、B 并联,再与 C 串联
└─────┬─────┘
├──────── Y = (A·B + C)̄
┌─────┴─────┐
A-NMOS B-NMOS ← 下拉:A、B 串联...
└─────┬─────┘
│(串联点)
C-NMOS ...这一串与 C 并联
│
GND共 2 个输入、4 个晶体管(A、B、C 各一对,实为 6 管:A、B、C 三输入)。这就是一个 **AOI21(与或非)**单元;对偶地 **OAI(或与非)**实现 (A+B)·C 的非。标准单元库里 AOI/OAI 是常客。
二、为什么复合门更省更快
若用基本门实现 Y=(A·B+C)̄,需要一个与门(6 管,因为与=与非+反相)、一个或非(4 管),十几只管子、两三级门延迟;用一个 AOI21 复合门只要 6 管、一级门延迟。省的根源是:①省掉了中间的反相器;②输出直接利用「串并联拓扑」表达与或,不产生中间节点。这也是为什么综合优化偏爱反相逻辑(inversion pushing):把表达式用德摩根改写成 AOI/OAI,比堆 AND/OR 又小又快,时序报告里大量出现 A(O)I 单元就是这个原因。代价是逻辑不直观、复用性差,所以交给工具做,不必手写。
一条快速估算:k 输入静态 CMOS 门通常 2k 只管子(每输入一对上下拉)。但串得越长,导通电阻越大(串联管电阻相加)、越慢,所以实际单元串长一般不超过 3~4,长逻辑会拆成多级或换结构。
三、传输门逻辑:让信号「横着穿」开关
除了「上拉/下拉到轨」,还能像 三态与传输门那样让数据直接通过开关:**传输门(TG,一 NMOS 一 PMOS 并联、栅极互补)**是一个双向理想开关,控制有效时 0、1 都能较完整通过。用它能极省地实现某些函数:
- 2:1 MUX:两只传输门,
sel选通 A 或 B 到输出,只要 4 管(CMOS 门实现要更多); - 异或 XOR:4 管传输门 + 两个反相器即可,比静态门紧凑,所以全加器、锁存器常用 TG 设计;
- 锁存器/主从触发器在透明/锁存两相间切换的就是传输门。
弱点:①输出端常需缓冲,否则级联时没有驱动、电平会被阈值损失削弱(单 NMOS 传 1 弱、单 PMOS 传 0 弱,故要两管互补);②串联多级 TG 会有较大 RC 延迟;③不能「恢复」电平。故传输门适合做小而巧的选择/锁存,重负载输出仍要反相器缓冲。
四、动态逻辑:预充—求值,把管子砍半
静态门每个输入都要一对上下拉,2k 管。动态逻辑赌「时钟相位」,结构是:一个 PMOS 预充管(接时钟 φ)把输出在某相位先充高,一个 NMOS 求值管(接 φ̄)当总开关,中间只有一棵 NMOS 下拉树实现函数:
- 预充相(φ=0):预充管通、求值管断,输出 Y 被强制充到 1(不看输入);
- 求值相(φ=1):预充管断、求值管通,输出是否被放电到 0,取决于下拉树按输入是否导通——导通则 Y=0,否则靠预充电荷保持 1。
VDD
│
φ-PMOS(预充管)
├──────── Y(预充为1;求值时按 PDN 决定放不放光)
│
┌──── 下拉 NMOS 树(实现 F,比静态省掉整棵 PMOS 对偶网络)
│
φ-NMOS(求值/脚管)
│
GND好处诱人:①每个输入只要一个 NMOS,晶体管数约静态的一半,输入电容小、面积省;②下拉树全是 NMOS(比 PMOS 快、且无 PUN 与 PDN 的竞争),开关速度快,曾广泛用于高性能 CPU。但它带来一串麻烦,理解这些就懂了为什么主流设计回归静态 CMOS:
- 单调性约束:求值期间输入只许「0→1」单向变化(或按相位保证稳定),否则一次误放电后 Y 无法自动充回(这个相位里预充管是断的),错误锁死;
- 电荷分享(charge sharing):输出节点的预充电荷会和下拉树内部原本为 0 的电容分压,即使没真的通到 GND,Y 也可能被拖低,需要内部预充/缓冲补偿;
- 漏电与时钟开销:保持高靠电容(动态节点),漏电流会让它慢慢掉,必须在限定时间内求值;每个门都要接时钟、有时钟翻转功耗;
- 不能简单级联:一个动态门求值时输出可能先 1 后 0,若直接当下一级动态门的输入会误放下级。
最后一条用**多米诺逻辑(domino)**缓解:动态门输出加一个静态反相缓冲,使输出在求值中只做单调的「1→0」或反相后的「0→1」跳变,像推倒的多米诺骨牌一样各级依次安全求值,可级联。即便如此,动态逻辑设计对噪声、工艺、时钟偏斜极敏感,主要由资深定制电路/库团队在高速宏单元里手工使用;做数字 RTL/SoC 设计,面对的几乎全是静态 CMOS 标准单元,但懂得动态逻辑能解释库里为何那样设计、高性能芯片为何还会在关键路径上混用定制动态电路。
与现有篇目的衔接
- 直接前置:逻辑门与晶体管(反相器/NAND/NOR、上下拉)、三态门与传输门
- 应用单元:加法器/全加器、锁存器与触发器、MUX
- 工具视角:RTL 到门电路、综合是什么(反相优化、AOI/OAI)
- 电气后果:逻辑门电气特性(电阻/电容/延迟/漏电)
总结
一句话总结:任意静态 CMOS 门可由一条法则直接画出——下拉 NMOS 网络按「串联=与、并联=或」实现函数 F 的积之和,上拉 PMOS 网络严格串并对偶(NMOS 串处 PMOS 并、并处 PMOS 串)保证任意时刻只有一边导通,因此单级输出天然带反相、实现的是 F̄,要非反相输出加一级反相器或用德摩根改写;k 输入门约 2k 管,把与或非融进一个 AOI/OAI 复合单元可省掉中间反相器、把多级延迟压成一级,这正是综合器做反相优化、库里大量出现 AOI/OAI 的原因(串长一般不超过 3~4 以免串联电阻过大);传输门逻辑让信号直接通过一 NMOS 一 PMOS 互补开关,用 4 管实现 2:1 MUX、用很少管子实现 XOR 和锁存器,但需输出缓冲恢复电平、避免多级 RC 串联;动态逻辑则用「预充相 PMOS 把输出充高、求值相 NMOS 脚管导通由下拉树决定是否放电」的两相结构,省掉整棵 PMOS 对偶网络、输入电容和面积减半且速度快,却付出单调性(输入求值期只能单向变)、电荷分享分压、动态节点漏电和不能直接级联的代价,需加静态反相缓冲构成多米诺逻辑才能级联,且对噪声/PVT/时钟偏斜极敏感,主要用于定制高速宏单元,普通 RTL/SoC 仍以静态 CMOS 标准单元为主——掌握「下拉实现、上拉对偶、复合省级、传输门巧选、动态预充」这五点,就有了从布尔式一路看到晶体管和版图的贯通视角。