SPICE 入门 (The SPICE Book Ch.1)

电路计算模拟介绍

电气电路计算机模拟的目的

要了解电路的行为特性,就需要同时求解多个方程。其中最简单的问题是确定线性电路的直流工作点,这需要解出由基尔霍夫电压定律(KVL)、基尔霍夫电流定律(KCL)以及支路特性方程(BCE)推导出的一组方程。对于由线性支路电压-电流关系描述的小型线性电路,通过手算可以很容易地得出精确的直流解。而对于较大的线性电路,直流解以及尤其是频域或时域解则非常复杂。包含由电流和电压之间的非线性关系描述的元件的电路的分析会增加另一层复杂性,需要同时求解非线性支路方程以及基于基尔霍夫定律的方程。只有小型电路可以通过手算求解,但所得结果只是近似值。在电子学课程中,工程师们学习进行某些近似处理,以便通过手算来预测小型电路的直流工作状态。

当需要预测电路在时间或频率上的行为时,又增加了一层复杂性。此时的非线性方程就变成了积分微分方程,这些方程只有在采用诸如小信号近似或其他限制性条件等近似方法的情况下才能通过手算求解。

多年来,从事分立元件设计的人员一直使用面包板来分析和测试电子电路的行为。直到今天,仍有一些设计师采用这种方法来构建模拟电路。但随着 1964 至 1965 年间集成电路制造技术及相关新型电路技术的突破,这种面包板设计方法已不再适用。不仅集成在同一块硅片上的晶体管与面包板上的分立晶体管的行为不同,而且集成电路中的电路元件与分立元件也有差异;例如,晶体管在集成电路中成为标准的负载元件,而在面包板上则是电阻器。在硅片上制造集成电路是一项既昂贵又耗时的工艺。制造一个集成电路需要经过几个阶段:首先,需要确定工艺流程,然后进行电气设计并生成电路布局;在每个制造步骤中使用的光刻胶板都会根据布局生成所需的硅中电路等效物;最后,对硅片进行测试以确保其正常运行。这种昂贵的制造流程要求在第一次设计时就能确保电气设计的正确性。由于电气设计工程师在硅片上没有机会通过反复试验来验证设计的正确性,所以就需要一个虚拟的面包板。这个虚拟面包板可以通过数字计算机通过电气分析或模拟程序来生成。用于对网络进行电气分析、且在求解基尔霍夫电流定律、基尔霍夫电压定律和支路特性方程时不采取任何捷径的程序被称为电路模拟器。

另一个促使开发用于电路分析的计算机程序的重要因素是同期数字计算机技术的进步。基于固态逻辑技术(SLT)的通用计算机,如 IBM 360 系列,采用了硅半导体二极管和晶体管的混合技术(这是单片集成电路的前身),于同一时期问世,具备与当今计算机相似的功能,其平均故障间隔时间(MTBF)也大幅优于前一代产品。同时,CDC 6400/6600 科学计算机也于同一时期推出,其架构创新领先于当今超级计算机的原理。

这两项技术因素——集成电路和高性能计算机——不仅明确了自动化电子电路设计流程的需求,还提供了实现这一需求的工具。众多研究人员开始研究用于自动化预测电子电路行为的最佳技术和算法(佩德森 1984 年)。第一代程序,例如 1965 年的 ECAPI(IBM 1965 年发布),只能解决分段线性网络,其适用范围相当有限。20 世纪 60 年代末,数值技术的进步促使非线性分析程序的开发,例如 SPICE1(最初名为 CANCER,纳格尔和罗赫勒 1971 年提出),以及 ECAP II(布兰金、霍格塞特、伦德和库格尔 1971 年提出)。

如今市面上有许多所谓的第三代电路模拟程序,它们都源自上述的第二代非线性程序。二十年前的努力成果如今已体现在两种最为常用的电路模拟器中,即 SPICE2(纳格尔 1971 年提出)和 ASTAP(韦克斯等人 1973 年提出),目前它们被称为 ASX。在引言部分,对电路模拟(总体而言)以及 SPICE(具体而言)的发展历程进行了详细的概述。

什么是 SPICE ?

SPICE 是一款通用的电路模拟程序,适用于非线性直流、非线性瞬态和线性交流分析。如上所述,它会求解节点电压的网络方程。该程序同样适用于解决线性以及非线性电路问题。从开关电源到随机存取存储器单元和检波放大器等各种应用的电路,都可以通过 SPICE 进行精确模拟。电路可以包含电阻、电容、电感、互感、独立电压和电流源、依赖电压和电流源、传输线以及最常见的半导体器件,如二极管、双极结型晶体管(BJT)、结型场效应晶体管(JFET)、金属氧化物半导体场效应晶体管(MOSFET)和金属-半导体场效应晶体管(MESFET)。

该程序中的直流分析部分会计算在电容器断开、电感短路的情况下电路的偏置点。SPICE 通过迭代来求解非线性网络方程;非线性主要源于半导体器件的非线性电流-电压(I-V)特性。

交流分析模式会根据输入端施加的正弦信号的频率来计算线性电路中节点电压的复数值。对于非线性电路(如晶体管电路),这种类型的分析需要采用小信号假设;也就是说,激励源的幅度被假定为小于热电压(在 27°C 时,V = kT/q = 25.8 毫伏,或 80.6°F)的值。只有在这种假设下,非线性电路才能在其直流偏置点附近用其线性化等效电路来替代。

瞬态分析模式会计算电路中每个节点的电压波形随时间的变化情况。这是一种大信号分析:对输入信号的幅度没有限制。因此,半导体器件的非线性特性也被考虑在内。

在 SPICE 中,还提供了与上述三种基本模拟模式相关的更多分析类型。这些内容在第 4 章至第 6 章中有详细描述。

要理解 SPICE 的工作原理,最好的方法是亲手计算一个电路;SPICE 会利用节点方程来建立并求解电路方程,其方式与人们为电路编写 KVL、KCL 和 BCE 方程并求解的过程相同。在第一个示例中,通过一种类似于 SPICE 解法的方法,手动计算了一个线性电阻网络的直流解。

示例所示电阻桥式电路中的节点电压,并求出流经偏置电压源 V~BiAs~ 的电流。请使用图中给出的电源和电阻值进行计算。

节点电压法

这里本质就是利用节点电压法获得该纯电阻电路的静态网络方程组,在 SPICE 中,式 1.1 和 1.2 是根据电路拓扑结构的图表而制定的。通过高斯消元法得以解决。在本例中,通过手工计算得出的结果与通过 SPICE 计算得出的结果进行了比较。

对一个单晶体管放大器(一种非线性电路)的分析已在文中以下示例进行了描述。这种手动推导方式为我们提供了一些关于 SPICE 如何实现自动化求解非线性电路的偏置点解决方案。

这里的 BJT 箭头朝下,代表电流从上至下,因此 BE 正偏,BJT 是 NPN 型,多数载流子是电子。当节点 1 输入基极电流,空穴涌入,与 P 区少数载流子复合减少了耗尽层厚度。于是 E 区注入的大量电子以扩散电流的方式经过 BE 结,并在 BC 结的耗尽区边缘被 BC 电压迅速拉至 C 区,形成大量漂移电流。(扩散电流是由载流子浓度高往低运动的,漂移电流是由电场驱动的,不管是内建电场还是外部驱动电场)

之所以在 B 区,也就是基区引脚加电阻,是为了调控 BE 的电压,因为 BE 电压决定了耗尽层的厚度,也就是闸门的大小。BE 电压越大,耗尽层厚度越小,闸门越开放,扩散电流越大,会有更多 E 区,也就是发射极电子经过闸门,最后在 BC 处被电压以漂移电流的形式拉到 C 区集电极。因此集电极电流的大小由闸门口,也就是基极电流大小决定且近似成正比。由此可列出 KVL,

{ RBIB+VBE=VCCICβFIBVBE>0.5 V & VBC<0 V\left\{\ \begin{aligned} &R_BI_B+V_{BE}=V_{CC}\\ &I_C\approx\beta_FI_B\\ &V_{BE}>0.5\ V \ \&\ V_{BC}<0\ V \end{aligned} \right.

指的是 BE 正偏需要克服内建电场的程度和 BC 必须反偏。前向有源区需要 BE 结强正偏以克服内建势垒并大量注入载流子,同时 BC 结必须反偏以提供强电场,将基区注入的载流子迅速扫入集电区,从而获得高电流增益。

这时候就出现问题了,如果 IBI_B 越大,VBEV_{BE} 应该越小,这样 BE 耗尽层厚度越大,ICI_C 越小才对啊。

这里犯了一个前提错误,那就是将整个电路当成了纯电阻电路,认为基极电流 IBI_B 是可以任意决定的。实际上 IBI_B 的电流是由 VBEV_{BE} 决定而非独立的,仅有某个确定的 IBI_B 满足 KVL。KVL 方程 RBIB+VBE=VCCR_BI_B+V_{BE}=V_{CC} 表面上是 IBI_BVBEV_{BE} 的二元关系式,实际上仅有一个独立变量,也就是说确定了 RBR_BVCCV_{CC}IBI_BVBEV_{BE} 全都确定了,对于一组 RBR_BVCCV_{CC},仅有唯一一个 IBI_B 满足该 KVL。

而确定这个 IBI_BVBEV_{BE} 关系,或者说 ICI_CVBEV_{BE} 关系的闸门方程,就是 BCE 方程,即描述支路特性的方程。

IC=ISeqVBE/kTI_C=I_Se^{qV_{BE}/kT}

其中 kT/qkT/q 是热电压,因为 PN 结电流由载流子的 扩散机制 决定,而扩散-漂移关系、载流子统计满足 Boltzmann 分布 eE/kT=qV/kT=V/VT∝e−E/kT=qV/kT=V/V_TISI_S 是反向饱和电流,当 PN 结反向偏置时,由少数载流子漂移产生的极小电流,也决定了正偏时指数 I–V 曲线的“基准电平”。ISI_S=(少数载流子浓度)×扩散系数×器件几何尺寸。

对于 VBEV_{BE} 的结果应根据 IcI_c 的值进行验证并加以完善。显然,通过手写并计算 KVL 和 BCE 是繁琐的。然而,在计算机上,重复或迭代上述解决方案,直到所有数据一致或收敛,却是轻而易举的事。在认可上述解决方案之前,还有一项细节需要核实:必须满足 的条件。BJT 的完整电特性(见第 3 章)已在 SPICE 中进行了编码,从而确保了其准确性。无论操作区域如何,均进行分析。

上述例子简要地概述了使用 SPICE 来求解非线性电路所采用的迭代流程。在下一节中,将给出此电路的 SPICE 输入文件。先列出电路,然后计算机模拟并亲手计算验证结果。

通过电脑与 SPICE 进行交互

电路规范——SPICE输入

在将 SPICE 软件安装到任何计算机上之前,用户必须创建一个 ASCII 文件,该文件需包含两种信息:电路描述和分析请求。此文件被称为 SPICE 输入文件或 SPICE 板。为了便于识别文件,输入文件通常会按照电路名称加上后缀的方式命名,例如电路的名称加上“.ckt”或“.cir”(表示电路)、“.spi”(表示 SPICE)、“.in”(表示输入)等等。尽管 SPICE 输入文件可以有任意名称,但推荐使用上述命名规则:电路名称.后缀

用户可以使用自己选择的编辑器来创建该文件。SPICE 输入语言采用自由格式,由一系列语句组成。大多数语句仅一行长,但 SPICE 也接受多行语句;续行行必须在第一列以“+”开头。一条语句包含多个字段,这些字段由分隔符字符分隔,分隔符字符包括空格、逗号、等号(=)或左括号或右括号;多余的空格将被忽略。

各种 SPICE 版本的一个最重要的共同特点是,它们都接受基本的 SPICE 输入语言,即 SPICE2 语法。较新的和专有的 SPICE 版本具有额外的功能,用户应查阅特定版本的用户指南以了解额外的功能。只要使用本文中描述的功能(除了 SPICE3 或 PSpice 的扩展外),输入文件应能被各种 SPICE 版本读取。高端 SPICE 产品支持原理图级别的规范,通过画电路图就可以转成 SPICE 语言。

任何 SPICE 输入文件都必须以标题声明开头,该声明用于标识电路,并且必须以结束声明结尾,而结束声明始终是“.END”。这两行内容必须分别始终位于文件的开头和结尾位置。还有一些行在第一列以星号开头;这些是注释声明,用于记录电路描述和分析请求。

SPICE 规范是基于组件的。因此,要描述电路就需要将图中的信息(即元件名称、连接方式和值)转移到一个文本文件中,如下所示。

1
2
3
4
5
6
7
8
9
10
BRIDGE-T CIRCUIT
*
VEIAS 1 0 12
R1 1 2 10
R2 2 0 10
R3 2 3 5
R4 1 3 5
*
.OP
.END

电路描述由第 3 到第 7 行的元件说明组成,每个元件都能很容易地识别出来。SPICE 输入文件中的其他行是标题,表明该电路为“桥式电路”;两行以第一列的星号开头的注释行;以及必须始终作为电路和分析描述的结束的“.END”行。 在 SPICE 输入文件中,还需要一种类型的陈述语句,即控制语句。控制语句的第一列包含一个句点,并且会定义要执行的分析类型以及要存储的输出变量。为了验证电路偏置点的计算结果,需要一条“.OP”行,它要求进行直流工作点分析。

上述电路描述被保存在文件“bridget.ckt”中(其实.cir/.sp都行,或者说是个文本就行),该文件用作 SPICE 的输入。这种输入描述在使用穿孔卡片的时代被称为 SPICE 板。下一节将介绍如何运行 SPICE 模拟的一些详细信息。SPICE 读取电路描述,并将其编译为内部表示形式。在 SPICE 中,内部设置了与前面相同的节点方程,并将其作为线性系统求解。

接下来考虑单晶体管电路。该电路包含电阻、一个双极型晶体管和一个电压源。按照上述方法,我们将图中的信息转换为 SPICE 所要求的格式:每行一个元件,名称在前,接着是节点和值。电阻 RCR_CRBR_B 以及电压源 VCCV_{CC} 可以按照上述表格中使用的相同格式进行指定。桥式电路框架中不存在的新元件是 BJT。BJT 的第一个字符是 Q,所以名称是 Q1;必须指定三个节点,分别代表集电极、基极和发射极。而不是像电阻那样只有一个值,而是由一系列通过“.MODEL”语句定义的参数来体现;假设描述 Q1 的模型的名称为 QMOD。这个名称会取代晶体管行中的值字段。

晶体管 Q1 的模型参数(包括正向增益 Br 和饱和电流 Is)在 QMOD 的全局“.MODEL”语句中进行了指定。该晶体管为 NPN 型,SPICE 中的参数名称分别为 βF\beta_FISI_S,即 BF 和 IS。 在将上述所有描述内容输入到所选的编辑器中之后,SPICE 的输入规范如下所示。我们将电路保存到名为“bjt.ckt”的文件中。

这里我们用 LTspice 软件对上面提到的 T 型电路和晶体管电路进行分析

LTspice 有两种方式写 SPICE netlist(网表语言):

  1. 在 asc 里直接写文本指令

    asc 操作 直接写在版图上
  2. 新建一个文本文档来写

    新建一个记事本文件,在里面写好代码,然后在 LTspice 里打开并运行

    打开文本文件 选择所有文件 写代码

SPICE 会区分名称字段和数字字段。例如,名称字段如 Q1、RB 或 QMOD 必须以字母(A 至 Z)开头,随后可跟其他字母或数字。SPICE2、SPICE3 和 PSpice 不区分大小写,但某些特定计算机版本的 SPICE 可能要求输入文件必须为大写形式。

一个数域可以包含整数,例如 5 或 -123;也可以包含浮点数,例如 3.14159;还可以包含科学计数法表示的浮点数,例如 1E-16 或 2.65E5;或者可以是整数或浮点数再加上 SPICE 所认可的以下缩放因子之一:T = 1E12、G = 1E9、MEG = 1E6、K = 1E3、MIL = 25.4E-6、M = 1E-3、U = 1E-6、N = 1E-9、P = 1E-12 和 F = 1E-15。上述示例中电阻 RCR_CRBR_B 的值,即 1K 和 200K,是以千欧为单位表示的,使用了缩放因子 K。

在数域中,紧接在比例因子之后的字母,或者紧接在数字之后但又不是比例因子的字母都会被忽略。因此,10、10V、10VOLTs 和 10HZ 表示的是同一个数 10,而 M、MA、MSEC、MMHOS 则表示同一个比例因子 10-3。许多用户喜欢在数字字段后附加单位,例如 10V、1PF 或 10UM。只要不将物理单位与比例因子混淆,这些都是有效的规格;例如,在 SPICE 中,1F 表示 10-15 而不是 1 法拉。另一个常见的错误是混淆 M、MEG 和 MIL;20MHZ 不是 20 兆赫兹而是 20 毫赫兹,而 0.1MIL 不是 0.1 毫米而是 2.54 微米。 该电路描述由一系列元件说明组成,例如上述示例中的 Q1 至 VCC 等。每个元件说明都包含元件名称,该元件所连接的电路节点以及相关参数的值确定该元件的电气特性。元件说明的一般格式为

1
Aname nodel node2 <node3 ... ><MODELname><value1 ... >

第一个字段总是包含元件的名称,该名称必须以标识元件类型的字母开头,例如“R”代表电阻器、“Q”代表双极型晶体管,而“V”代表电压源。除了第一个字母外,元件名称的其余部分可以包含字母和数字。SPICE2 将名称限制为八个字符;而 SPICE3 和 PSpice 则不限制名称的长度。

以下这些字段,即 node1、node2、<node3…> 等,均为小写形式,用以表明它们是数字字段;它们代表了元件所连接的节点编号。SPICE2 仅接受数字作为节点标识,而 SPICE3、PsPice 以及大多数商业 SPICE 版本则允许使用节点名称。在本文中,名称为大写或以大写字母开头的字段为名称字段,而名称为小写的字段则为数字字段。括号内的字段是可选的,或者根据类型需要存在。本书中使用粗体字符来标识 SPICE 语言中的关键字和参数名称。本文中所使用的所有约定的完整列表可在第 2.1 节中找到。

每个元素都必须至少有一个值来加以描述。这个数字字段被标记为可选,因为 SPICE 会根据具体情况提供默认值,例如 0 或 1。如果缺少值字段,则会根据上下文提供默认值。另外,有些元素(例如晶体管)是通过多个值来描述的,这些值会分在单独的一行中,称为模型说明。这些元素不会引用值字段,而是引用包含参数的模型定义的名称,即 MODELname。在示例中定义 Qi 参数的模型的名称是 QMOD。请注意,元素行的结尾要么是值,要么是模型名称。

该模型语句允许用户仅一次性指定一组适用于多个元件的参数,例如,所有具有相同几何形状并集成在同一硅芯片上的晶体管的参数。对于每个引用的 MODELname,电路规范中必须包含一个“.MODEL”语句。该“.MODEL”语句属于另一种类型的语句,即全局语句。

“.MODEL”语句的一般格式为

1
.MODEL MODELname MODELtype PARAM1=value1 PARAM2=value2…

第一列中的这一段将全局和控制语句与元素语句区分开来。MODELname 用于唯一标识一组适用于一个或多个元素的参数集合,而 MODELtype 则是 SPICE2 或 SPICE3 所支持的七种或十一种模型类型之一(具体取决于所使用的版本)。示例中的晶体管 Q 是一个 NPN 型晶体管,是 SPICE 中用于双极结型晶体管的两种 MODEL 类型之一。可以指定从零到特定模型类型所支持的最大模型参数数量之间的任何数值。每个的 PARAM1、PARAM2… 都必须是该模型类型所定义的可接受关键字之一,这些关键字在第 2 章、第 3 章和附录 A 中均有定义。模型 QMOD 仅定义了两个参数,即饱和电流 IS 和正向电流增益 BF,用于示例中单晶体管电路中的晶体管 Qi。

不同的几何形状可能会受到相同的参数影响,例如阈值电压和薄膜氧化层厚度。因此,引用“.MODEL”语句的元件可能需要一些特定于自身的值。所以,复杂的元件,比如晶体管,其特性由元件行中定义的器件参数和在“.MODEL”语句中分组的模型参数共同决定。例如,MOSFET 的不同沟道宽度 W 和长度 L 是在元件语句中定义的。

在 SPICE 文件中,最后需要列出的一类陈述是控制陈述。控制陈述指定了 SPICE 要进行的分析以及定义初始状态。所有控制陈述的第一列都以一个点开头。在示例中,通过“.OP”行来请求直流偏置点。第 4 章至第 6 章详细描述了所有控制陈述。

总之,每一个 SPICE 输入文件都具有以下基本结构:

1
2
3
4
5
6
Title statement
* Comment statements
Element statements
Global statements
Control statements
.END (end statement)

SPICE 仿真 —— DC 分析

接下来的步骤是运行模拟程序。SPICE2 在全球各种类型的计算机和操作系统上均可使用,本部分并未列举所有可能的情况,而是仅限于学生和专业人士最常使用的那些计算机。

我这里就不用原书中 UNIX 系统了,直接在 LTspice 中显示运行后的结果

桥式电路支流分析 BJT直流分析

上述示例旨在向计算机模拟的新用户展示 SPICE 输入语言是多么自然,以及该程序为进行简单的直流分析所提供的输出信息是多么简单明了。在本章及后续章节中,将对所有支持的元素和分析模式进行描述,并介绍使用 SPICE 解决电路问题的最佳方法。

SPICE 仿真 —— AC 与瞬态分析

到目前为止,我们已经学会了如何写一个 SPICE 电路文件,需要用到哪些类型的声明,如何在电脑上跑分析程序,如何从 DC 分析输出文件中获取结果。目前仅介绍了一个控制声明:.OP,这对于计算所有的节点电压是足够的。

除了 DC 分析,SPICE 还提供了稳态正弦分析(由 .AC 命令所调用)和时域分析(由 .TRAN 所调用)。这些分析会对每个结点的所有频率或时间进行计算,由此产生了大量的数据。对于小型电路,例如前面的两个例子,这没啥问题,但随着电路规模的扩大,输出文件的大小会让我们关注的结果愈发变得难找。因此,我们用 .PRINT 和 .PLOT 两个声明定义我们感兴趣的节点,或者更一般的,我们想要的输出变量。.PRINT 和 .PLOT 仅定义了保存在输出文件中的结果;各种版本的 SPICE 还具有额外的控制行或交互式命令,这些命令能让用户访问已保存在二进制文件中的结果,并借助后处理程序以图形模式显示这些结果。如果对典型应用进行解释,那么对 SPICE 模拟结果的解释会更容易理解。下面的示例介绍了 SPICE 频率(或交流)分析以及如何将结果以 Bode 图的形式显示出来。

AC 分析 AC分析电路和网表

这里使用了两个新的控制语句,即“.AC”和“.PRINT”。第一个语句表示对稳态频域分析的请求,并定义了频率变化的类型(LIN)、频率的数量(1)以及起始和结束频率(在本例中均为 10 赫兹)。

第二个命令“.PRINT”是当用户希望将分析结果写入输出文件时必不可少的。与直流工作点分析的“.OP”情况不同,在后者中,SPICE 会自动将结果写入输出文件;而对于其他类型的分析,用户必须指定要保存在输出文件中的数据类型。.PRINT 关键字后面必须跟上分析类型(在此例中为“AC”),以及要保存在输出文件中的电路变量。对于 AC 变量,必须以字符“V”(表示电压)或“I”(表示电流)开头,并跟上一个或多个额外字符,以指定是希望得到极性值还是复数值。AC 电压和电流是相量,可以表示为实部和虚部的形式,如 VR(2) 和 VI(2),或者幅度和相位的形式,如 VM(2) 和 VP(2)。这两个命令的具体内容分别在第 5 章和第 4 章中有详细描述。在大多数 SPICE 版本中,包括 SPICE2 和 SPICE3,在大多数情况下只能测量通过电压源的电流;因此,在“.PRINT”行中请求的电流必须始终以电压源名称作为参数。

这里需要注意的是,LTspice 已经不支持 .PRINT 语法了,它只会将所有的结果都输出出来。另外 .PLOT 也没啥用,因为 LTspice 里自带波形图显示。

这里我直接用 LTspice 给出结果(DEC 指的是一个decade画多少个点)

AC 仿真结果

后面是瞬态分析

瞬态分析

这里 VIN 1 0 PWL 0 0 10N 5 25M 5 25.01M 0 是一条 分段线性(PieceWise Linear, PWL)电压源 指令,用来定义一个任意波形电压源。

时间 t 电压 v 含义
0 0 V 初始为 0 V
10 ns 5 V 10 纳秒上升到 5 V
25 ms 5 V 从 10 ns 到 25 ms 保持 5 V
25.01 ms 0 V 在 25.01 ms 回落到 0 V

LTspice 仿真结果

瞬态仿真结果