1+1=10

记记笔记,放松一下...

模拟电路仿真SPICE小记

接前面EDA小记,查查SPICE内容,胡乱整理一下。

SPICE,取自Simulation Program with Integrated Circuit Emphasis(集成电路通用模拟程序)首字母缩写 ,是一种用于电路描述与仿真的语言和仿真器软件,用于检测电路的连接和功能的完整性,以及用于预测电路的行为。

SPICE 历史

SPICE,1975年由加利福尼亚大学伯克莱分校的Donald Pederson在电子研究实验室首先建立的。第一版和第二版都是用Fortran语言编写的,从第三版开始用C语言编写。

  • 1973:SPICE1
  • 1975:SPICE2,最后一个版本 SPICE2G.6(1983),当今很多商业仿真器基于这个版本
  • 1989:SPICE3,最后一个版本 SPICE3f.5(1993)

商业软件

  • HSPICE:1970年代末,由Meta-Software开发,1980年代成为集成电路行业的标准工具,1994年被收入Synopsys旗下。
  • PSPICE:第一个用于PC机的SPICE,1980年代初由MicroSim开发,1998年被OrCAD收购,1999年OrCAD被Cadence收购。
  • NI Multisim:1990年代由Interactive Image Technologies开发,最初叫做Electronics Workbench,后称为Multisim。2005被 National Instruments收购。提供直观的图形化设计环境,易于使用。
  • IsSPICE:1985年由Intusoft推出,用于研究或中小型项目
  • MICROCAP:1980年代末,由Spectrum Software开发,2019年停止开发。版本停留在 Micro-Cap 12,商业软件变为免费提供
  • ProSPICE:Proteus中使用的SPICE仿真器。Proteus 由 Labcenter Electronics 于1988开发。Proteus支持MCU模拟。
  • LTspice:1990年代末由Linear Technology发布,2017年被Analog Devices收购。免费提供。包含Analog Devices元件库。
  • TINA:Toolkit for Interactive Network Analysis是基于SPICE的仿真软件,由DesignSoft于1990年发布。支持模拟、数字、射频以及MCU。
  • TINA-TI:DesignSoft的TINA的受限版本。2004年起由Texas Instruments免费提供。包含 TI 提供的丰富元件库,便于使用 TI 产品进行设计。注意,它比TINA学生版相比,功能都受限。(另外,它和PSpice for TI无关)
  • PSPICE for TI:由 Texas Instruments (TI) 提供的电路仿真工具,基于 Cadence 设计系统的 PSpice 技术。此工具专为设计涉及 TI 元件的电子电路的工程师而开发。免费提供
  • QSPICE:qorvo公司免费提供。它是由原LTspice的作者开发的。支持C++/Verilog编译器。包含Qorvo器件库。
  • AIM-SPICE:1990年代由 俄罗斯科学院 开发,含义 Automatic Integrated Circuit Modeling Spice,旨在为学术研究和教育提供免费的电路仿真工具。免费,但是社区不大
  • ...

还有很多

  • SmartSpice
  • HSIM
  • NANOSIM
  • ADiT
  • ULTRASIM

追求免费的话,LTspice似乎是社区比较大的。另外QSPICE由于是LTspice的原作者新开发的,似乎也有点意思。

开源软件

  • ngspice:开源软件,融合了XSPICE和CIDER等变体。它本身是一个基于命令行的电路仿真器,但是它可以与其他图形界面工具集成。比如KiCad, Qucs-S 等,另外EasyEDA、Autodesk fusion、Altium Designer等也支持ngspice。
  • XYCE:由美国桑迪亚国家实验室开发的,支持并行计算,适合大规模电路模型。它没有基于SPICE的代码,是重新开发的兼容SPICE的程序。
  • WRspice:WrSpice是JSPICE3的继任者,它使用C++进行了重写,在一些行为上(SPICE和HSPICE不一致时),向HSPICE靠拢。WRspice由 Whiteley Research Inc. (WRI) 开发和维护,2017年起已经停止维护。

XSPICE由Georgia Tech开发,添加数模混合仿真功能;CIDER(CODECS)是由U.C. Berkeley和Oregon State University合作开发,支持半导体器件的数值仿真,并利用数值仿真结果进行电路分析。

配合ngspice 的 GUI 程序

以下是一些可以与 ngspice 集成,提供图形界面的工具:

  • KiCad (使用 wxwidgets 这一跨平台 C++的 UI库)
  • Qucs-S (使用 Qt 这一跨平台 C++的 UI库): 网址 https://ra3xdh.github.io/,派生自Qucs,但是使用Spice。
  • gEDA (使用GTK+ 这一个gnome的UI库)
  • XSchem:在Unix下使用X11和Tcl-Tk库。
  • EasyEDA(Web端)
  • ...

另外,多个商业软件可以支持/使用 ngspice:

  • Eagle 8.4
  • Altium Designer 20
  • Autodesk fusion
  • ...

网表文件语法

尽管现代多数仿真工具可以通过电路图输入,还是有必要先了解一下SPICE基础的语法。

SPICE语法主要涉及电路描述文件(通常为.cir或.sp文件),该文件包含了定义和分析电路所需的所有指令和元件描述。

基本组成

SPICE的输入文件主要由以下几部分组成:

  • 标题行(Title Card/Title Line):文件的第一行,用于描述电路或仿真的简要信息。
  • 元件说明(Element Cards):描述电路中的具体元件,如电阻、电容、电感、晶体管等。
  • 控制语句(Control Statements):指定仿真类型(如直流分析、交流分析、瞬态分析等)和输出要求。
  • 模型描述(Model Descriptions):定义特定元件的详细物理特性
  • 结束行(.END):标记文件结束。

另外,

  • 注释行(Comment):
  • 子电路(Subcircuit):
  • 文件包含(.INCLUDE):

SPICE在1970年代被开发时,打孔卡还是主要的数据输入手段之一,每个电路元件或控制语句通常对应一行输入,这被视为一个“card”。

数字?

SPICE大小写不敏感,数字数量级的单位:

  • T = 10^12
  • G = 10^9
  • Meg = 10^6
  • K = 10^3
  • mil = 25.4x10^-6
  • m = 10^-3
  • u = 10^-6
  • n = 10^-9
  • p = 10^-12
  • f = 10^-15

不加数量级的数字,可以表示为:

1
2
3
4
5
5.0
5E3
5.0E3

单位:V、A、HZ、OHM、H、F、DEG

注意,最好不要加单位。

标题行

标题行必须是输入文件的第一行

1
My first circuit

结束行

结束行,注意前面的 .

1
.END

注释行

与C语言中使用 ///* */进行注释不同,SPICE中使用星号(*)来注释行,例如:

1
* 这是一个注释

行内注释,使用分号 ;,有的用SPICE支持 $

1
2
V1 1 0 DC 10V ; 这是电源定义,电压为10V
R1 1 2 1k ; 这是一个电阻,阻值为1千欧姆

续行

在不同的 SPICE 版本中,续行符的使用有细微的差异。在多数 SPICE 方言中,使用加号(+)作为续行符。加号放在新行的行首。

元件说明

每个元件在SPICE中都用一行文本描述,格式通常为:

1
<类型><名称> <连接节点> <参数>

例如,电阻类型用R标识,一个电阻可以描述为:

1
R1 1 2 100k

这表示一个名为R1的电阻,连接在节点1和节点2之间,阻值为100千欧姆。

注意,名字和节点,不一定用数字(节点地必须是0)。所以下面也可以

1
Rabc myin1 myin2 100000

常用元件的类型:

  • R:电阻 (Resistor)
  • C:电容 (Capacitor)
  • L:电感 (Inductor)
  • V:独立电压源 (Independent Voltage Source)
  • I:独立电流源 (Independent Current Source)
  • E:电压控制电压源 (Voltage-Controlled Voltage Source)
  • G:电压控制电流源 (Voltage-Controlled Current Source)
  • H:电流控制电压源 (Current-Controlled Voltage Source)
  • F:电流控制电流源 (Current-Controlled Current Source)
  • D:二极管 (Diode)
  • Q:双极型晶体管 (Bipolar Junction Transistor)
  • M:MOSFET (Metal-Oxide-Semiconductor Field-Effect Transistor)
  • J:JFET (Junction Field-Effect Transistor)

控制语句

控制语句以点(.)开始,用于定义仿真的设置和进行的分析类型。常见的控制语句包括:

  • .DC:直流扫描分析
  • .AC:交流扫描分析
  • .TRAN:瞬态分析
  • .OP:工作点分析(Operation Point Analysis)
  • .PRINT:定义输出变量
  • .PLOT:定义绘图输出

还有

  • .NODESET:为电路节点提供初始电压估计,有助于加速仿真收敛
  • .IC:Initial Condition,为某些节点设置仿真开始时的确切电压或初始条件。常用于瞬态分析。
  • .OPTION:设置仿真的各种参数,比如迭代步长、容差、输出格式等。

例如,进行一个瞬态分析的控制语句可能如下:

1
.TRAN 1us 100ms

这表示进行瞬态分析,步长为1微秒,总时长为100毫秒。

在ngspice中,支持.control 块功能。块中可以包含任何有效的 ngspice 命令,比如设定仿真选项、执行仿真和后处理数据等。

1
2
3
.control
    [ngspice 命令]
.endc

模型描述

设备模型对于准确模拟电子元件在各种条件下的行为至关重要。SPICE定义了多种模型类型,每种模型在 SPICE 中都有特定的参数集,这些参数可以根据实际器件的数据手册进行调整以匹配实际行为。

SPICE中的.MODEL语句允许用户定义诸如二极管、晶体管等半导体器件的特性。这些模型有助于预测器件在电路中的运行情况。

.MODEL语句在SPICE中的通用格式如下:

1
.MODEL MNAME TYPE(PNAME1=PVAL1 PNAME2=PVAL2 ...)
  • MNAME:这是模型名称,用于在仿真的其他部分中唯一标识此模型。
  • TYPE:指定设备的类型。常见类型包括MOSFET的NMOS和PMOS,双极结型晶体管的NPN和PNP,二极管的D等。
  • PNAME1, PNAME2, ...:这些是针对所建模设备类型的参数名称。
  • PVAL1, PVAL2, ...:每个参数的对应值。

例如:

1
.MODEL MYMNAME NMOS (LEVEL=1 VTO=2.0 KP=10U W=10U L=1U)

这定义了一个NMOS型号为M1的模型,指定了多个物理参数。

定义好之后,可以通过原件类型M使用它。

1
M1 1 2 3 4 MYMNAME

这里,M1 是NMOS晶体管的实例,1、2、3、4是连接节点(分别是栅极、漏极、源极和衬底),MNMOS是之前定义的模型。

注意:区分SPICE模型于IBIS模型。不同于 SPICE模型是一种基于文本的行为模型,SPICE仿真器使用这种模型通过数学运算预测器件在不同条件下的行为。IBIS是Input/Output Buffer Information Specification(输入/输出缓冲器信息规范)的首字母缩写。它是一种行为模型,描述器件的数字输入和输出缓冲器的模拟行为。它由表格数据组成,描述数字缓冲器内元器件的电流-电压(I-V)关系,以及输出或I/O缓冲器的电压随时间变化的(V-t)开关特性。它用于在制造之前对系统板进行信号完整性分析,并以纯ASCII文本格式的数据呈现。它不披露任何专有信息,因为IBIS模型就像一个黑盒模型,不包含可逆向工程的内部信息。

子电路

子电路在 SPICE 中是通过 .SUBCKT 语句定义的,其结构允许将一组电路元件封装成单一的实体。定义子电路的基本语法如下:

1
2
3
.SUBCKT 子电路名 输入端口节点 输出端口节点 [其他端口节点...]
...(电路元件描述)
.ENDS <子电路名>

.ENDS 后面的子电路名可以省略。

子电路的调用就像使用任何其他内置元件一样。调用子电路的语法通常如下:

1
X<名称> <连接节点列表> <子电路名>

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
* 定义子电路OPAMP端口分配: 1 - 输入+, 2 - 输入-, 3 - 输出
.SUBCKT OPAMP 1 2 3
Rin 1 2 10k
G1 3 0 1 2 100k
Rout 3 0 1k
.ENDS OPAMP

* 调用子电路OPAMP
XU1 1 0 2 OPAMP
V1 1 0 DC 1
Rload 2 0 10k
  • OPAMP 是子电路的名称,1, 2, 3 是端口节点。内部包含了输入电阻 Rin,一个控制源 G1 和输出电阻 Rout。
  • XU1 表示一个子电路实例,连接到节点 1, 0, 和 2。OPAMP 是调用的子电路名称。

文件包含

.INCLUDE 语句的基本语法如下:

1
2
.INCLUDE '文件路径1'
.INCLUDE "文件路径2"

文件路径是要引入文件的完整或相对路径。使用双引号(")或单引号(')均可用来包围文件路径。

非标准的 .LIB,在一些SPICE中,用于导入第三方库。比如ngspice中:

1
LIB filename libname

函数

SPICE 提供了多种内置函数,函数可以在 SPICE 仿真中用于不同的目的,包括定义复杂的源特性、控制电路行为,以及分析和优化电路性能。

数学函数

  • abs(x) - 返回 x 的绝对值。
  • sqrt(x) - 返回 x 的平方根。
  • exp(x) - 计算 e 的 x 次方。
  • log(x) - 计算 x 的自然对数。
  • sin(x) - 计算 x 的正弦值。
  • cos(x) - 计算 x 的余弦值。
  • tan(x) - 计算 x 的正切值。
  • asin(x) - 计算 x 的反正弦值。
  • acos(x) - 计算 x 的反余弦值。
  • atan(x) - 计算 x 的反正切值。
  • sinh(x) - 计算 x 的双曲正弦值。
  • cosh(x) - 计算 x 的双曲余弦值。
  • tanh(x) - 计算 x 的双曲正切值。

逻辑和条件函数

  • if(cond, then_expr, else_expr) - 根据条件 cond 返回 then_exprelse_expr
  • sgn(x) - 返回 x 的符号,正数为1,负数为-1,零为0。
  • u(x) - 单位阶跃函数,x 大于0时返回1,否则返回0。

特殊电路分析函数

  • limit(x, min, max) - 将 x 限制在 min 和 max 之间。
  • pow(x, y) - 计算 x 的 y 次幂。
  • min(x, y) - 返回 x 和 y 中的最小值。
  • max(x, y) - 返回 x 和 y 中的最大值。

在 SPICE 及其许多变体中,.func 指令用于定义用户自定义的数学函数,这些函数可以在电路描述中被重用。

1
.func 函数名(参数1, 参数2, ..., 参数n) = 表达式

SPICE 解算器?

SPICE使用数值积分方法来求解由网表定义的电路方程。这些方程通常是非线性微分方程。

  1. 节点分析
  • 基于节点电压法,将电路转化为节点电压方程。利用基尔霍夫电流定律(KCL)构建方程。 2. 稀疏矩阵技术
  • 由于电路方程组通常是稀疏的,SPICE 使用稀疏矩阵存储和操作数据,以节省内存和提高计算速度。 3. 牛顿-拉夫森迭代法
  • 用于求解非线性电路方程。通过线性化非线性方程并反复迭代逼近求解。
  • 每次迭代计算雅可比矩阵,并求解线性方程组。 4. 瞬态分析
  • 使用梯形积分法和向后欧拉法进行时间步进,模拟电路的动态行为。
  • 梯形法稳定性高,适合大多数电路仿真。 5. 直流分析
  • 计算电路在直流稳态下的行为。通过迭代求解节点电压,确定稳态电流和电压。 6. 交流分析
  • 通过线性化电路,使用小信号模型进行频域分析。
  • 计算电路的增益、相位等频率响应特性。 7. ...

杂项

命令行

SPICE有交互式模式、批处理模式以及server模式。不过直接手动编辑spice文件的场景应该挺少了,都是通过GUI界面绘制电路图。

对于ngspice来说,其他软件还可以直接使用其动态库,比如KiCAD。

ngspice 行为

ngspice源自spice3f5,远远不像其他商业版本进化那么快。通过 ngbehavior 来模拟一些兼容行为

1
set ngbehavior=ltpsa

注意写法,这些都是Flag!可以多个同时使用的。

Flag Short Description
a A complete netlist transformed
ps PSPICE compatibility
hs HSPICE compatibility
spe Spectre compatibility
lt LTSPICE compatibility
s3 Spice3 compatibility
ll All (currently not used)
ki KiCad compatibility
eg EAGLE compatibility
mc For 'make check' (test environments)

模型导入

在实际中,由于同一个型号的半导体器件,可能由多个半导体制造商生产,尽管他们基本的电气特性可能相似,但是细节上还有差异。比如 1N4148 是一种非常普遍的开关二极管,但是各个仿真软件因为使用不同厂家的器件,造成参数不同。有时需要手动导入仿真软件没有提供的器件模型

模型可以是

  • 通过 .MODEL 使用内置模型,只是修改一下参数
  • 使用 .subckt 定义新的使用各个内置模型创建的子电路

直接编辑spice文件的话,使用 .include似乎就够了,但是在GUI下,需要编辑器件(对应好引脚,这样电路图和仿真模型才能对应)

对于Kicad(NGSpice)

  • https://docs.kicad.org/8.0/en/eeschema/eeschema.html#assigning_models
  • https://ngspice.sourceforge.io/ngspice-eeschema.html#OpAmp1641

对于LTSpice

对于MutiSim

在线仿真网站

有一堆在线网站,后台是否和spice有关不清楚

  • multisim live(商业,收费):https://www.multisim.com/
  • easyeda(国产,免费,后台使用ngspice):https://easyeda.com/
  • circuitlab: https://www.circuitlab.com/
  • everycircuit: https://everycircuit.com/
  • circuitverse:https://circuitverse.org/simulator
  • falsted: https://www.falstad.com/circuit/
  • circuitjs:https://lushprojects.com/circuitjs/
  • dcalab:https://dcaclab.com/

参考

  • https://en.wikipedia.org/wiki/SPICE
  • http://www.ecircuitcenter.com/SpiceTopics/History.htm
  • http://www.ecircuitcenter.com/SPICEsummary.htm
  • https://web.archive.org/web/20090928075648/http://newton.ex.ac.uk/teaching/CDHW/Electronics2/userguide/sec2.html
  • https://www.altium.com/documentation/knowledge-base/altium-designer/understand-spice-models-supported-in-altium
  • https://ngspice.sourceforge.io/ngspice-eeschema.html
  • https://ngspice.sourceforge.io/resources.html
  • https://xyce.sandia.gov/
  • https://people.eecs.berkeley.edu/~boser/courses/40/software/MultiSim-Tutorial.pdf
  • https://www.tina.com/
  • https://en.wikipedia.org/wiki/TINA_(program)
  • https://ngspice.sourceforge.io/resources.html
  • https://p.qorvo.com/qspice-simulator.html
  • http://www.intusoft.com/icap.htm
  • https://ngspice.sourceforge.io/docs/ngspice-42-manual.pdf
  • https://m.elecfans.com/article/1925576.html
  • https://www.analog.com/en/resources/analog-dialogue/articles/spice-vs-ibis-choosing-the-more-appropriate-model-for-your-circuit.html
  • http://www.wrcad.com/manual/wrsmanual/wrsmanual.html
  • https://xschem.sourceforge.io/stefan/index.html

EE