接前面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 |
|
单位:V、A、HZ、OHM、H、F、DEG
注意,最好不要加单位。
标题行
标题行必须是输入文件的第一行
1 |
|
结束行
结束行,注意前面的 .
。
1 |
|
注释行
与C语言中使用 //
或 /* */
进行注释不同,SPICE中使用星号(*
)来注释行,例如:
1 |
|
行内注释,使用分号 ;
,有的用SPICE支持 $
。
1 2 |
|
续行
在不同的 SPICE 版本中,续行符的使用有细微的差异。在多数 SPICE 方言中,使用加号(+)作为续行符。加号放在新行的行首。
元件说明
每个元件在SPICE中都用一行文本描述,格式通常为:
1 |
|
例如,电阻类型用R标识,一个电阻可以描述为:
1 |
|
这表示一个名为R1的电阻,连接在节点1和节点2之间,阻值为100千欧姆。
注意,名字和节点,不一定用数字(节点地必须是0)。所以下面也可以
1 |
|
常用元件的类型:
- 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 |
|
这表示进行瞬态分析,步长为1微秒,总时长为100毫秒。
在ngspice中,支持.control 块功能。块中可以包含任何有效的 ngspice 命令,比如设定仿真选项、执行仿真和后处理数据等。
1 2 3 |
|
模型描述
设备模型对于准确模拟电子元件在各种条件下的行为至关重要。SPICE定义了多种模型类型,每种模型在 SPICE 中都有特定的参数集,这些参数可以根据实际器件的数据手册进行调整以匹配实际行为。
SPICE中的.MODEL语句允许用户定义诸如二极管、晶体管等半导体器件的特性。这些模型有助于预测器件在电路中的运行情况。
.MODEL语句在SPICE中的通用格式如下:
1 |
|
- MNAME:这是模型名称,用于在仿真的其他部分中唯一标识此模型。
- TYPE:指定设备的类型。常见类型包括MOSFET的NMOS和PMOS,双极结型晶体管的NPN和PNP,二极管的D等。
- PNAME1, PNAME2, ...:这些是针对所建模设备类型的参数名称。
- PVAL1, PVAL2, ...:每个参数的对应值。
例如:
1 |
|
这定义了一个NMOS型号为M1的模型,指定了多个物理参数。
定义好之后,可以通过原件类型M使用它。
1 |
|
这里,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 |
|
.ENDS 后面的子电路名可以省略。
子电路的调用就像使用任何其他内置元件一样。调用子电路的语法通常如下:
1 |
|
例子:
1 2 3 4 5 6 7 8 9 10 11 |
|
- OPAMP 是子电路的名称,1, 2, 3 是端口节点。内部包含了输入电阻 Rin,一个控制源 G1 和输出电阻 Rout。
- XU1 表示一个子电路实例,连接到节点 1, 0, 和 2。OPAMP 是调用的子电路名称。
文件包含
.INCLUDE 语句的基本语法如下:
1 2 |
|
文件路径是要引入文件的完整或相对路径。使用双引号(")或单引号(')均可用来包围文件路径。
非标准的 .LIB,在一些SPICE中,用于导入第三方库。比如ngspice中:
1 |
|
函数
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_expr
或else_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 |
|
SPICE 解算器?
SPICE使用数值积分方法来求解由网表定义的电路方程。这些方程通常是非线性微分方程。
- 节点分析
- 基于节点电压法,将电路转化为节点电压方程。利用基尔霍夫电流定律(KCL)构建方程。 2. 稀疏矩阵技术
- 由于电路方程组通常是稀疏的,SPICE 使用稀疏矩阵存储和操作数据,以节省内存和提高计算速度。 3. 牛顿-拉夫森迭代法
- 用于求解非线性电路方程。通过线性化非线性方程并反复迭代逼近求解。
- 每次迭代计算雅可比矩阵,并求解线性方程组。 4. 瞬态分析
- 使用梯形积分法和向后欧拉法进行时间步进,模拟电路的动态行为。
- 梯形法稳定性高,适合大多数电路仿真。 5. 直流分析
- 计算电路在直流稳态下的行为。通过迭代求解节点电压,确定稳态电流和电压。 6. 交流分析
- 通过线性化电路,使用小信号模型进行频域分析。
- 计算电路的增益、相位等频率响应特性。 7. ...
杂项
命令行
SPICE有交互式模式、批处理模式以及server模式。不过直接手动编辑spice文件的场景应该挺少了,都是通过GUI界面绘制电路图。
对于ngspice来说,其他软件还可以直接使用其动态库,比如KiCAD。
ngspice 行为
ngspice源自spice3f5,远远不像其他商业版本进化那么快。通过 ngbehavior 来模拟一些兼容行为
1 |
|
注意写法,这些都是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
- LTspice: Simple Steps to Import Third-Party Models
- https://ieee.li/pdf/viewgraphs/ltspice_importing_third_party_models.pdf
对于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