简介:这份PPT面向电子工程、集成电路设计方向的学生与工程师,系统梳理SPICE电路仿真语言的语法规则,帮助读者看懂并独立编写规范的电路网表。内容覆盖一般语法规定、信号源、无源元件、点命令与半导体器件等模块,具体讲解大小写与注释规则、节点0接地及直流通路要求、整数浮点与十种比例因子的数字表示、元器件名称首字母约定,以及独立源中指数源、脉冲源、正弦源、分段线性源的参数格式和网表整体结构。资源包共1个PPT文件,约1.03MB,以图文页面组织知识点,便于课堂讲解或自学翻阅。已有391人学习下载,适合作为模拟电路仿真入门的语法速查与复习材料。
1. 一份 PPT 里的 SPICE 语法:从网表到仿真的第一道门槛
很多人第一次跑 SPICE 仿真,卡住的地方不是电路理论,而是网表写不对。元件名首字母用错、节点悬空、时间单位少写一个u,仿真器直接报错或者给出一个看起来“能跑但结果离谱”的波形。这份《SPICE 的语法_927.ppt》把语法规则、信号源模型、无源元件、点命令和半导体器件首字母约定集中在一份材料里,适合刚接触网表仿真、需要把电路描述转成可执行文本的工程师和学生。它不教你电路怎么设计,但能让你少在“格式错误”上反复翻车。下面按网表结构、语法规则、信号源参数、点命令与避坑顺序拆开讲,每一步都落到能抄的写法。
2. 网表结构与语法规则:先让仿真器读懂你的电路
2.1 一份网表的骨架长什么样
SPICE 网表不是随手写的文本,它有固定的行序约定。材料里给出的结构是:标题行、描述行、信号源、元件、模型、点命令、.END结束。第一行是标题,仿真器会忽略它的内容,但这一行必须存在,否则某些版本会把第一行元件当成标题吞掉。常见做法是第一行写项目名或日期,第二行开始才是真正的电路描述。
一个最小可运行的无阻尼振荡电路网表如下,材料里给出的例子是 LC 并联回路,初始电流和初始电压都设为 1:
LC Oscillator Example C1 1 0 4p ic=1 L1 1 0 1/16 ic=1 .tran 0.1us 60us uic .print tran v(1) I(l1) .plot tran v(1) I(l1) .probe .end这段网表里,C1和L1是元件行,节点1和0分别是非地节点和地节点,4p是 4pF,1/16是电感值,ic=1指定初始条件。.tran 0.1us 60us uic表示瞬态分析,步长 0.1 微秒,总时长 60 微秒,uic告诉仿真器使用初始条件而不是先算直流工作点。.print和.plot分别把结果输出到列表和波形,.probe在部分版本里用于把波形数据存下来供后处理。.end必须放在最后一行,后面不要再写任何内容。
这里有个容易忽略的点:uic不是可有可无的修饰词。LC 回路没有电阻,直流工作点求解时电感相当于短路、电容相当于开路,如果不加uic,仿真器会先算一个直流解,可能直接报“无直流通路”或者把初始条件覆盖掉。材料里这个例子专门标了uic,就是为了让初始条件生效。
2.2 十一条语法规定里真正会咬人的几条
材料列了十一条一般语法规定,其中大部分是“知道就行”,但有几条在实际写网表时反复出问题。
第一条,大小写不敏感。程序处理时会把大写转成小写,所以VCC和vcc是同一个名字。这条本身不坑人,坑的是元件名首字母:V开头是电压源,v开头也是电压源,但如果你把电阻写成R1没问题,写成r1也没问题,可要是把电容写成C1却把首字母记成别的,仿真器会按首字母去匹配元件类型,直接报“未知元件”。
第二条,分号后面是注释。这条在调试时很有用,可以临时注释掉一行元件而不删掉它。但注意,分号必须是在行内,整行注释用星号*开头,材料里没展开讲星号,但常见 SPICE 实现都支持,写网表时我一般用*注释整行,用;注释行尾。
第三条,分隔符。空格、逗号、等号、左右括号都算分隔符,但只有第一个空格有效,其余连续空格忽略。这意味着C1 1 0 4p和C1 1 0 4p等价,但你不能用制表符混着空格去对齐列,某些老版本解析器对制表符处理不一致,血泪经验是统一用单个空格。
第五条,续行。以+开头的行是上一行的延续。这条在写长参数列表时很有用,比如一个脉冲源参数很多,可以折行:
VIN 3 0 PULSE(-1 1 2ns 2ns 2ns + 50ns 100ns)注意+后面要跟一个空格,然后才是续行内容。如果+顶格写但后面没空格,有的解析器会把+50ns当成一个整体,参数就错位了。
第六条和第七条是节点规则。节点0是地,其他节点可以是数字或字符串。字符串节点名在某些版本里支持,但为了兼容性,我一般只用数字。第七条更关键:不允许悬浮节点,每个节点对地都要有直流通路。材料里给的办法是接一个大电阻。实际调试时,如果一个节点只连了电容和受控源,直流分析会报“singular matrix”或者“no DC path to ground”,这时候在节点和地之间挂一个1G或1T的电阻就能让直流求解通过,瞬态结果几乎不受影响。
第八到第十条是数字和单位。比例因子表里M是毫(1E-3),MEG才是兆(1E+6),这是新手最容易翻车的地方:写1M以为是 1 兆欧,实际是 1 毫欧。材料里专门把M=1E-3和MEG=1E+6并列写出来,就是提醒这个坑。单位可以省略,10和10V等价,1k和1kHz等价,但前提是元件类型已经决定了量纲,电阻行里的1k就是 1kΩ,不会变成 1kHz。
第十一条,元件名首字母约定,整个名称一般不超过 8 个字符。材料给了一张首字母表,我把它整理成下面这张对照表,写网表时对着查:
| 首字母 | 元件类型 | 首字母 | 元件类型 |
|---|---|---|---|
| B | 砷化镓场效应晶体管 | K | 互感和磁芯 |
| C | 电容 | L | 电感 |
| D | 二极管 | M | MOS 场效应晶体管 |
| E | 电压控制电压源 | Q | 双极型晶体管 |
| F | 电流控制电流源 | R | 电阻 |
| G | 电压控制电流源 | S | 压控开关 |
| H | 电流控制电压源 | T | 传输线 |
| I | 独立电流源 | V | 独立电压源 |
| J | 结型场效应晶体管 | W | 流控开关 |
这张表的价值在于:当你写了一个X1开头的元件,仿真器不认识,不是语法错,而是首字母不在约定里。子电路调用通常用X开头,材料正文里提到“子电路”但没展开,常见做法是.subckt定义子电路,然后用X调用,这个后面在点命令部分会带一句。
3. 独立源与受控源:信号源参数怎么填才不报错
3.1 独立电压源和电流源的通用格式
材料把独立源格式写成:
VXXXX N+ N- <<DC>DC/TRAN VALUE> <AC<ACMAG<ACPHASE>>> IXXXX N+ N- <<DC>DC/TRAN VALUE> <AC<ACMAG<ACPHASE>>>拆开看,V或I开头,后面跟名称,然后是两个节点N+和N-,再往后是直流值、瞬态值、交流幅值和相位。材料给的例句里:
VCC 10 0 0 DC 5V VIN 10 2 0.5 AC 0.5 SIN(0 1 1MEG) ISRC 20 21 AC 0.3 45.0 SFFM(0 1 10G 5 1MEG) VMEAS 12 13 0VCC 10 0 0 DC 5V是节点 10 到地,直流 5V。VIN 10 2 0.5 AC 0.5 SIN(0 1 1MEG)是节点 10 到 2,直流 0.5V,交流幅值 0.5,叠加一个正弦源,偏移 0、幅值 1、频率 1MHz。ISRC是电流源,交流幅值 0.3、相位 45 度,叠加单频调频源。VMEAS 12 13 0是节点 12 到 13 的 0V 源,常用来测支路电流。
这里要注意,DC关键字后面的值和直接写在节点后的值不是一回事。VCC 10 0 0 DC 5V里第一个0是瞬态值占位,DC 5V才是直流分析用的值。如果只写VCC 10 0 5V,瞬态和直流都用 5V,但交流分析时没有交流幅值,AC 扫描会得到全零。做 AC 分析时,源必须带AC关键字和幅值,否则波形是一条平线,不是电路坏了,是源没设对。
3.2 五种时变源模型的参数表
材料列了指数源、脉冲源、分段线性源、单频调频源、正弦源,外加多项式源。每种源的参数和默认值我按材料整理如下,填参数时直接对表。
指数源EXP格式:
V/IXXXX N+ N- EXP(V1 V2 TRD TRC TFD TFC)| 参数 | 意义 | 默认值 | 单位 |
|---|---|---|---|
| V1 | 初始值 | 无 | V/A |
| V2 | 脉冲值 | 无 | V/A |
| TRD | 上升延迟时间 | 0 | s |
| TRC | 上升延迟常数 | TSTEP | s |
| TFD | 下降延迟时间 | 0 | s |
| TFC | 下降延迟常数 | TSTEP | s |
例句VIN 5 0 EXP(4 1 2NS 30NS 60NS 40NS)表示从 4 指数过渡到 1,上升延迟 2ns、上升常数 30ns、下降延迟 60ns、下降常数 40ns。指数源的波形是指数逼近,不是线性斜坡,做电源上电缓启动仿真时常用。
脉冲源PULSE格式:
V/IXXXX N+ N- PULSE(V1 V2 TD TR TF PW PER)| 参数 | 意义 | 默认值 | 单位 |
|---|---|---|---|
| V1 | 初始值 | 无 | V/A |
| V2 | 脉冲值 | 无 | V/A |
| TD | 延迟时间 | 0 | s |
| TR | 上升时间 | TSTEP | s |
| TF | 下降时间 | TSTEP | s |
| PW | 脉冲宽度 | TSTEP | s |
| PER | 周期 | TSTOP | s |
例句VIN 3 0 PULSE(-1 1 2NS 2NS 2NS 50NS 100NS)是 -1 到 1 的脉冲,延迟 2ns,上升 2ns,下降 2ns,宽度 50ns,周期 100ns。这里TR和TF不要设成 0,设 0 会让仿真器取默认步长,波形边沿可能被抹平或者报时间步长过小。我一般给边沿留至少一个仿真步长。
正弦源SIN格式:
V/IXXXX N+ N- SIN(VO VA FREQ TD ALPHA THETA)| 参数 | 意义 | 默认值 | 单位 |
|---|---|---|---|
| VO | 偏移值 | 无 | V/A |
| VA | 幅值 | 无 | V/A |
| FREQ | 频率 | 1/TSTOP | Hz |
| TD | 延迟时间 | 0 | s |
| THETA | 衰减系数 | 0 | 1/s |
例句VIN 4 0 SIN(0 1 10G 1PS 0)是偏移 0、幅值 1、频率 10GHz、延迟 1ps、衰减 0 的正弦。THETA不为 0 时幅值按指数衰减,做阻尼振荡源时用得上。注意材料表里ALPHA在格式里出现但参数表只列了THETA,实际写法以格式为准,ALPHA位置填的是阻尼相关参数,不同版本叫法略有差异,填之前看一眼所用仿真器的手册。
分段线性源PWL格式:
V/IXXXX N+ N- PWL(T1 V1 <T2 V2 T3 V3 T4 V4>)例句ICL 6 0 PWL(0 0 100P 300P 10M 600P 10M 800P 0 1.1N 0 1.3N 10M)是一串时间-值对,(Ti, Vi)表示 t=Ti 时的值,中间线性插值。PWL 最适合拿实测波形或者手画的折线去驱动电路,参数个数不固定,但时间必须递增,写反了仿真器不报错但波形会乱。
单频调频源SFFM在材料里只出现在例句ISRC 20 21 AC 0.3 45.0 SFFM(0 1 10G 5 1MEG)中,格式没展开。常见写法是SFFM(VO VA FC MDI FS),分别是偏移、幅值、载波频率、调制指数、信号频率。做调频信号注入时用,参数顺序别记混。
受控源四种类型对应首字母E(电压控电压源)、G(电压控电流源)、F(电流控电流源)、H(电流控电压源)。材料说受控源可以由多项式和多种数学表达式及表格组成,实际写的时候E和G后面跟控制节点,F和H后面跟控制电压源名称。比如E1 2 0 1 0 10是节点 2 到地的电压等于节点 1 到地电压的 10 倍。受控源最容易错的是F和H的控制源必须是一个已经存在的独立电压源,用来测支路电流,不能直接写节点。
4. 点命令与仿真控制:.tran、.print、.probe的配合
4.1 瞬态分析的三组参数
材料里.tran 0.1us 60us uic是最简形式,完整格式常见为.tran TSTEP TSTOP <TSTART <TMAX>> <UIC>。TSTEP是输出步长,TSTOP是终止时间,TSTART是开始记录的时间,TMAX是最大内部步长。UIC表示用初始条件。
这里有个参数配合的坑:TSTEP不是仿真器内部实际走的步长,内部步长由TMAX和电路动态自适应决定。如果你只写TSTEP不写TMAX,仿真器可能在某些快速边沿处走很小步长,输出却很稀,波形看起来“跳变”。我一般把TMAX设成TSTEP的十分之一到五分之一,比如.tran 0.1us 60us 0 0.01us uic,这样输出密、内部步长有上限,波形细节不会丢。
UIC和初始条件ic=是配套的。元件行里的ic=1只在UIC存在时生效,否则仿真器先算直流工作点,把初始条件覆盖掉。材料里 LC 例子两个都写了,这是正确用法。如果只写ic=不写UIC,仿真结果和没写ic=一样,这是很多人以为“初始条件没用”的真正原因。
4.2 输出命令的分工
.print tran v(1) I(l1)把节点 1 电压和电感 L1 电流打印成表格,.plot tran v(1) I(l1)画波形,.probe在材料里单独一行出现,作用是让波形数据可供后处理查看。不同仿真器对.probe的支持不一样,有的版本.probe后面要跟变量名,有的版本.probe单独一行表示全部保存。材料里写的是单独一行,照抄时如果报错,改成.probe v(1) I(l1)试试。
.print和.plot的变量写法要注意:电压是v(节点)或v(节点1,节点2),电流是I(元件名),元件名必须和网表里一致,大小写不敏感但首字母要对。I(l1)是电感电流,I(VCC)是电压源支路电流,后者常用来测总电流。如果写I(1)会报错,因为1不是元件名。
4.3 子电路和模型命令的位置
材料正文提到“元件模型(子电路)”和“点命令”,但没给具体格式。按这个资源场景下的常见做法,子电路定义用.subckt 名称 节点列表开头,.ends结尾,调用时用X开头:
.subckt RLC in out R1 in mid 1k L1 mid out 1m C1 out 0 1u .ends X1 1 2 RLC模型命令.model用于半导体器件,比如.model D1N D(IS=1e-14 N=1),具体参数取决于器件类型。材料里半导体器件部分只给了首字母表,没展开模型参数,实际写二极管、三极管网表时,.model行不能少,否则仿真器报“model missing”。模型名要和器件行里引用的名字一致,比如D1 1 0 D1N里的D1N就是.model D1N ...定义的名字。
5. 避坑排查:五条网表报错的血泪记录
5.1 报“singular matrix”或“no DC path to ground”
现象:仿真一开始就报矩阵奇异,或者提示某节点没有到地的直流通路。原因:该节点只连了电容、受控源或半导体结,直流分析时没有导通路径。解决:在节点和地之间挂一个大电阻,Rleak 节点 0 1G,或者检查是不是忘了接地节点0。材料第七条专门写了这个规则,照做就行。
5.2 波形是一条平线,但仿真没报错
现象:.tran跑完了,.plot出来的电压电流全是零或者常数。原因:独立源只写了直流值没写瞬态波形,或者 AC 分析时源没带AC幅值。解决:瞬态分析确认源后面跟了PULSE、SIN、PWL等时变关键字;AC 分析确认源行有AC 幅值。另外检查.tran的TSTOP是不是太小,波形还没开始就结束了。
5.3 元件名首字母写错,报“unknown device”
现象:网表里写了X1或Z1开头的元件,仿真器不认识。原因:首字母不在材料那张表里,或者把受控源E写成了V。解决:对照首字母表改元件名,子电路调用用X,独立源用V或I,受控源按类型用E/F/G/H。名称总长控制在 8 个字符以内,超长有的版本会截断。
5.4 比例因子M和MEG混用,电阻值差一千倍
现象:设了1M的电阻,仿真结果电流大得离谱。原因:M是毫(1E-3),MEG才是兆(1E+6)。解决:兆欧写1MEG,毫欧写1M,毫安写1M,兆赫写1MEG。材料比例因子表里这两个挨着,抄参数时多看一眼。
5.5 续行+后面没空格,参数错位
现象:脉冲源参数很多,折行后仿真报参数个数不对或者波形周期乱。原因:+后面直接跟了数字,解析器把+50ns当成一个整体。解决:+后面先写一个空格,再写续行内容。另外续行只能紧跟在被续行的下一行,中间不能插空行,空行会截断续行关系。
6. 从语法到可复现:用参数扫描验证一份网表是否写对
语法规则看一遍容易,真正记住是靠跑一个能对比的结果。材料里的 LC 无阻尼振荡电路就是一个很好的验证载体:理论解是正弦,频率由1/(2π√(LC))决定,初始条件给了u(0)=1V、i(0)=1A,仿真波形应该和解析解对得上。我一般会在这个例子上加一步参数扫描,把电容值改几档,看频率是不是按平方根关系变,这样能同时验证元件行、.tran参数和输出命令是否都写对了。
具体做法是保留原网表,把C1的值从4p改成1p、4p、16p三档,每档跑一次.tran,用.print输出几个周期内的峰值时间,反推频率。如果C1变成16p后频率减半,说明p比例因子和电容行解析都正常;如果频率没变,大概率是C1那行被注释掉了或者节点写错。这个验证不需要额外工具,改一个数字重跑就行。
另一个验证点是uic的作用。把.tran里的uic删掉再跑,如果波形变成一条直线或者初始值不对,说明这个电路确实依赖初始条件,也说明你之前加uic是必要的。这种“删掉一个关键字看结果变不变”的办法,比死记规则有效。从那以后我每次拿到一份新网表,都会先做一次“删关键字对比”和“改比例因子对比”,确认解析器真的按我预期在读,而不是碰巧跑出一个像样的波形。希望帮到你。
本文还有配套的精品资源,点击获取