最近翻了翻自己攒了大半年的LDO设计合集,从 undergrad 摸鱼到现在改了好几版,终于把几种经典结构、仿真库还有配套的工艺库打包整理好了,今天掏出来唠唠
最后说一下合集里的设计报告,不是那种八股文式的论文报告,就是我自己记的流水账:第一次振荡的波形图、调补偿电容的过程、不同工艺转角下的仿真结果,还有我踩过的所有坑——比如忘了加启动电路导致LDO不工作、分压电阻的精度不够导致输出偏差、功率管的衬底偏置没接导致阈值电压变化等等。这段脚本跑起来之后,会生成四个txt文件,每个里面对应不同宽度的功率管的输出电压,我当时就是靠这个快速找到了最合适的50微米宽
首先说最入门的那款,也就是大家最常看到的分压反馈+运放+功率管的基础结构。说白了就是用反馈把输出电压钉在你想要的数值上,运放当大脑,功率管当苦力扛电流。一开始我还嫌这种结构太简单,直到第一次搭的时候把分压电阻接反了,跑出来输出电压比输入还高,尬得我抠了半天脚。
给你们看一下我当时写的入门SPICE网表,没搭真实运放,用了个简化的电压增益块先把逻辑跑通:
* 基础单级运放LDO测试网表
.lib "smic18rf.lib" tt 25 1.8V // 抽出来的中芯18nm工艺库,不用下完整大包
vin vcc 0 DC=3.3V // LDO的输入电源,比目标输出高一点
* 输出电压采样分压:把Vout降到参考电压级别
r_top out_node fb_node 100k // 上拉到输出节点
r_bot fb_node 0 10k // 下拉到地,采样比11:1
e_amp amp_out 0 fb_node 0 1000 // 简化运放模型,增益1000,方便快速看反馈逻辑
* PMOS功率管:源极接电源,漏极接输出,栅极接运放输出
m_pwr out_node amp_out vcc vcc pmos L=0.18u W=20u
* 模拟实际负载:100欧电阻加100nF电容
rl out_node 0 100
cl out_node 0 100n
* 仿真指令:瞬态看启动过程,直流看输出精度
.tran 0 10ms 0 1us
.dc vin 3.3 3.3 0
.print tran v(out_node)
.print dc v(out_node)
.end
这段跑起来之后,输出电压会稳定在3V左右,误差也就几mV,完全够用入门测试。当初我就是靠这个网表搞懂了LDO的基本反馈逻辑,比看十篇论文都管用。
刚才那款入门款的问题也很明显,运放增益不够,导致输入输出压差大,要是给电池供电的设备用,耗电就快了。所以我后来改成了折叠cascode运放的结构,增益能拉到80dB以上,压差就能压到几十mV,甚至十几mV。
给你们看一下进阶版的网表片段,这次没有用简化运放,搭了个真实的折叠cascode运放:
* 折叠cascode运放LDO,低压差优化版
.lib "smic18rf.lib" tt 25 1.8V
vin vcc 0 DC=3.3V
* 分压采样和入门款一样,目标输出1.8V
r_top out fb 100k
r_bot fb 0 10k
* PMOS功率管,宽长比调大到50u,扛100mA电流没问题
m_pwr out gate_p vcc vcc pmos L=0.18u W=50u
* 折叠cascode运放:差分对用PMOS,电流镜负载,cascode管提升增益
mp1 gate_p in_p vcc vcc pmos L=0.18u W=2u
mp2 amp_out in_p vcc vcc pmos L=0.18u W=2u
mn1 in_p bias 0 0 nmos L=0.18u W=1u
mn2 in_n bias 0 0 nmos L=0.18u W=1u
* 电流镜偏置
mp3 bias vcc vcc vcc pmos L=0.18u W=5u
mp4 bias vcc vcc vcc pmos L=0.18u W=5u
* cascode管,提升输出阻抗,增大增益
mn3 amp_out bias2 0 0 nmos L=0.18u W=1u
* 这里省略了带隙基准偏置电路,实际做的时候必须加,不然温度一飘就炸
* 负载还是100欧+100nF
rl out 0 100
cl out 0 100n
* 跑个AC仿真看环路增益,判断稳定性
.ac dec 10 1 100Meg
.print ac v(amp_out)/v(fb)
.end
当初搭这个运放的时候,光是调偏置电流就调了一下午,一开始电流太小,运放响应太慢,负载一变就振荡;电流太大又浪费电。后来加了米勒补偿电容才把振荡问题解决,这个坑我在设计报告里写得清清楚楚,谁看谁踩过的都懂。
不光有网表,我还写了几个Python脚本用来批量仿真,比如用来扫功率管的宽长比,或者扫负载电流的变化。比如这段用PySpice写的批量扫宽长比的脚本:
import PySpice.Logging.Logging as Logging
logger = Logging.setup_logging()
from PySpice.Spice.Netlist import Circuit
from PySpice.Unit import *
# 批量扫描功率管宽度,找最优的宽长比
def sweep_ldo_pwr_w(width_list):
for w in width_list:
circuit = Circuit(f"LDO_PWR_W_{w}um")
# 加载提前抽好的工艺库
circuit.lib("smic18rf.lib")
# 电源和分压
circuit.V("input", "vcc", 0, 3.3)
circuit.R("r_top", "out", "fb", 100@u_kΩ)
circuit.R("r_bot", "fb", 0, 10@u_kΩ)
# 功率管,循环改宽度
circuit.MOSFET("pwr", "out", "gate", "vcc", "vcc", model='pmos', L=0.18@u_µm, W=w@u_µm)
# 简化运放模型,快速仿真
circuit.E("amp", "gate", 0, "fb", 0, 1000)
# 测试负载
circuit.R("load", "out", 0, 100@u_Ω)
circuit.C("load_cap", "out", 0, 100@u_nF)
# 运行直流仿真
simulator = circuit.simulator(temperature=25, nominal_temperature=25)
analysis = simulator.dc(Vinput=slice(3.3,3.3,0))
# 把结果存到文件里
with open(f"ldo_w_{w}um_result.txt", "w", encoding="utf-8") as f:
f.write(f"功率管宽度:{w}μm\n输出电压:{analysis['out'][0]:.4f}V")
print(f"完成宽度{w}μm的仿真")
if __name__ == "__main__":
# 扫10、20、30、50微米的宽长比
sweep_ldo_pwr_w([10,20,30,50])
这段脚本跑起来之后,会生成四个txt文件,每个里面对应不同宽度的功率管的输出电压,我当时就是靠这个快速找到了最合适的50微米宽度,既能扛住100mA的负载,又不会因为太宽导致启动时间过长。
最后说一下合集里的设计报告,不是那种八股文式的论文报告,就是我自己记的流水账:第一次振荡的波形图、调补偿电容的过程、不同工艺转角下的仿真结果,还有我踩过的所有坑——比如忘了加启动电路导致LDO不工作、分压电阻的精度不够导致输出偏差、功率管的衬底偏置没接导致阈值电压变化等等。
整个合集里还包含了SMIC18的抽取出的工艺模型,不用去官网下几百兆的完整库,直接就能用,还有三种经典结构的网表:入门单级款、低压差cascode款、还有集成了带隙基准的完整款。
要是有刚入门LDO设计的同学,直接拿过去改改参数就能跑,省得像我当初一样到处找资料还踩一堆坑。对了,要是你有更好的优化思路,比如用动态补偿之类的,也欢迎一起唠唠,我最近还在琢磨怎么把LDO的响应速度再提一提。
更多推荐


所有评论(0)