在 Linux 上使用 SPICE 分析电路
SPICE 是集成电路模拟程序(Simulation Program with Integrated Circuit Emphasis),于 1970 年代早期首次由加州大学伯克利分校发布。在 SPICE 出现之前,工程师们手工设计电路,可能会借助计算尺或计算器。根据原始设计构建原型,并根据设计者的目标评估其性能。
如果没有 SPICE 的帮助,设计当今的许多电路将是不可能的。模拟电路通常包含数百或数千个器件。设计和分析涉及寻找联立方程的解。这些方程可以是简单的代数形式,也可以涉及非线性微分方程。仍然会构建原型来评估性能,但考虑到成本高达数十万美元,性能必须在原型制造开始之前很大程度上通过计算机模拟来预测。
SPICE 不仅限于集成电路设计。相反,SPICE 对于分析任何可以用电压源、电流源、电阻器、电容器、电感器、晶体管和一些其他组件来描述的电路都非常有用。
SPICE 3f4 版本于 1993 年发布,源代码对美国友好人士免费提供。您可以从 ftp://sunsite.unc.edu/pub/Linux/apps/circuits/spice3f4.tar.gz 获取源代码副本。
我运行 Red Hat Linux 并使用 Red Hat Package Manager (rpm)。如果您正在运行 rpm,您可以利用 Andrew Veliath 的 spice-3f4-2.src.rpm 包。您可以在 ftp.redhat.com 和镜像站点找到副本。如果您不使用 rpm,您可能需要考虑构建它并使用 rpm2cpio 来解包 spice-3f4-2.src.rpm 包,因为它包含两个非常有用的补丁,用于在 Linux 系统上构建原始源代码。
如果您正在使用 rpm,构建 SPICE 非常简单,只需
rpm -ba -vv SRPMS/spice-3f4-2.src.rpm rpm -i -U -vv RPMS/i386/spice-3f4-2.i386.rpm
第一行从源代码包构建可安装的软件包。第二行安装软件包并更新 rpm 数据库。
如果您不使用 rpm,构建和安装 SPICE 会稍微复杂一些,但也不算太糟。基本过程如下
rpm2cpio SRPMS/spice-3f4-2.src.rpm | cpio -i tar xzpf spice3f4.tar.gz patch < spice3f4.newlnx.patch patch < spice3f4.dirs.patch cd spice3f4 util/build linux
在我的 200MHz 奔腾系统上,编译耗时 12 分钟。
util/build linux install strip /usr/bin/{spice3,help,nutmeg,sconvert,multidec,\ proc2mod} install -m 644 man/man1/spice.1 /usr/man/man1 install -m 644 man/man1/nutmeg.1 /usr/man/man1 install -m 644 man/man1/sconvert.1 /usr/man/man1 install -m 644 man/man3/mfb.3 /usr/man/man3 install -m 644 man/man5/mfbcap.5 /usr/man/man5安装之后才是真正的乐趣——创建和模拟电路。虽然最小化的 Linux 系统可以充分运行 SPICE,但在具有快速处理器(133MHz 或更高)的系统上运行时,分析时间可以显著缩短。额外的 RAM 同样重要,特别是对于更大的电路。我的家用 Linux/奔腾系统有 32MB 内存,而我在工作场所的 SunOS/Sparc20 系统有 128MB 内存。
图 1 显示了一个由双极结型晶体管和电阻器构成的差分对电路原理图。该电路可用于数字或模拟目的,并且在任何一种情况下都可以使用 SPICE 进行模拟。电路以如下方式运行。极少的电流流过晶体管 Q2 的基极,因此可以认为基极保持在接近地电位(零伏)的位置。当输入电压 VIN 较低(接近地电位)时,Q1 将关闭,Q2 将打开。没有电流会流过 Q1,因此 VO1 将为高电平,等于 VCC。IEE 中的所有电流都将流过 Q2。RL2 上的压降将为

因此,电压 VO2 将比 VCC 低 5V。因此,VO2 将为 0V。
在线性模拟操作中,VIN 将保持在接近地电位的位置,除非有偏离地电位的小信号偏移。在这种情况下,差分对将充当放大器,其电压增益为
AV1 = VO1 / VIN = -(gm1/2) * RL1
AV2 = VO2 / VIN = (gm2/2) * RL2
其中 gm1 和 gm2 是两个晶体管的跨导。这些值可以很容易地手动计算出来,但由于本文的重点是展示 SPICE 的工作原理,我们将让 SPICE 告诉我们跨导值。
列表 1 显示了与图 1 中电路对应的 SPICE 输入文件。SPICE 输入文件包含电路及其连接的描述、输入激励、控制 SPICE 将执行何种分析的语句、控制输出的语句、注释和标题。第一行始终是标题,最后一个非空白行始终是 .end。注释行以星号 (*) 开头。任何类型的控制行都以句点 (.) 开头。行继续符是加号 (+),它位于从上一行继续的行的开头。这与 Linux 中常用的反斜杠 (\) 行继续符略有不同,在 Linux 中,该继续符位于要继续到下一行的行的末尾。
此处显示的 options 行
.opt nopage .width in=72 .width out=80
指定在生成的输出文本中不会有分页符,以及输入和输出文本的行长度。下面的第一行指示 SPICE 对电路执行直流分析,其中 VIN 从 -0.15V 运行到 0.15V,增量为 0.010V。下一行告诉 SPICE 生成电路的工作点信息。正是这一行报告了每个晶体管的跨导。
.dc vin -0.15 0.15 0.010 .op
输入文件的中间部分描述了电路元件和电源的连接。在 SPICE 中,连接点被称为 节点。每个 SPICE 电路都必须包含一个编号为零的接地节点。
iee 3 vee 1m
iee 是一个电流源,SPICE 通过前导 i 识别它,其中 1mA 的电流从节点 3 流向 vee 节点。
vin input 0 0 sin(0 0.3 5meg) ac 1
vin 是输入电压源,正端连接到输入,负端接地。输入电压的直流值为 0V。输入电压的时变部分(在 SPICE 术语中为“瞬态”)是以 0V 为中心的正弦波,振幅为 0.3V,振荡频率为 5MHz。输入的交流部分将被归一化为 1V。也就是说,SPICE 中的交流分析不会测试电路的大信号行为。数字行为是大信号行为的极端情况。可以使用 SPICE 中的瞬态分析来模拟电路的大信号性能。
rl1 out1 vcc 5k
rl1 是一个电阻器,连接在 out1 和 vcc 节点之间,阻值为 5k。
q1 out1 1 3 bjt
q1 是一个 bjt 模型实例,集电极、基极和发射极分别连接到节点 out1、1 和 3。下面的模型定义命名了一个类型为 npn 且具有特定参数的模型 bjt。SPICE 知道 npn 晶体管和许多其他类型的电路元件。此定义使用了行继续。
.model bjt npn(bf=80 rb=100 ccs=2pf + tf=0.3ns tr=6ns cje=3pf cjc=2pf + va=50)
列表 1 中的 .plot 行告诉 SPICE 绘制在直流分析期间计算出的节点 out1 和 out2 的电压值。
此命令将使用列表 1 中的名为 diffpair-1.cir 的输入文件运行 SPICE 分析
spice3 -b diffpair-1.cir
-b 选项使 SPICE 在批处理模式下运行。列表 2 显示了 SPICE 分析的输出。工作点信息给出了电路中所有节点的直流偏置电压以及流过每个电压源的电流。测量电流的常用技巧是插入一个电压为零的电压源。这不会妨碍模拟性能,但电路模拟速度会稍慢,因为它包含更多内容。报告了模拟中使用的每种电路模型的模型参数。两个 bjt 实例的运行特性表明每个晶体管的跨导为 0.0191 A/V。
直流传输特性图显示了输出电压,从左到右,范围从 0V 到 5V,并显示了输入电压,从上到下,范围从 -0.15V 到 +0.15V。每次我看到这样的图时,我都会感到怀旧,回忆起那些在 PDP-8 前面板上拨动开关并从纸带加载引导程序的日子。但这又是另一个故事了。按照今天的标准来看,这张图当然不算花哨,但它确实传达了必要的信息。
最后,SPICE 报告模拟运行时间不到十分之一秒。
列表 3 向列表 1 中的 SPICE 输入文件添加了更多分析指令。要执行的分析包括直流、传递函数、交流和瞬态。这次我们将启动 SPICE 并使用一个选项将结果数据保存到文件中,如下所示
spice3 -b -r diffpair-2.raw diffpair-2.cir
运行 SPICE 后,可以使用 nutmeg 浏览数据文件,nutmeg 随 SPICE 软件包一起提供。只需运行即可启动 nutmeg
nutmeg diffpair-2.raw
列表 4 捕获了与 nutmeg 的交互式会话。在第一个 nutmeg 提示符下,我输入 setplot 以显示原始数据文件中的分析数据集的名称。我选择了 dc1,然后绘制了输出电压,如图 2 所示。以这种方式绘制时,您可以使用鼠标右键定义缩放图的边界,从而放大图的某些部分。您还可以通过单击或单击并拖动鼠标左键来查找图上任意点或点对的坐标。坐标显示在 nutmeg 运行的窗口中。您可以通过键盘输入在图上添加标签。通过适当设置硬拷贝设备的类型,您可以将图保存到文件中以供以后打印,如 nutmeg 命令 3 到 5 所示。
接下来,在列表 4 中,我选择了传递函数数据。display 命令向我显示了可以从传递函数数据中查询的变量。在提示符 9 处,我要求查看 SPICE 报告为 44.60971 的传递函数。这与理想化的增益方程略有不同,后者忽略了 bjt 的输出电阻。

在提示符 10 处,我没有只选择一个变量进行显示,而是选择了所有变量进行显示。这表明输出阻抗约为。

,输入阻抗约为

Nutmeg 提示符 11 到 16 创建了节点 out2 处电压相位(以度为单位)、节点 out2 处电压相位(以弧度为单位)和节点 out2 处电压幅值的交流分析图。这些分别显示在图 3 到图 5 中。
提示符 17 到 19 生成了图 6,该图显示了输入电压正弦波和输出电压正弦波。请注意,输出电压显示了过驱动放大器的失真。
在提示符 20 处,我对时域电压进行了傅里叶分析,以找到失真正弦波的谐波含量。我必须将基频指定为 5MHz,与输入文件中给出的频率相同,以及傅里叶分析应检查的节点电压。正如从输出正弦波的压缩形状所预期的那样,总谐波失真 (THD) 非常高。
如果您在使用 SPICE 时遇到问题,很可能是因为您无法分析某个电路。好消息是 SPICE3 在这方面有所改进,并且您可以控制数值解的确定方式。当 SPICE 计算节点电压和支路电流时,它使用可容忍误差的阈值来确定模拟何时达到其答案,即何时达到数值收敛。控制阈值的三个参数可以在 .options 语句中设置,分别为 ABSTOL、VNTOL 和 RELTOL。ABSTOL 是您希望 SPICE 接受的最小电流。将 ABSTOL 从其默认值 12pA 增加可以帮助模拟收敛。VNTOL 是您希望 SPICE 接受的最小电压。将 VNTOL 从其默认值 10V 增加可以帮助模拟收敛。RELTOL 是当前迭代期间找到的数值答案与上次迭代期间找到的数值答案的比率。增加 RELTOL 可以帮助直流分析收敛,但增加 RELTOL 也可能导致瞬态分析问题。如果您收到来自 SPICE 的警告,提示“timestep too small”(时间步长太小),则 RELTOL 可能设置得太大。
参数 ITL1 到 ITL6 控制 SPICE 放弃之前要执行的迭代次数,并使用控制方法来实现收敛。
显然,模拟结果的准确性不可能优于分析期间使用的收敛阈值。如果您不需要放宽阈值,这不会造成问题,因为组件值的公差和组件性能的变化会在标称模拟性能与实际测量性能之间造成更大的差异。
本文远非对 SPICE 可以为您做什么以及如何充分利用它的详尽介绍。SPICE 对工程师来说既普遍又有用,并且已经有近 30 年的历史了。如果您从未使用过 SPICE,我希望您至少了解了工程师的谋生工具。如果您使用或将要使用 SPICE,我希望本文能让您深入了解它在 Linux 机器上的使用。
