简介:一份围绕 PSpice 元器件模型创建与参数设置的实操文档,面向使用 Cadence/OrCAD 做电路仿真的初学者,以及需要自建元件库的工程人员,重点解决软件自带模型库参数难以满足实际设计需求、新建元件缺少可用仿真模型的问题。文档说明了模型参数修改的入口与编辑器各栏功能,并分别讲解 Model Editor 图形化建模与模型文本编辑两条路径,涵盖模型命名、典型曲线描述、样本模板套用、参数描述语言书写,以及从 lib 到 olb 的库分配与调用流程;对宏模型的由来与分类也有交代,并给出行为级宏建模的实例。整包仅 1 个 doc 文件,约 1003KB,篇幅集中,便于按章节查阅。该文档已有 1149 人学习下载,可作为仿真建模入门与日常查阅的参照。
1. PSpice 模型创建:从一句 Unknown model 说起
仿真跑完,波形平得像一条直线,日志里只留一句 Unknown model,回头查了半小时发现电路没接错,是模型压根没进仿真配置。PSpice 模型创建这件事,说白了就是给每个元器件补一份仿真器认得的数学身份证:二极管靠 IS、RS、CJO 描述结特性,逻辑芯片靠一段子电路网表描述电平和延时。它解决的是「原理图能连通、仿真算不出」的断层——自带库给的是典型值,你手上的批次、你跑的温度点、你的驱动条件不一定对得上。做电源、做接口防护、做逻辑时序验证的人,早晚会走到自己建模型这一步,区别只是早一点动手还是被报错逼着动手。
2. 改参数与挂载模型库:三件套文件与右键编辑的边界
2.1 自带库不够用的三种典型场景
很多人第一次碰模型创建,不是因为想研究建模理论,而是被现实逼的。常见有三种情况。第一种是选型偏门,库里搜不到对应型号,只有一颗参数相近的通用器件,直接拿来仿真,正向压降和结电容差了一截,算出来的开关损耗自然不准。第二种是同一型号不同批次,阈值电压、饱和电流有离散性,做最坏情况分析时得手动把参数往边角推,这时不能改公共库,只能派生一份私有模型。第三种是评估温度、驱动强度、寄生参数的影响,自带模型里温度系数和结电容往往按典型条件填,扫到零下四十度或者一百二十五度就开始失真。
这三种场景对应同一个技术动作:在已有模型基础上做参数层面的修改或派生。它和从零创建模型的区别在于,前者保留模型的拓扑结构,只动数值;后者要连描述方式一起选。分清楚这一点很关键,因为改参数十分钟能搞定,建模型可能要花半天对数据手册。
2.2 右键 Edit PSpice Model:改参数的最小闭环
最省事的路径是在原理图里选中元件,右键选择 Edit PSpice Model,模型编辑器会被直接拉起,并且定位到该元件引用的那个模型名。进入编辑器后界面分三块:Models List 栏列出当前模型库里的所有模型名,用来确认你改的是哪一颗;Simulation Parameters 栏是参数表格,双击数值即可修改;Model Text 栏显示对应的模型描述文本,这一栏是只读的,想改文本得另存成 .lib 文件后在外部编辑。
这里有个血泪经验:直接改公共库里的模型,影响的是所有引用该模型的实例,包括你半年前画好的另一张图。正确做法是先复制一份,改模型名,比如在原名字后面加批次或温度后缀,再在新模型上动参数。改完之后存盘,回到原理图,元件属性里的模型名要同步指向新名字,否则你改的和仿真用的根本不是同一个。
提示:改完参数不要立刻跑完整瞬态,先做一次直流扫描,看正向导通段和反向击穿段是否落在数据手册的区间内,确认模型没被改坏再往下走。
参数修改的验证逻辑是:直流扫描看静态工作点,交流扫描看结电容带来的高频滚降,瞬态看反向恢复时间。三个都对得上,模型才算能用。
2.3 .lib、.olb、.ind:三个文件各管一段,缺一个都跑不通
初学者最容易翻车的地方是把符号库当成模型库。原理图里能放出一个元件,只代表符号库 .olb 被加载了,仿真器能不能算出结果,取决于模型库 .lib 有没有进仿真配置。这两件事是分开的。
| 文件类型 | 承担的角色 | 缺失后的表现 |
|---|---|---|
| .lib | 模型文本,仿真器读取参数的地方 | 报 Unknown model 或找不到子电路 |
| .olb | 符号图形、引脚编号与引脚名映射 | 原理图里放不出元件,或引脚对不上 |
| .ind | 库索引,加速库列表加载 | 库列表刷新慢,偶尔找不到新增条目 |
挂载路径分两步走。第一步在元件放置环节把 .olb 加进符号库列表,保证能画出图;第二步打开仿真配置里的 Library 选项卡,把 .lib 加入设计级或全局级库列表,保证仿真器能解析。设计级只对当前工程生效,全局级对所有工程生效,我一般先用设计级验证,稳定之后再考虑放全局,避免一个坏模型污染所有项目。
* 一个最简 .lib 片段,验证挂载是否成功 .MODEL MY_D D ( + IS=1.0000E-15 + RS=1.0000E-3 + CJO=1.0000E-12 + M=.3333 + VJ=.75 + BV=100 + IBV=100.00E-6 + TT=5.0000E-9 + )这段文本存成 .lib 之后,通过仿真配置的库列表挂进去,原理图里放一个二极管符号,把它的模型名改成 MY_D,就能跑通了。逻辑说明:.MODEL后面第一个字段是模型名,第二个字段是模型类型关键字,括号里是参数键值对,续行用加号开头,每行不超过 132 个字符。参数说明:IS 是饱和电流,决定正向压降的量级;RS 是串联体电阻,影响大电流段的斜率;CJO 是零偏结电容,直接决定开关瞬态的边沿陡度;TT 是渡越时间,影响反向恢复。想验证挂载有没有生效,最直接的办法是故意把模型名写错一个字母,看仿真器是否报错,报错说明配置路径通了,只是名字不匹配。
3. Model Editor 建模型:曲线拟合、参数面板与导入向导
3.1 新建模型的三个入口选项,选错了后面全是返工
从开始菜单的 PSpice 附件组进入 Model Editor,执行 File 下的 New 命令,会弹出新建模型对话框。对话框里三个选项看着简单,选错方向后面要重来。
第一个是 Use Device Characteristic Curves,用器件数据手册上的典型曲线来反推参数。它适合手里有完整数据手册、能读到正向特性曲线和电容电压曲线的场景,编辑器会让你在曲线上点几个关键点,然后自动拟合参数。第二个是 Use Templates,从软件自带的模板出发改参数,适合常见的二极管、三极管、MOS 管,模板已经把模型拓扑定好了,你只需要填数值。第三个是 From Model,直接指定模型类型,从空白参数表开始填,适合结构特殊或者要完全自定义的器件。
我一般这么选:有数据手册曲线就选第一个,拟合出来的参数和实测最接近;只有几个关键参数就选第二个,省事且不容易漏项;要做非标器件或者宏模型就选第三个,从空白起步反而干净。选完点确定,进入编辑器主窗口,左边是参数区,右边是曲线显示区,改一个参数曲线立刻重画,这种实时反馈是文本编辑给不了的。
3.2 参数面板与实时曲线:怎么判断拟合已经收敛
编辑器里的参数区不是所有参数都同等重要。以二极管为例,按影响程度排,IS、RS、CJO 这三个先调,它们分别管正向压降、大电流斜率和瞬态边沿;VJ、M 管结电容随反偏电压的变化趋势,属于第二梯队;BV、IBV 管击穿段,只有做防护电路才需要仔细调;TT 管反向恢复,做开关电源的必须对。
判断拟合是否收敛有个笨办法但很有效:把数据手册的曲线截图放在旁边,一边改参数一边目测编辑器里的曲线和截图的贴合程度。正向段看两个点,一个是小电流下的压降,一个是大电流下的压降,两点都对上说明 IS 和 RS 配合正确;电容段看零偏容值和反偏五伏时的容值,两个点对上说明 CJO 和 VJ 合理。如果曲线整体偏高或偏低,优先动 IS;如果曲线形状对但斜率不对,动 RS;如果电容曲线拐点位置不对,动 VJ。
参数区还有一个 Reverse Leakage 栏,用来指定曲线上某个特定点的横纵坐标值,编辑器会据此微调参数。这个功能在数据手册只给了个别离散点、没给完整曲线时特别有用。
注意:曲线拟合得再漂亮,也只是在拟合那几个点。仿真跑到拟合区间之外,比如深度击穿或者极低电流区,误差会迅速放大。做最坏情况分析时,要主动把参数往边角推一推,看结果是否仍可接受。
3.3 Model Import Wizard:把 .lib 变成能画图的 .olb
参数调完保存成 .lib,这一步只完成了仿真侧的工作。原理图侧还需要一个符号,否则你没法把器件放到图上。Model Editor 里执行 File 下的 Model Import Wizard,弹出 Specify Library 对话框,输入刚保存的 .lib 路径,指定输出的 .olb 路径,向导会读取 .lib 里的模型定义,自动生成对应的符号,并把引脚按模型里的节点顺序映射好。
这一步最容易出的问题是引脚顺序。自动生成的符号引脚编号是按 .lib 里节点出现的先后顺序排的,如果模型定义时节点顺序写成了「阳极、阴极」而实际器件封装是「阴极、阳极」,符号画出来是对的,连线上也没报错,但仿真结果整个反了。所以导入完成后一定要打开符号看一眼引脚名,必要时手动调整引脚映射。
回到原理图,通过放置元件的方式把新生成的 .olb 加进库列表,就能调用这个元件了。放上去之后,元件属性里的模型名应该自动指向 .lib 里的模型,如果没有,手动填一次。此后想再改参数,右键 Edit PSpice Model 又能回到编辑器,形成闭环。
4. 手写 .lib 与宏模型网表:从二极管参数到行为级子电路
4.1 二极管模型十个参数,各自管哪一段曲线
文本建模的第一步是把参数和物理行为对应起来。下面这张表是我自己贴在显示器边上的对照,调参数时先查它再动手。
| 参数 | 物理含义 | 典型量级 | 主要影响 |
|---|---|---|---|
| IS | 饱和电流 | 1e-15 A | 正向压降整体水平 |
| RS | 串联体电阻 | 1e-3 Ω | 大电流段斜率 |
| CJO | 零偏结电容 | 1e-12 F | 瞬态边沿与开关损耗 |
| M | 结梯度系数 | 0.3333 | 结电容随反偏电压的衰减形状 |
| VJ | 内建电势 | 0.75 V | 电容曲线的拐点位置 |
| ISR | 复合电流 | 1e-10 A | 低电流区的非理想性 |
| BV | 反向击穿电压 | 100 V | 击穿发生的电压点 |
| IBV | 击穿点电流 | 1e-4 A | 击穿段的陡度 |
| TT | 渡越时间 | 5e-9 s | 反向恢复电荷与时间 |
| N | 发射系数 | 1.0 附近 | 正向曲线的理想因子 |
调参顺序建议按「先静态后动态」:先用直流扫描把 IS、RS、N 调到正向曲线贴合,再用反偏扫描把 CJO、VJ、M 调到电容曲线贴合,最后用瞬态把 TT 调到反向恢复时间贴合。每调一轮存一次盘,命名带上日期,翻车了能退回去。
4.2 网表语法边界:132 字符、续行符与两类声明
手写模型最容易犯的错不是参数写错,是语法踩线。三条硬规则:每行不超过 132 个字符,超了必须用加号续行;注释行以星号开头;模型声明用.MODEL,子电路声明用.SUBCKT起、.ENDS止,两者不能混用。
* 自定义二极管模型,带完整参数 .MODEL DIODE_CUSTOM D ( + IS=1.0000E-15 + RS=1.0000E-3 + CJO=1.0000E-12 + M=.3333 + VJ=.75 + ISR=100.00E-12 + BV=100 + IBV=100.00E-6 + TT=5.0000E-9 + ) * 一个两端口子电路,供原理图以 X 器件方式调用 .SUBCKT RC_FILTER IN OUT PARAMS: RVAL=1K CVAL=1N R1 IN OUT {RVAL} C1 OUT 0 {CVAL} .ENDS RC_FILTER逻辑说明:第一段是模型声明,模型名 DIODE_CUSTOM,类型 D,括号内是参数。第二段是子电路声明,.SUBCKT后面依次是子电路名、端口列表、可选参数声明;内部用 R、C 等器件关键字连接节点;.ENDS关闭定义。参数说明:PARAMS:后面定义的变量在子电路内部用花括号引用,原理图调用时可以通过属性覆盖,这样一份子电路能当多个不同参数的滤波器用,省去重复建模。端口顺序决定符号引脚顺序,写反了符号引脚就反,前面提过这个坑。
4.3 行为级宏模型:LOGICEXP、PINDLY、CONSTRAINT 三件套分工
规模大的芯片做晶体管级仿真不现实,宏模型就是在这个时候顶上的。行为级宏建模的核心思路是:不描述内部每个管子怎么接,只描述端口上看到的逻辑关系、延时和时序约束。
以一款四位同步加减计数器为例,子电路里通常分三块。第一块用逻辑表达式器件把输入到输出的组合逻辑写出来,包括计数方向、使能、加载、进位借位这些关系;第二块用延时器件把输出相对输入的传输延时加上,并且区分上升沿和下降沿的不同延时;第三块用时序约束器件把建立时间、保持时间、最小脉宽、最高频率这些限制声明出来,仿真器据此做时序检查,违反时给出告警。
.SUBCKT CNT4_ABM CLK UD EN LOAD A B C D QA QB QC QD RCO * 逻辑关系:用表达式描述计数与加载 LOG1 LOGICEXP(9,6) DPWR DGND + CLK UD EN LOAD A B C D + QA QB QC QD RCO + BOOLEAN: + UPDN = { UD } + CNTEN = { EN & ~LOAD } + QA = { CNTEN & ~QA } + QB = { CNTEN & (QB ^ QA) } + QC = { CNTEN & (QC ^ (QB & QA)) } + QD = { CNTEN & (QD ^ (QC & QB & QA)) } + RCO = { QD & QC & QB & QA & ~UPDN } * 延时:区分上升沿与下降沿 DLY1 PINDLY(6,0,6) DPWR DGND + QA QB QC QD RCO CLK + QA_D QB_D QC_D QD_D RCO_D + IO_STD + MNTYMXDLY = {MNTYMXDLY} + BOOLEAN: + CLKEDGE = { CHANGED_LH(CLK,0) | CHANGED_HL(CLK,0) } + PINDLY: + QA_D QB_D QC_D QD_D RCO_D = { + CASE( + CLKEDGE & TRN_LH, DELAY(2NS,-1,13NS), + CLKEDGE & TRN_HL, DELAY(2NS,-1,13NS), + DELAY(2NS,-1,13NS) + ) + } * 时序约束:声明检查规则 CON1 CONSTRAINT(4,0,4) DPWR DGND + CLK A B C D + FREQ: + NODE = CLK + MAXFREQ = 50MEG + WIDTH: + NODE = CLK + MIN_LOW = 8NS + MIN_HIGH = 8NS + SETUP_HOLD: + DATA(4) = A B C D + CLOCK LH = CLK + SETUPTIME = 6NS .ENDS CNT4_ABM逻辑说明:第一段 LOGICEXP 器件负责逻辑,括号里两个数字是输入和输出端口数量,BOOLEAN:之后逐行写表达式,花括号内是布尔运算。第二段 PINDLY 器件负责延时,CASE结构按边沿类型选不同延时值,三个参数分别是典型值、最小值、最大值,做最坏情况分析时仿真器会在区间内取值。第三段 CONSTRAINT 器件负责时序检查,FREQ、WIDTH、SETUP_HOLD是三类检查项,违反时输出告警而不中断仿真。
参数说明:延时里的NS单位不能省,省了按秒算,波形会离谱到看不出问题在哪;MNTYMXDLY是全局延时档位选择,配合仿真配置里的最坏情况设置使用;建立时间检查里的WHEN条件可以用来只在特定使能状态下做检查,避免误报。这套写法的门槛在于表达式语法严格,少一个括号、多一个空格都可能解析失败,写完先做一次语法检查再跑仿真。
4.4 数学宏模型与表格宏模型:函数拟合与查表的两条路
除了行为级,还有两条更轻的路子。数学宏模型用受控源加数学表达式直接描述端口关系,比如一阶低通滤波器,用一个电压控制电压源配拉普拉斯表达式就能写出来,不需要画电阻电容。它的优点是参数少、仿真快,缺点是完全脱离物理结构,只能反映输入输出关系。
表格宏模型更进一步,把实测数据点直接列进去,仿真时按点查表插值。非线性器件尤其适合这条路:所有元件都是线性的,但端口关系非线性,写不出解析式,手里只有一堆测试数据。用法是把数据点按「电压,电流」的形式列在受控源后面,仿真器在两个点之间做线性插值。
* 表格宏模型:用实测数据点描述非线性电导 GTUNNEL N1 N2 TABLE {V(N1,N2)} = + (0,0) (0.01,2.153M) (0.02,2.973M) + (0.03,4.567M) (0.04,5.155M) (0.05,5.402M)逻辑说明:G 开头的受控源表示电压控制电流源,TABLE关键字后面跟控制变量表达式,等号右边是数据点对。参数说明:每个括号里第一个数是控制电压,第二个数是对应电流,单位分别是伏和安;点与点之间仿真器做线性插值,所以采样点密度决定精度,曲率大的地方要多放点。这套写法在原理图里对应一个 TABLE 符号,属性里按同样格式填数据对即可,不用手写网表。
两条路的共同限制是:宏模型只在一定精度范围内有效,超出数据覆盖区间就是外推,结果不可信;模型结构要尽量简单,堆太多分段反而拖慢仿真还容易不收敛。
5. 常见问题排查:五类翻车现场的现象、原因与解决
5.1 现象:仿真一启动就报 Unknown model
原因基本只有两个:模型库没进仿真配置,或者模型名对不上。前者是只挂了 .olb 没挂 .lib,原理图能画但仿真器读不到参数;后者常见于手动改了元件属性里的模型名,但 .lib 里没有对应条目,或者大小写不一致。
解决顺序是固定的:先打开仿真配置的库列表,确认 .lib 在里面且路径有效;再打开 .lib 用搜索功能找模型名,逐字符比对;最后检查有没有多个同名库冲突,旧版本库排在前面会遮住新库。我一般会在库列表里只留当前工程要用的库,避免这种遮蔽问题。
5.2 现象:仿真能跑完,但波形方向反了或者数值差一个量级
这种最隐蔽,因为不报错。原因通常是引脚映射错了,或者子电路端口顺序和符号引脚顺序不一致。二极管方向反了,正向段变成反向击穿段;三极管集电极和发射极对调,放大区整个变形。
解决办法是回到符号编辑器,把引脚编号和模型里的节点顺序一一对照。子电路定义里.SUBCKT后面的端口顺序就是节点顺序,符号上第几个引脚连第几个节点必须严格对应。对照完再跑一次直流扫描,看正向段和反向段的位置是否符合预期,这是最快的确认方式。
5.3 现象:加了宏模型之后仿真不收敛,时间步长越跑越小
宏模型不收敛的原因比器件模型多。常见三种:延时参数给了零或者负值,仿真器在边沿处反复试探;初始状态没定义,逻辑器件上电时处于不确定态;时序约束写得太紧,仿真器不断回退重算。
处理办法是先简化,把约束器件整段注释掉,只留逻辑和延时,看能不能收敛;能收敛说明问题在约束条件,逐条加回去定位。然后把所有延时改成典型值,去掉最小最大档位,排除最坏情况取值带来的振荡。最后给关键节点加初始条件,用.IC或者器件的初始态属性,让上电状态确定下来。
注意:宏模型的延时值不要写成零。零延时在数学上意味着无穷大斜率,仿真器只能靠不断缩小步长去逼近,时间推进不动。
5.4 现象:常温仿真正常,一加温度扫描就崩或者结果离谱
器件模型里温度相关的参数没填全。二极管的自带模型至少有饱和电流的温度系数和禁带宽度参数,MOS 管还有迁移率温度系数,这些缺了,温度一变化模型就外推到不合理区间。
解决方式是回到模型编辑器,把温度相关参数补上,或者直接用带温度系数的模型模板重做一份。补完之后单独跑一次温度扫描,只扫一个器件,看它的正向压降随温度的变化斜率是否符合物理规律。常温能跑不代表全温域能用,这是两回事。
5.5 现象:今天配好的模型,明天打开工程又找不到了
库路径用了绝对路径,工程换目录或者换机器之后就断链;或者模型放在了临时目录,被清理掉了。这种情况在多人协作时尤其常见。
稳妥做法是把自定义的 .lib 和 .olb 放在工程目录下的固定子目录里,配置时用相对路径引用;工程打包时把整个目录一起带走;库列表里把自定义库放在靠前位置,避免被系统库里的同名模型遮蔽。我自己的习惯是每个工程建一个 model 子目录,所有自建模型只放这里,绝不往公共库目录里塞东西。
6. 验证与进阶:让模型在动态系统里跑一遍才算数
模型建完、参数调完、避坑走完,最后一步是验证它在真实使用场景下站不站得住。我的做法分三层,从便宜到贵依次来。
第一层是静态验证,直流扫描比对数据手册。把正向导通段的几个电流点对应的压降列成表,和手册逐点比对,误差超过百分之十就回去调 IS 和 RS。这一步只要几秒钟,能挡掉大部分参数填错的问题。
第二层是动态验证,瞬态看反向恢复和边沿。给器件加一个方波激励,串一个采样电阻,看电流波形上的恢复尖峰和恢复时间,和手册的反向恢复电荷对照。这里最容易忽略的是测试条件——手册给的恢复时间是在特定正向电流、特定 di/dt 下测的,你的激励条件不一样,结果自然对不上,先对齐条件再比数值。
第三层是系统级验证,把模型放进整体电路跑一遍。做电源的看效率曲线和环路稳定性,做接口的看浪涌下的钳位表现,做逻辑的看时序裕量。这一层最能暴露问题,因为单器件模型在孤立测试下往往表现良好,一进系统就露馅,比如结电容导致的振铃、延时参数导致的关键路径违例。
| 验证层级 | 激励方式 | 关注量 | 通过标准 |
|---|---|---|---|
| 静态 | 直流扫描 | 正向压降、击穿电压 | 与手册误差在允许区间 |
| 动态 | 方波瞬态 | 反向恢复时间、边沿 | 同测试条件下趋势一致 |
| 系统 | 完整电路 | 效率、时序裕量、振铃 | 满足设计指标且有余量 |
进阶用法上,行为级宏模型真正发挥价值的地方是动态系统仿真。把系统拆成若干子系统,每个子系统用行为级模型描述,再用信号线连起来,整个系统的时域响应几秒就能算完。调参的时候改传递函数的系数,波形立刻变,比搭晶体管级电路快两个数量级。前提是每个子系统的宏模型都做过前面三层验证,否则误差会在系统级累积放大。
从那以后我每次交付模型前,都强制走一遍「直流扫描、瞬态恢复、系统联调」这三步,缺一步都不敢往库里放。早年有过一次,模型单测漂亮,装进整机跑出来的效率比实测高了五个点,查了两天才发现是结电容填小了一个量级,那次之后这个习惯就再没破过。希望帮到你。
本文还有配套的精品资源,点击获取