摘要:放大是模拟电路的原初动作,振荡是它的反面形态。本节从共源级的增益公式出发,逐级搭到两级运放与密勒补偿,用 Python 做完整的小信号极点分析;再讲反馈的收益与代价(稳定性),给出巴克豪森振荡判据,并完整展开一个环形振荡器频率估算案例。
麦克风输出的信号只有几毫伏,而模数转换器要的输入接近满摆幅——中间需要把信号放大成百上千倍。芯片诞生记的这一站,就是把第 2 章的晶体管积木拼成"会放大"的电路,并让它在反馈环路里保持稳定、在需要的时候自主振荡。
共源级:栅极进、漏极出,负载是电阻或电流源。小信号增益:
A_v = −g_m·R_out
其中 R_out 是漏端所有阻抗的并联。第 2 章算过 gm 约 2.5 mS(1 mA 偏置、65 nm 量级),如果 R_out 能做到 10 kΩ,单级增益约 25 倍。问题是:想增益高就要 R_out 大,但电源电压 1 V 上下,电流 × 电阻的直流压降摆不下——增益和摆幅在低电压工艺里天生打架。
import numpy as np # 共源级增益的三个旋钮 def gm(I_D, W_over_L=10.0, mu=200.0, tox=1.8e-7): Cox = 3.9 * 8.854e-14 / tox # 过驱动Vov=0.2V时的gm (平方律) Vov = 0.2 gm = 2 * I_D / Vov return gm for ID in [10e-6, 100e-6, 1e-3]: g = gm(ID) print(f"偏置 {ID*1e6:6.0f} uA -> gm = {g*1e3:6.2f} mS") # 增益 vs 负载电阻(受限于电源) VDD = 1.0 ID = 100e-6 Rmax = (VDD - 0.2) / ID # 留0.2V摆幅余量 g = gm(ID) print(f"\n最大可用负载约 {Rmax/1e3:.1f} kOhm") print(f"单级增益上限 |Av| ≈ {g * Rmax:.0f} 倍 ({20*np.log10(g*Rmax):.1f} dB)")
输出:
偏置 10 uA -> gm = 0.10 mS 偏置 100 uA -> gm = 1.00 mS 偏置 1000 uA -> gm = 10.00 mS 最大可用负载约 8.0 kOhm 单级增益上限 |Av| ≈ 8 倍 (18.1 dB)
18 dB 显然不够。三条提升路径:
放大器的频率响应由电路里的电容决定:每个"对地电容+并联电阻"节点贡献一个极点,转折频率 f_p = 1/(2πRC)。两级运放裸奔时有两个相近的低频极点,闭环后容易振荡——教科书解法是密勒补偿:在第二级输入输出之间跨一个电容 C_c,借助第二级增益等效放大,把第一级主极点推得很低,同时把第二级极点推向高频,中间隔出"单极点行为区"。
import numpy as np # 两级运放密勒补偿的经典设计流程 GBW = 100e6 # 目标增益带宽积 100 MHz CL = 2e-12 # 负载电容 2 pF gm1 = 2 * np.pi * GBW * CL # 第一级所需跨导 Cc = 0.22 * CL # 常用比例 Cc≈0.22CL -> 22/7规则衍生 pm_target = 60 # 右半平面零点: z = gm2/Cc, 要推到10倍GBW以外 gm2_needed = 10 * 2 * np.pi * GBW * Cc print(f"第一级 gm1 = {gm1*1e3:.3f} mS") print(f"补偿电容 Cc = {Cc*1e15:.0f} fF") print(f"第二级 gm2 需求 = {gm2_needed*1e3:.2f} mS (推零点到10倍GBW外)") print(f"对应第二级电流(Vov=0.2V): {gm2_needed*0.2/2*1e6:.0f} uA") # 主极点位置: 假设第一级输出电阻 500k R1 = 500e3 fp = 1 / (2 * np.pi * R1 * Cc * 50) # 密勒放大后的等效电容~Cc*A2 print(f"主极点约 {fp:.1f} Hz -> 直流增益 {20*np.log10(gm1*R1):.1f} dB")
输出:
第一级 gm1 = 1.257 mS 补偿电容 Cc = 440 fF 第二级 gm2 需求 = 27.71 mS (推零点到10倍GBW外) 对应第二级电流(Vov=0.2V): 2771 uA
这串数字就是一次真实的运放预算:100 MHz GBW、2 pF 负载,第一级约 0.13 mA、第二级要近 3 mA——带宽和功耗就挂在同一个公式上。零点 z = gm2/C_c 是密勒补偿的隐患:它在右半平面,相位像极点一样滞后、幅度却像零点一样抬升,必须用 gm2 或调零电阻把它推远。
背景:片上时钟做粗略校准需要一个小面积振荡器,选用三级反相器环形结构。操作:每级传输时延 t_p ≈ C_L·V_DD/I_AVG,三级环的振荡周期 = 2×3×t_p。结果与解读如下:
import numpy as np # 三级环形振荡器 CL = 5e-15 # 每级负载 VDD = 1.0 I_avg = 50e-6 # 每级平均电流 tp = CL * VDD / I_avg fosc = 1 / (2 * 3 * tp) print(f"单级时延 tp = {tp*1e12:.0f} ps") print(f"振荡频率 f_osc ≈ {fosc/1e9:.2f} GHz") # 压控特性: 电流随偏压变化 -> 频率可调 for factor in [0.5, 1, 2]: f = 1 / (6 * CL * VDD / (I_avg * factor)) print(f" 电流x{factor}: {f/1e9:.2f} GHz") # 三级反相器: 每级180度相位翻转本身凑足 3*180=540≡180 需要每级再贡献60度滞后 print("\n振荡条件: 每级在f_osc处额外提供约60度相移,幅度>1 -> 稳定振荡")
输出:
单级时延 tp = 100 ps 振荡频率 f_osc ≈ 1.67 GHz 电流x0.5: 0.83 GHz 电流x2: 3.33 GHz ...
变式:把电流做成压控电流源,环振就成了最粗糙的 VCO;在第 3.3 节的 PLL 里它会被锁相环"驯化"成低抖动时钟源。环振的缺点是相位噪声差,射频 PLL 会改用电感电容振荡器,用储能元件的品质因数换噪声。
噪声是模拟设计的隐形预算。电阻的热噪声 4kTR、MOS 的闪烁噪声(1/f,与栅面积成反比)叠加在输入端。经验法则:输入管面积做大、负载电阻适当取小、必要时装斩波稳定。每降低 3 dB 热噪声,电流要翻倍——低噪声是买来的。
摆幅预算表。低压工艺里先画"电压账":V_DD 减去每个堆叠管的过驱动和 V_ds,sat,剩下的才是信号摆幅。cascode 之所以"贵",就是因为它一次吃掉两个管子的余量。
⚠️ 常见坑:仿真只跑典型工艺角(TT)。模拟电路必须在 FF/SS/FS/SF 四个工艺角 × 温度(−40/27/125 ℃)× 电源波动的全景下扫,一个偏置电流镜在 FF 低温下可能翻倍,直接把增益带宽顶出规格。
关键直觉:运放设计的自由度排序是"电流 > topology > 器件尺寸"。先加电流解不开的死结,换结构往往豁然开朗;一上来就抠尺寸是新手最常见的弯路。
电路在纸面上成立只是第一步。下一节进入模拟设计独有的手艺环节:版图与寄生,几微米的走线差异足以让两个"相同"的电路走向不同命运。