简介:这是一份面向模拟集成电路学习者与电路设计初学者的CMOS两级运算放大器设计与仿真实验报告,适合正在学习运放结构选型、手工参数估算与Cadence仿真流程的本科高年级或研究生。报告按运算放大器设计简介、设计目标参数要求、电路设计、仿真调试、实验结果五部分展开,采用CMOS-90nm工艺库,围绕双端输入单端输出差分放大级、共源放大级、直流偏置与密勒补偿电路给出具体宽长比、偏置电流与补偿参数。资源包为单个PDF文件,约1.34MB,内容完整、图文并茂,便于打印研读与对照仿真。已有1362人学习下载,读者可借此掌握两级运放的增益、增益带宽积、相位裕度等指标的推导与验证思路,获取从手工计算到Virtuoso仿真调试的完整排错参考,适合作为课程实验与课程设计的模板素材。
1. 卡住大多数人的不是仿真器,是从指标到尺寸的那一步
做一份 CMOS 两级运算放大器设计报告,最容易翻车的环节往往不在打开仿真器之后,而在打开之前。手上只有一串指标:开环增益要 60 dB 以上、单位增益带宽 10 MHz、相位裕度不低于 60 度、摆率 10 V/μs、负载电容 2 pF、静态功耗压到 1 mW 以内,然后就得决定每一只 MOS 管的沟道宽长比、每一路偏置电流取多大、米勒电容放多少。指标到尺寸这一步没算清楚,后面 AC 曲线只会给你一条增益四十来 dB、相位裕度二十几度的线,于是开始盲调 W/L,一个下午就没了。两级结构之所以成为模拟 CMOS 入门和课程设计的默认选择,是因为第一级差分放大负责堆增益,第二级共源放大负责给输出摆幅和驱动能力,代价是必须用米勒补偿把两个极点拆开。这套取舍讲清楚,参数就能倒推出来。适合正在做模拟 IC 课程设计、需要补齐一份运放报告,或者第一次从 cmos 反相器这种单管级电路往运放跨的人。
2. 拓扑先行:CMOS 两级运放为什么是差分输入加共源输出
2.1 单级放大器的增益天花板在哪
单级共源放大器的低频增益写成 A = gm·(ro,n || ro,p),其中 ro 由沟道长度调制系数 λ 决定,ro ≈ 1/(λ·Id)。在 0.18 μm 这类工艺里,如果 L 取最小尺寸,λ 偏大,ro 通常只有几百 kΩ 量级,算下来单级增益四十 dB 上下就到头了。想再往上走有两条路:一是把 L 拉长,ro 近似线性上升,但寄生电容跟着涨,带宽掉得厉害;二是叠共源共栅(cascode),增益能到六七十 dB,可输出摆幅被吃掉两个过驱动电压,在 1.8 V 电源下留给后级的余量很紧张。这两条路的共同问题是:都只能用一级电路换增益,带宽和摆幅必须选一个牺牲掉。
2.2 两级结构的增益分配与极点分布
两级结构把增益拆成两段来挣。第一级是 NMOS 差分对配 PMOS 电流镜负载,差分输入转单端输出,增益 A1 ≈ gm1·(ro2 || ro4);第二级是 PMOS 共源放大管配 NMOS 电流源负载,增益 A2 ≈ gm6·(ro6 || ro7)。总增益是两者相乘,六十到八十 dB 可以轻松拿到。代价是电路里天然出现两个高阻节点,第一级输出节点和第二级输出节点各挂一个极点。如果这两个极点频率靠近,相位会在同一个频段内连掉 180 度,闭环之后直接振荡。
| 结构 | 典型增益 | 输出摆幅 | 主要代价 |
|---|---|---|---|
| 单级共源 | 35~45 dB | 大,接近 VDD−Vdsat | 增益不够 |
| 套筒式共源共栅 | 60~75 dB | 小,损失两个过驱动 | 摆幅紧,偏置复杂 |
| 两级(差分+共源) | 60~85 dB | 大,约 VDD−2Vdsat | 需米勒补偿,多一个极点 |
| 折叠式共源共栅 | 65~80 dB | 中等 | 功耗与噪声偏大 |
2.3 米勒补偿与右半平面零点
要把两个极点分开,标准做法是在第二级放大管的栅漏之间跨接一个米勒电容 Cc。利用米勒效应,第一级输出节点看到等效电容 (1+A2)·Cc,主极点被大幅往低频推;同时第二级输出节点的高频极点被推向 gm6/CL 附近,这就是极点分裂。分裂之后主极点 p1 ≈ 1/(R1·A2·Cc),次极点 p2 ≈ gm6/CL,单位增益带宽 GBW ≈ gm1/(2π·Cc),三者可以解耦设计。
麻烦在于 Cc 同时开了一条从第一级输出到第二级输出的前馈通路,在 s 域里引入一个右半平面零点 z ≈ gm6/Cc。右半平面零点不衰减反而抬升幅频曲线,同时往下压相位,是相位裕度杀手。常用两种处理:在 Cc 上串一个调零电阻 Rz ≈ 1/gm6,把零点推到左半平面或者无穷远;或者干脆用共源共栅补偿,让前馈通路经过一个低阻节点被截断。前者省面积,后者更干净但摆幅会损失。
2.4 什么情况下不该用两级
两级不是万能。如果要求噪声极低、摆率极高,或者电源只有 1 V 出头,折叠式共源共栅往往更划算,因为它第一级就提供了高增益,不需要米勒电容,也就没有零点问题。另外像 cmos 图像传感器里的像素读出链路、ToF 测距芯片的模拟前端,面积和功耗卡得很死,很多时候用的是结构更简单的单级放大器或开关电容电路,两级运放只在列级读出或者基准缓冲里出现。选型时先把增益、摆幅、功耗、噪声四个指标写下来排优先级,再决定要不要两级。
3. 从 GBW 和相位裕度反推 W/L 与偏置电流
3.1 设计顺序:先电流、再过驱动、最后尺寸
手工设计有一个相对固定的顺序,按这个顺序走基本不会来回返工。第一步从摆率定尾电流,因为 SR = I5/Cc,摆率只跟第一级尾电流和补偿电容有关。第二步从负载电容定 Cc,工程上取 Cc ≈ 0.2~0.3·CL,太小压不住次极点,太大浪费带宽和摆率。第三步由 GBW 反推输入对管的 gm1。第四步由相位裕度要求定第二级的 gm6。最后才根据 gm 和电流反推每只管的 W/L,并回头校验饱和区。
这里有个容易忽略的点:gm 和 Id 是两个独立的设计变量,比值 gm/Id 决定管子工作在弱反型还是强反型。gm/Id 取大(管子偏弱反型)省电流但匹配差、带宽差;取小(强反型)线性度好、匹配好但费电流。中等反型区 gm/Id 在 10~15 V⁻¹ 之间,是模拟设计的常用工作点。
3.2 关键公式与 Cc 的取值
设计里反复用到的就四组关系。第一组是带宽:GBW = gm1/(2π·Cc)。第二组是摆率:SR = I5/Cc,其中 I5 是第一级尾电流,单边电流为 I5/2。第三组是次极点位置:p2 ≈ gm6/CL,为了让相位裕度在 60 度以上,一般要求 p2 ≥ 3·GBW(已经用调零电阻消掉零点的情况),零点没处理时得压到 2.2·GBW 以内还要额外留余量。第四组是增益:A_total = A1·A2,两级各贡献一半左右的增益比较均衡,全部压在一级会导致那一级的 ro 要求过于苛刻。
3.3 一段可复现的 Python 尺寸估算脚本
把上面四组关系写成脚本,改动指标时重跑一遍,比在纸上推快得多。
import math # 目标指标 GBW = 10e6 # 单位增益带宽 Hz SR = 10e6 # 摆率 V/s CL = 2e-12 # 负载电容 F PM_ratio = 3.0 # 次极点 / GBW 的裕度系数 # 工艺常数(0.18um 量级,按实际 PDK 替换) uCox_n = 200e-6 # NMOS 迁移率 x 栅氧电容 A/V^2 uCox_p = 80e-6 # PMOS lam = 0.1 # 沟道长度调制系数 1/V # 第一步:米勒电容 Cc = 0.25 * CL # 第二步:由摆率定尾电流,SR = I5 / Cc I5 = SR * Cc Id1 = I5 / 2.0 # 差分对单管电流 # 第三步:由 GBW 定输入对管 gm gm1 = 2 * math.pi * GBW * Cc # 第四步:由次极点定第二级 gm6 gm6 = 2 * math.pi * PM_ratio * GBW * CL Id6 = 30e-6 # 第二级静态电流,先按功耗预算定 # 反推宽长比 WL1 = gm1**2 / (2 * uCox_n * Id1) WL6 = gm6**2 / (2 * uCox_p * Id6) # 校验饱和区需要的过驱动电压 Vov1 = 2 * Id1 / gm1 Vov6 = 2 * Id6 / gm6 # 单级增益估算 A1 = gm1 / (2 * lam * Id1) # ro2 || ro4,两管 ro 近似相等 A2 = gm6 / (2 * lam * Id6) A_total_dB = 20 * math.log10(A1 * A2) print(f"Cc = {Cc*1e12:.2f} pF") print(f"I5 = {I5*1e6:.2f} uA, 单边 {Id1*1e6:.2f} uA") print(f"gm1 = {gm1*1e6:.2f} uS, gm6 = {gm6*1e6:.2f} uS") print(f"W/L1 = {WL1:.2f}, W/L6 = {WL6:.2f}") print(f"Vov1 = {Vov1*1e3:.1f} mV, Vov6 = {Vov6*1e3:.1f} mV") print(f"总增益约 {A_total_dB:.1f} dB") print(f"调零电阻 Rz = {1/gm6:.0f} ohm")这段脚本的逻辑很直白:Cc 由 CL 定,I5 由 SR 和 Cc 定,gm1 由 GBW 和 Cc 定,gm6 由次极点要求定。四个设计变量互相咬合,改一个指标整条链路都会跟着动。
需要说明几个参数。uCox_n、uCox_p必须换成实际 PDK 里对应 L 的数值,不同 L 的迁移率会略有差异。lam是沟道长度调制系数的粗略值,只用于前期估算,真实 ro 要看仿真。Id6是第二级静态电流,它不受摆率约束,只受功耗预算和 gm6 的合理性约束:Id6 太大浪费功耗,太小则要达到同样的 gm6 需要很宽的 W,寄生电容变大。脚本末尾打印的 Vov 要检查是否落在 100~300 mV 之间,低于 100 mV 匹配会明显变差,高于 400 mV 会吃掉输出摆幅。
3.4 尺寸结果对照表与饱和区校验
按上面脚本在 GBW 10 MHz、CL 2 pF、SR 10 V/μs 的条件下跑一遍,得到的量级大致如下,具体数值必须按实际 PDK 重算。
| 器件 | 角色 | 电流 | gm | 过驱动 | W/L 量级 |
|---|---|---|---|---|---|
| M1/M2 | NMOS 差分输入对 | 2.5 μA | 31 μS | 160 mV | 约 1,建议 L 取 2 μm 提匹配 |
| M3/M4 | PMOS 电流镜负载 | 2.5 μA | — | 约 200 mV | 由镜像比定,L 取 1~2 μm |
| M5 | NMOS 尾电流源 | 5 μA | — | 250 mV | 宽长比偏大,注意版图匹配 |
| M6 | PMOS 第二级放大管 | 30 μA | 380 μS | 160 mV | 约 30,L 取 1 μm |
| M7 | NMOS 第二级负载 | 30 μA | — | 250 mV | 与 M5 构成镜像 |
| M8 | 偏置支路 | 5 μA | — | 250 mV | 决定全芯片电流基准 |
校验的核心就一句话:每只管的 |Vds| 必须大于 |Vov|。仿真时先跑 .op,把每只管的工作区看一眼,只要有一只要么进线性区要么进截止区,后面的 AC 曲线全是错的,不要往下走。
3.5 首次设计最容易踩的三个坑
第一个坑是把过驱动电压取到 50 mV 以下,觉得省电又高 gm,实际上此时管子进入弱反型,阈值失配直接放大到几十毫伏,差分对失衡,失调电压超标。第二个坑是 L 全取最小值,ro 小、增益怎么调都上不去,输入对管和负载管的 L 至少放大到最小尺寸的两倍。第三个坑是 Cc 取太小,比如取 0.05·CL,主次极点靠得太近,相位裕度调到五十度以下,然后靠加调零电阻硬撑,实际上建立时间会出现明显的长尾振荡。
4. 从网表到波形:两级运放的 DC/AC/瞬态仿真怎么设
4.1 可直接改用的 SPICE 网表骨架
原理图搭好之后,用网表跑批处理仿真更方便反复迭代。下面是一个单位增益缓冲接法的骨架,直接换成实际 PDK 的器件模型就能跑。
* CMOS 两级运放 AC/瞬态仿真骨架 .include "pdk_model.lib" VDD vdd 0 1.8 VSS vss 0 0 VB vb 0 0.9 $ 偏置支路栅压,先给个估计值 * 第一级:差分输入对 + 电流镜负载 M1 n1 vip n3 vss nmos W=2u L=2u M2 n2 vin n3 vss nmos W=2u L=2u M3 n1 n1 vdd vdd pmos W=4u L=2u M4 n2 n1 vdd vdd pmos W=4u L=2u M5 n3 vb vss vss nmos W=10u L=1u * 第二级:共源放大 + 电流源负载 M6 vout n2 vdd vdd pmos W=30u L=1u M7 vout vb2 vss vss nmos W=15u L=1u * 米勒补偿与调零电阻 Cc n2 vout 0.5p Rz n2 nz 2.6k Cz nz vout 0.01p $ 可选,配合 Rz 微调零点 CL vout 0 2p * 交流激励 VIN vip 0 DC 0.9 AC 1 Efb vin 0 vout 0 1.0 $ 单位增益反馈 .op .ac dec 100 1 1G .tran 10n 20u .end网表里第一级输出节点是 n2,它同时是第二级 M6 的栅极,Cc 就跨在 n2 和 vout 之间。Rz 串在 Cc 路径上,用来把右半平面零点推走。Efb是压控电压源,用来构造单位增益负反馈:把 vout 反馈回 vin,构成闭环,这样 AC 扫出来的就是闭环响应——想看开环增益和相位裕度,更省事的做法是把反馈断开,直接在开环状态下跑 .ac,然后手动算相位裕度。
4.2 先看工作点:每一只管都必须落在饱和区
跑.op之后,重点看三组数:每只管子的 Vgs、Vds、Vdsat,以及流过每只管子的 Id。输出文件里如果器件模型提供 region 信息更好,直接看 region 字段是不是 2(饱和区)。第二级放大管 M6 最容易出问题:如果它的 Vds 不够,会掉到线性区,此时 gm6 会大幅下降,次极点位置往下掉,相位裕度跟着恶化。此时要么调小 M6 的过驱动,要么调 M7 的镜像比,把输出共模抬上去一点。
4.3 AC 扫描读增益、GBW 与相位裕度
开环 AC 扫描的接线方式是把输入端加 AC 1,第二级输入断开反馈。扫完之后从输出读三个值:低频增益是幅频曲线在低频段的平坦值;GBW 是增益降到 0 dB 时的频率;相位裕度是 GBW 频率处相位与 −180° 的差值。用 .measure 可以自动读出来,省得每次在波形上手动点。
.measure AC gain_dc FIND vdb(vout) AT=1 .measure AC gbw WHEN vdb(vout)=0 .measure AC phase_gbw FIND vp(vout) WHEN vdb(vout)=0FIND ... AT=1取 1 Hz 处的增益就是低频增益,WHEN vdb(vout)=0是找增益过零点的频率,FIND vp(vout) WHEN ...是该频率处对应的相位。相位裕度 = 180 + phase_gbw,注意相位单位是度,如果波形给出的是负值要先取绝对值再算。这套 measure 语句的意义在于:每次改尺寸后重跑,一条命令就能看到相位裕度变了多少,不用靠眼睛估。
4.4 瞬态仿真验证摆率与建立时间
AC 只反映小信号,摆率和建立时间必须用瞬态验证。把电路接成单位增益缓冲,输入端加 0.2 V 的阶跃,观察输出的上升沿。摆率取输出从 10% 到 90% 的斜率,如果实测明显低于 SR = I5/Cc 的估算值,说明第一级尾电流不够或者补偿电容偏大。建立时间关注的是输出进入 ±0.1% 误差带之后不再出来所需的时间,这里最容易暴露的是相位裕度不足导致的长尾振荡。
| 仿真项 | 激励设置 | 关键读数 | 不达标时的调整方向 |
|---|---|---|---|
| 直流工作点 | .op | 各管 region、Vds−Vdsat | 调偏置电压、镜像比 |
| 开环增益 | .ac dec 100 1 1G | 低频增益 dB | 加大 L、提高 gm/Id |
| 相位裕度 | 同上 | 过零点相位 | 加 Rz、加大 Cc、提高 gm6 |
| 摆率 | 0.2 V 阶跃 | 10%→90% 斜率 | 加大尾电流 I5 |
| 建立时间 | 单位增益缓冲 | ±0.1% 带内时间 | 调相位裕度,先保证 60° 以上 |
| 共模抑制 | 共模小信号扫频 | 共模增益 | 提高尾电流源输出阻抗 |
5. 版图匹配、寄生提取与后仿:把仿真值和实测值拉到一起
5.1 差分对的共质心版图与截面图上的寄生
两级运放的版图里,差分对 M1/M2 和电流镜 M3/M4 的匹配决定失调,共质心交叉布局是常规做法:把每只管子拆成偶数个指状结构,沿对角线交叉放置,让梯度方向的工艺偏差互相抵消。从截面图看,每个指状结构的源漏扩散区往下都有一层衬底寄生电容,金属走线再叠一层层间电容,这些寄生在原理图里是不存在的。第一级输出节点是高阻节点,多挂几十 fF 就会把主极点往低频推,增益带宽积跟着缩,所以这一段的走线要短、要宽,但也不能太宽导致对衬底电容增加。
5.2 后仿流程与寄生参数提取
后仿的基本流程是:版图完成 DRC 和 LVS 之后,做寄生参数提取,输出带寄生标注的网表,把原来原理图网表里的器件替换成带寄生的版本,再重跑一遍 DC/AC/瞬态。对比前后两次的相位裕度和 GBW,一般 GBW 会下降 10%~25%,相位裕度下降几度到十几度。如果前仿相位裕度只有 60 度,后仿掉到 50 度以下就得回去调 Cc 或 Rz。常见的做法是前仿时把相位裕度做到 65~70 度,给后仿留出余量。
5.3 用工作在深线性区的 MOS 做可调零电阻
调零电阻 Rz 用多晶硅电阻做会多一道工艺,更常见的做法是用一只工作在线性区的 MOS 管替代,栅压从偏置链路引出来,版图上就是一只普通管子。它的等效电阻是 1/(μCox·(W/L)·(Vgs−Vth)),通过栅压就能连续调节零点位置。调到极端情况时零点会被推到左半平面很远的地方,反而在高频处贡献相移,所以要配合 AC 扫描边调边看。判断标准很简单:调 Rz 的过程中相位裕度先升后降,取峰值附近那个栅压就对了,这一组值记进报告里,比只写一个标称值有说服力。
本文还有配套的精品资源,点击获取