模拟IC随笔——SPICE模型整理

SPICE(Simulation Program with Integrated Circuit Emphasis)(侧重于集成电路的仿真程序)是一种电路仿真普遍采用的软件工具。下面介绍一些SPICE常用的指令。
举个例子,看一下网表的基本结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
***Example 1***	*标题行
*#destroy all *命令行,破坏先前数据
*#run *命令行,运行仿真
*#print all *命令行,打印仿真输出数据
.options LIST NODE POST *设置仿真的可选条件
.op *设置仿真的类型
.ac dec 10 1k 1meg *设置仿真的类型
.print ac V(Vin) V(Vout) I(R1) I(C1)
Vin Vin 0 1 AC 1 *设置输入激励
R1 Vin Vout 1k
R2 Vout 0 2k
C1 Vout 0 1n *电路网表描述
.end *结束语句

一、基本结构#

网表内容 说明
*title 文件标题
options 设置仿真的条件
Analysis statement 设置扫描变量、设置分析模式
.print/.plot/.graph/.porbe 设置输入结果的显示方式
sources(I or V) 设置输入激励
netlist 电路网表
.lib 元件库
.model libraries 元件模型描述
.end 结束语句

二、基本语法#

1、不区分大小写
2、网表第一行为标题行,SPICE忽略第一行
3、以“*”开头为注释
4、以“*#”开头的为命令行,这些命令行用于控制
5、续接符:+
6、0,GND,GND!,GROUND表示全局地
7、不要有悬空节点、不能重复定义节点
8、Tab、空格、逗号、等号、括号都是分隔符,元件属性由冒号分隔(M1:beta),级别由句号指示(X1.AV.V)
9、节点名称描述中数字开头的节点中的字符会被忽略,例如:5A=5B=5

三、基本单位#

单位 意义 单位 意义
f 1e-15 meg 1e6
p 1e-12 g 1e9
n 1e-9 t 1e12
m 1e-3 db 20log10
k 1e3

注:注意区分m和meg。

四、器件定义#

在描述器件时,第一个字符必须是规定的元器件类型字母。字母表如下:

首字母 电路器件 首字母 电路器件
B 砷化镓场效应管 L 电感
C 电容 M MOS场效应晶体管(MOSFET)
D 二极管(Diode) Q 双极性晶体管(BJT)
E 电压控制电压源(VCVS) R 电阻
F 电流控制电流源(CCCS) S 电压控制开关
G 电压控制电流源(VCCS) T,U,O 传输线
H 电流控制电压源(CCVS) V 独立电压源
I 独立电流源 W 电流控制开关
J 结型场效应晶体管(JFET) X 子电路
K 互感(耦合系数)

以下分别介绍每种器件的语法。

无源器件#

1、电阻#

1
Rxxx n1 n2 <mname> <R=>resistance <AC=val>

例如:

1
2
3
R1 1 2 10k
Rac 9 8 1 ac=1e10
Rterm input gnd R='sqrt(HERTZ)'

2、电容#

1
Cxxx n1 n2 <mname> <C=>capacitance

例如:

1
C1 1 2 1p

3、电感#

1
Lxxx n1 n2 <L=>inductance

例如:

1
L1 1 2 1n

有源器件#

1、Diode#

1
Dxxx n+ n- mname <area> <off> <ic=vd>

area为面积因子,off为直流分析所加的初始条件,mname为模型名,ic=vd是瞬态初始条件。
注:模型中的寄生电阻串联在正极端。

2、BJT#

1
Qxxx nc nb ne <ns> mname <area> <off> <ic=vdc, vgs>

nc、nb、ne、ns分别是集电极、基极、发射极和衬底节点,缺省时ns接地。

3、JFET#

1
Jxxx nd ng ns mname <area> <off> <ic=vds, vgs>

4、MOSFET#

1
Mxxx nd ng ns nb mname <W=val> <L=val> <other options>

nd、ng、ns、nb分别是漏、栅、源、衬底节点。L、W分别为沟道的长和宽。
例如:

1
2
M1 out in vcc vcc pmos W=20u L=1u
M2 out in 0 0 nmos W=20u L=1u

子电路#

子电路的定义语句#

1
2
3
.subckt subnam <node1 node2 ...>
*电路描述
.ends <subnam>

subnam为子电路名,node1…为子电路外部节点号,不能为0。子电路中的节点号(除接地点)、器件名、模型的说明均是局部量,可以与外部的相同。.ends后有若有子电路名,表示该子电路定义结束;否则表示所有子电路定义结束。

子电路的调用语句#

1
Xxxx <node1 node2 ...> subnam

例如:

1
2
3
4
5
6
7
.subckt inv in out wn=1.2u wp=1.2u
Mn out in 0 0 nmos W=wn L=1.2u
Mp out in vdd vdd pmose W=wp L=1.2u
.ends
X1 in 1 inv wn=1.2u wp=3u
X2 1 2 inv wn=1.2u wp=3u
X3 2 out inv wn=1.2u wp=3u

激励源#

独立源#

直流源#
1
2
Vxxx n+ n- dc val
Ixxx n+ n- dc val

例如:

1
2
V1 1 0 dc=5
I1 1 0 dc 5m
交流小信号源#
1
2
Vxxx n+ n- ac <acmag<acphase>>
Ixxx n+ n- ac <acmag<acphase>>

acmag与acphase分别表示交流小信号源的幅度和相位。
例如:

1
V1 1 0 dc 5 ac 1
瞬态源#
脉冲源#
1
Vxxx n+ n- pulse (V1 V2 td tr tf pw per)

V1是初始值,V2是脉动值,td是延时,tr是上升时间,tf是下降时间,pw是脉冲宽度,per是脉冲周期。
注:此处上升与下降时间为V1到V2或V2到V1的变化时间,非10%到90%的时间。脉冲宽度为V2的宽度,非50%的宽度。

分段线性源#
1
Vxxx n+ n- pwl (t1 v1 <t2 v2 t3 v2 ...>) <R<=repeat>> <td=delay>

Vi是Ti时刻的值,repeat是开始得利的起始点(R=repeat_from_what_time),delay是延迟时间(td=time_delay_before_PWL_start)。

正弦源#
1
Vxxx n+ n- sin (v0 va freq td theta phase)

v0是偏置,va是幅度,td是延时,theta是阻尼因子,phase是相位。波形为:

v={v0+vasin(2πφ360),0<t<tdv0+vae(ttd)phasesin(2π[freq(ttd)+φ360]),ttdv= \begin{cases} v_0+v_a sin(\frac{2\pi\varphi}{360}), 0<t< t_d & \\ v_0+v_a e^{-(t-t_d)phase}sin(2\pi[freq(t-t_d)+\tfrac{\varphi}{360}]) , t\geq td \end{cases}

指数源#
1
Vxxx n+ n- exp (v1 v2 td1 tau1 td2 tau2)

v1是初始值,v2是峰值,td1是上升延迟时间,tau1是上升时间常数,td2是下降延迟时间,tau2是下降时间常数。

受控源#

1
2
3
4
Exxx n+ n- nc+ nc- (voltage gain value)	*VCVS
Gxxx n+ n- nc+ nc- (voltage gain value) *VCCS
Hxxx n+ n- nc+ nc- (voltage gain value) *CCVS
Fxxx n+ n- nc+ nc- (voltage gain value) *CCCS

五、器件模型#

器件需要模型语句来定义其参数值,由关键字.model,模型名称,模型类型和一组参数组成。

无源器件#

1
2
3
.model mname R parameter=val
.model mname C parameter=val
.model mname L parameter=val

有源器件#

有源器件有一个LEVEL参数,不同LEVEL精度不同。

1
2
3
4
5
.model mname D <LEVEL=val> <pname=val>...
.model mname NPN <LEVEL=val> <pname=val>...
.model mname PNP <LEVEL=val> <pname=val>...
.model mname NMOS <LEVEL=val> <pname=val>...
.model mname PMOS <LEVEL=val> <pname=val>...

六、分析类型描述语句#

直流工作点分析#

1
.op

在输出文件.lis中会列出一些直流参数和各结点的工作点电压、支路电流、静态工耗等。

直流分析#

1
.dc var1 start stop step <sweep var2 type np start2 stop2>

type有dec(十倍频)、oct(八进制、倍频)、lin(线性)和data=datanm/POI(列表)几种。step为步长,np为扫描点数。实际是当var2=start2时,扫描var1。然后根据tpye类型取下一个var2值再扫描var1,一直扫到var2=stop2,共扫np组var1。var2可以是电压、电流或温度等变量。

瞬态分析#

1
.tran tincr1 tstop1 <tincr2 tstop2 ... tincrN tstopN> <start=val> <uic>

0tstop1以tincr1为步长,tstop1tstop2以tincr2为步长,以此类推。从start=val开始输出结果。

交流分析#

1
2
3
.ac type np fstart fstop <sweep var start stop incr>
.ac type np fstart fstop <sweep var type np start stop>
.ac var1 start=start1 stop=stop1 step=incr1

type有dec、oct、lin、poi四种。

噪声分析#

噪声分析用来计算各个器件的噪声对输出节点的影响并给出其均方根并输出。可完成.ac语句规定的各频率的计算,应在.ac分析之后。

1
.noise ovv srcnam inter

ovv为输出变量,srcnam为输入源,inter为频率间隔。

七、控制语句#

1
2
3
4
5
6
.incluede
.lib
.param
.data
.alter
.global

八、options语句#

1
.options opt1 <opt2> ... <optN>

常用选项:
node
post
list

九、输出语句#

1
2
3
4
5
.print
.plot
.graph
.probe
.measure

未完待补。