本文是Proteus VSM SDK英文版的中文翻译件,出于非营利目的,大家可以自由下载、转载、传播,但也请出自以上目的。
本人不提供Proteus软件的下载,有需要者可以上网搜索,或与Labcenter公司联系。
翻译的初衷为仅用于我自己研究学习。
我没有义务保证其中的所有语句与术语的正确性,但如果您能以朋友的身份指出其中的错误,我是非常欢迎的。
凡是因为参考本文而导致的额外工作或其它损失,您可以来找我,我会微笑着向您说声报歉,也可以与你握手致意,然后我们可以商量那些不合适的翻译之处,其余事项我就不负责了。
还有一点需要说明的是,我做事的耐心与恒心不够好,这篇文章的英文原版共有289页,但我一天仅能安排一点时间来做这件事,可能每天能翻译4~5页,还不能保证每天或每周都能持续地做这件事,所以,等到翻译完成后,可能会到公元20xx年了,嘿嘿,希望您能督促我一下。
哦,还有一点,如果哪位发现已经有了中文版,请告诉我,我就不做这件事了。
在这里发图片实在是太费事了,所以干脆不发。
在这里排版也有点不太爽,所以干脆不排,直接把pdf文件文本内容复制到此。
本文pdf版本文件可到http://www.drgraph.com/viewthread.php?tid=357&extra=page%3D1&frombbs=1下载。
欢迎交流。
QQ: 282397369
MSN: [email protected]
EMAIL: [email protected]
Mobile: 133****8893
Web: http://www.DrGraph.com
陈斌文
2009-6-23
本文主要介绍如何使用Proteus VSM来创建您自己的模型。
作为本文的读者,本文期望您是本系统的高级用户,并清楚怎样使用ISIS与PROSPICE进行原理图设计与仿真;我们还希望您具备必要的电路基础知识,能完成可正确模拟您所期望现象的仿真模型。这不是可有可无的要求,因为其中包括许多技能,这些技能将使您能决定正确的处理方式。
您可以登录www.labcenter.co.uk查看现有的模型信息。您也可以就将在VSM领域内研发的模型提出申请。
本文最后更新日期:30/10/2000
本节将简要介绍SPICE如何进行电路仿真。如果您希望创建复杂的模拟电路元件模型,建议您阅读SPICE3F5相关文献。
下面仅就暂态分析进行讨论。
一般来说,电路由节点与支路组成,其中,节点为两条以上的支路的共同连接点。在SPICE术语中只有节点电压,在支路已知的情况下,这就足以求解出所需的支路电流。
电路中,有三种基本的元器件,即:
l 电阻
l 理想电流源(VCCS或CCCS)
l 理想电压源(VCVS或CCVS)
可使用矩阵与向量来表示电路、当前状态及其结果。向量可看成是单维矩阵,或者是一个简单的数列。在各计算阶段,均需计算表达式
[I][Y] = [V]
其中,[I]与[V]为向量,而[Y]为一个二维矩阵。请注意该表达式与欧姆定律相类似。该表达式还代表了以下形式的方程组:
IaYa + IbYb + IcYc = V
这样可以求解V。V也经常表示RHS向量,它位于上述方程右手端(Right Hand Side, RHS)。
根据构成电路的支路,可设置[I]与矩阵[Y]中的值,从而求得矩阵方程的各个解,即[V]的各个分量。这些值可能是来自元件模型中的特定值,它们可以表示该模型的一些状态。因此,[I]与[Y]一起将确定电路状态,而[V]表示了结果。
呵呵,可视一个电阻为一个线性电压控制电流源,且其输入输出节点包含相同管脚。实际上,SPICE就是通过将[I]与[Y]中的不同元素设置为常量这种方式来处理一个线性受控电流/电压源。
从另一角度来说,若注意到矩阵[Y]的特定行或列的值表示相应节点间的电流与它们之间的电势差之间的关系:该数越大,电压值越大。因此,支路电流与节点电压之间的任意线性关系可用矩阵[Y]中的常量来表示;同样,特定节点间的电流也可直接用[I]向量中的值来表示。
在前面,我们曾经提到过“各计算阶段”,这些计算阶段是如何定义的呢?OK,让我们先考虑简单的情况。如果我们面对的电路全是由线性时不变支路所构成,在所有时刻,均可求得矩阵方程中节点电压向量[V]的唯一解。一条线性支路遵守欧姆定律,包括R=V=0时Y=I=0的情况。这也是可经由方程组[I][Y]=[V]求解的电路的唯一形式。
但我们如何处理象二极管与三极管这样的非线性元件呢?我们构造与非线性电路状态一致的虚假电路。让我们花点时间来理解这些概念。考虑一个电路中的一个二极管,假定我们已经知道电路稳态时的各节点电压。从二极管的理论函数可以知道二极管的状态:
从而可求解,其电阻阻值为Vd/Id(欧姆定律),而电流源(Is)未实际产生输出,故其电流为0。下图可很好地例示这一点:
发明SPICE的那个聪明绝顶的家伙认识到,电路将会向它的解收敛,在每次迭代过程中,设置
Yr = Id/Vd
其中,Id由前一个方程计算而得,而Vd由前面的另一个方程求得,并且还有
Is = Id – d(Id)/d(Vd)
我们来看一下其工作过程:假定二极管通过一个电阻连接到电池
l 二极管开始工作时,将为开路,求解其初始化矩阵后将会发现,其两端电压为电池电压,而流经电流为0
l 使用上面的方程,代入计算Yr与Is的新值。Yr将为0,但Is将为负值,因为Id为0(通过求解上一个方程),且结果位于上图中右边斜率较陡处
l 将新值代入电流源,重新计算
l 电流源将产生电流,经由二极管并在串联电阻两端产生压降。回到第二步,二极管两端的压降变小,且其电流将从0开始增大。换句话说,我们朝着正确的解方向迈进了一步。
l 如果更多次地重复该过程,则会得到解
且电流源的作用消失了。在这个时候,可认为电路已经收敛稳定。
如果您有一定的数学基础,您会认为这是Newton-Rapheson方法,事实上就是这种方法,当然其中还需要做一些额外的处理,如防止除零以及其它类似措施,特别是不允许设置任何大于GMIN系统变量的值。
为全面描述问题,我们必须考虑时变电路。电路中的时变部分一般为电容与电感,更严格地说,一些信号发生器与混合模式接口模型元件也是时变的。考虑到二极管与三极管的模型中包括电容,可认为它们也是时变的。
我们如何对电容建模?我们可以用一个并联的电阻与电流源来表示二极管,根据二极管的伏安特性可求得相应的值,即
Q=CV(或V=Q/C)
及 Q=It,或更精确的I = dQ/dt
注意到在一个给定时刻,电容就象一个电池,其电流源部分将产生出电流,则电容模型就不必按Newton-Rapheson方式收敛,因为它是一个线性元件。
为进行电容电路的仿真分析,我们可将仿真时刻分割成为离散时间片断。在每个离散时刻,电容将依据该时刻其存储的电荷以及先前求得的“直流”结果进行建模。请注意,如果电路中还有其它非线性元件,这样处理可能会导致该时刻进行迭代分析。
那么,该怎么办呢?我们刚说过,电容模型是基于其存储电荷的。但问题是我们怎么知道那是多少?求解后,我们可以知道它应该是多少(因为我们可以由Vc求得Q,即Q=CVc),但我们还需要一些先验信息,以便得到可以进行仿真分析的正确模型。事实上,我们也可以知道电容的工作历史数据,因为可以记录自从分析开始以来的所有电荷与电流数据值(前提是我们有意记录了这些数据)。因此,我们可以由时刻t之前(t-1, t-2等)的电荷值来推断出t时刻的电荷值,这里需要用到的是Gear或Trapezoidal积分理论。
在此,有两个显示易见的结论:首先,划分的时间间隔是一个非常重要的参数。它应该比较小,以便保证我们的推断的正确性,但它也应该尽可能的大,以便缩短分析时间。其次,我们所计算得到的结果值几乎不可能完全准确(尽管它与真值可能非常接近)。所有这些将导致稳定性问题。这里有一种将该问题可视化的方法。想像在一个悬崖边,它的边缘不稳定。不稳定性来源于电路的初值。我们可以通过在电路的解(悬崖的边)之间放置木板来为它们搭桥以通过悬崖之间的深沟,但走得越远,就越难将木板放到正确的位置(稳定的状态)。如果我们超过了限度,将它放得过远,虽然看起来方向是对的,但后续的电路就无法达到一个稳定的状态,或者我们就直接掉进深渊。
这确实是一个困难的问题。对于电路仿真分析的前期探索人员来说,这甚至比非线性元件的问题还要难。它都来自于数值积分(这也是我们进行计算的依据)与Nyquist稳定判据。
该积分的主要目的是求得下一步计算的输入值,也就是要确定我们的木板要放多远。时间间隔步长不是一成不变的,它可以根据任意目的进行改变。但即使做了这么多(确实多,在计算时间上也是),我们也可能陷入失望的错误境地。举个简单的双稳例子吧。在晶体管即将开关时,无法知道电容的情况。若假定开关间隔时间较长,则电路在开关间隔间是稳定的,这将会导致我们在开关时可能会处理失当,无法得到收敛结果。避免错误结果的唯一办法就是回到上一步,以一个较小的步长进行计算。
从创建模型角度来说,这个过程由Proteus VSM进行处理,它通过调用ISPICEMODEL::trunc函数,可以让各个模型有机会去接受或拒绝下一步时间间隔的机会。幸运的是,SPICE接手了剩下的工作。
可采用事件驱动仿真(Event Driven Simulation)技术来进行数字瞬态分析。它与SPICE中的模拟电路瞬态分析不同,后者仅当电路某些元素的状态发生改变时才进行。另外,数字瞬态分析只考虑离散逻辑,而元件功能则表示为一种更高层次的逻辑。例如,我们可以认为计数器是一个寄存器,它的值在每次时钟沿加一,而不认为计数器是几百个晶体管电路元件。这样,针对同一个电路,采用事件驱动仿真分析比模拟电路仿真分析来说,速度要快上几个数量级。
启动过程的目的是定义电路中所有网络的初始状态,且每个模型的分析函数被至少调用一次。
启动模块将进行以下处理:
l 所有与VCC和/或VDD相连的输入管脚的电平置为高
l 所有与GND和/或VSS相连的输入管脚的电平置为低
l 所有与信号发生器相连的输入管脚的电平状态与信号发生器的初始属性值相同
l 所有其它的管脚初始化为悬空
l 所有模型都必须根据其逻辑,将输入变换求得输出(模型调用无固定顺序)
l 如果网络的状态发生改变,则与其相关联的模型将被要求重新计算得到它们的输出,该过程将重复进行直到系统确认出现稳态。
考虑以下的三个非门电路:
在启动过程中,除U1:A以外的非门都将得到一个未定义的输入状态,则它们将产生一个未定义的输出状态。然而,因为调用了本过程即稳定过程,U1:A的输出将改变,即由未定义状态变为高电平。之后,将要求U1:B进行重新计算。这次的结果是输入逻辑1,而输出为逻辑0。这将改变另一个网络状态,导致另一个稳定过程运行。最后,当U1:C改变其输出状态为高时,再没有其它的改变发生。这时,可认为电路达到稳定。
请注意,应假定在仿真分析开始之前电路已经稳定,且在模型内部的任何延时都将被忽略。
在一个混合模式的仿真分析中,在SPICE试图求得电路的DC工作点时,也会调用稳定过程。
稳定过程之后,DSIM才开始严格意义上的仿真分析过程。该过程在一个循环中调用,而该循环重复进行以下两步操作:
l 将当前时刻所有状态改变事件加入到一个队列中,并交由相关网络进行处理。该过程将得到新的网络状态集合。
l 当一个网络状态发生改变时,该网络内所有的包含输入管脚的模型都将重新进行仿真分析。如果它们的输出发生了改变,将产生新的事件,并被加入到事件队列中。
当然,不同的模型将产生的事件需要在不同时刻进行处理,因此DSIM内核将在每次循环时对队列中新产生的事件进行排序。
需要指出的是,我们的方案可支持0时刻延迟模型,这里的含义是,根据事件产生的方式,在事件产生的时刻,代码也在进行批处理(一批等价于循环体执行一遍)。
本段翻译得不好,原文如下:
It is also worth pointing out that our scheme quite happily supports models which have a zero time delay. In this context, events generated with the same time-code are processed in batches (one batch equals one trip round the loop), according to howthey were generated.
当达到以下条件之一时,仿真将停止:
l 到了指定的仿真结束时间
l 出现了逻辑矛盾,如当前时刻停止不前,即使事件处理循环过程进入了死循环
l 出现了系统错误,如事件队列内存异常。这在正常情况下不大可能会发生,除非在您的设计中使用了某些不稳定的因素,可能会导致某些地方的高频振荡(如100MHz)
您可能会认为一个数字仿真器仅会处理高低逻辑,但实际上,DSIM处理了9个完全不同的状态:
状态类型 |
关键字 |
说明 |
电源高态 |
PHI |
电源高逻辑 |
强电高态 |
SHI |
主动输出高逻辑 |
弱电高态 |
WHI |
被动输出高逻辑 |
悬空态 |
FLT |
悬空输出-高阻 |
未定义态 |
WUD |
与模拟电压混联 |
竞争态 |
CON |
与数字电压冲突 |
弱电低态 |
WLO |
被动输出低逻辑 |
强电低态 |
SLO |
主动输出低逻辑 |
电源低态 |
PLO |
电源低逻辑 |
从根本上来说,一个给定的状态包含其极性信息(高、低或中间态)与强度信息。状态的强度表示电流的大小,从而决定输出带负载能力或吸收电流能力(若多于一个输出连接到同一个网络节点时有用)。
例如,如果一个集电极开路(OC)输出通过一个电阻连接到VCC,则当输出为低时,在网络中将同时出现WHI与SLO状态,结果SLO状态竞争获胜,导致相应节点为低电压状态。相反,如果在网络中同时出现两个三态输出,且来自不同的方向,则两个输出都无法获胜,导致出现竞争状态。
该方案允许DSIM仿真包含OC与OE输出、上拉电阻的电路,也可分析经由电阻连接的三态输出(那些可怜的人设计的多路输出)电路。然而,需要记得一点:DSIM是一个数字仿真器,它不能处理模拟电路的模型现象。例如,将大电阻连接到TTL输入端时,DSIM的分析过程不会出现问题,但在实际工作中会因为不能提供足够的电流而导致相应的问题。
当数字模型的输入未定义时,它可能会沿着模型的普通常识规律进行传播。例如,如果与门的一个输入为低,则其输出将为低,但如果只有一个输入为高,而其它输入未定义,则输出也将为未定义。
一般认为,未连接的TTL输入看起来与它连接到逻辑1时所导致的现象一致,但不能基于此就说明这是实际事实情况。可能会在忽略导线,或输入连接到一个非激活的三态输出时出现这种现象。DSIM内部进行了一些处理,其内部模型都假定了期望高或低的输入的真实逻辑响应。
要是您真的希望DSIM将未连接的输入当成高/低电平逻辑,您可以通过将FLOAT模拟器控制属性设置为TRUE或FALSE。如果该属性值未指定,则缺省处理方式为未连接输入会被当成未定义状态。
在设计DSIM时,我们曾就如何处理非常短的脉冲(毛剌)的模型仿真进行了大量讨论。问题的本质在于,在那些情况下,作为DSIM仿真分析的一个前提假设—模型的纯数字化表现—有点不大成立了。例如,一个5ns输入脉冲时作用到7400芯片输入端时,它将会其输出端产生某种形式的脉冲,但并不能满足TTL规范所要求逻辑电平。这样的输出脉冲能否作为下一级计数器的时钟呢?这就基本上依赖于模拟计算的结果了。
最好的处理方式考虑极端情况,即:
l 一个1ns的输入脉冲压根不会在电路中传播
l 一个20ns的输入脉冲可以较好地在电路中传播
在这之间的情况,门电路将不会正确地传播脉冲,也可以说是欠脉冲。这给了我们毛剌阈值时间(Glitch Threshold Time),它可以与TDLH和TDHL一样,作为模型的额外属性。
另一个需要关心的是,究竟毛剌能否抑制模型的输入或输出。要解决这点疑问,我们可以考虑一个受纹波计数器驱动的4-16解码器,见下图所示。
纹波计数器的输入交错排列,这样可能会导致解码器的输入经过中间状态时产生出寄生脉冲。下图所示为该仿真分析过程结果。
以第一个毛剌为例来进行说明,因为U1(QA)第一次触发低电平,它胜过U1(QB)的高电平而产生一个短时低电平脉冲,并成功地通过解码器并持续10ns。问题是解码器能否对此做出正确的响应,或更进一步地说,如果输入毛剌只有1ns或1ps会出现什么情况呢?当然,对于后面两种情况,结果很清楚,即实际器件不会响应,这也提示我们必须处理输出端的毛剌而不是输入端的。这是因为,在上述例子中,输入脉冲相对而言长一些,对于那些智能一些的准则而言,不会被当成是毛剌。但对于某些竞争产品,它们在此做了大量的无用功,最终的结果是居然能对1ps的毛剌产生响应!
真正让人感兴趣的部分在于,如果您构建了上面的电路,可能没有毛刺。说实在的,这种设计令人不敢恭维,但’154的TDLH与TDHL大约为22ns,这使得它对于10ns的输入响应而言是一个较高的障碍。对于我们所测试的单个元件而言,并没有输出脉冲,但在供应端可能还是有可测量的微小抖动。
为提供对毛刺的处理,所有的DSIM元件都应提供一个用户可定义的毛剌阈值时间(Glitch Threshold Time)属性,即TGxx,此处的xx为相应的输出名称。在我们所定义的TTL模型中,这些属性都可以被TTL元件所覆盖,它们的缺省值为主要的L-H与H-L传播延迟的平均值。设置毛剌阈值时间(Glitch Threshold Time)属性为0将允许毛刺通过,或许你喜欢这种效果吧。上面的图示效果就是将74154的属性TGQ设置为0的结果显示。
最后需重点指出的是,如果毛剌阈值时间(Glitch Threshold Time)属性大于L-H或H-L传播延迟时间,则该属性值会被忽略掉。这是因为,在输入边沿时刻之后,经过相关时间延迟,元件就必须改变其输出,它不会再检查是否在不久的将来还有其它的事件会发生,哪怕该事件会取消本次输出。考虑一个对称门器件,假定其传播延迟为10ns,而其毛剌阈值时间(Glitch Threshold Time)属性为20ns。在t=0ns时刻,输入变为高电平,而t=15ns时,输出变为低电平。您可能会这样认为:输入能传播过去,即输出在t=10ns时为高,而t=25ns时为低,从而产生一个宽度为15ns的脉冲,但因为它小于毛剌阈值时间,所以该脉冲会受到抑制。事实上并不是如此,原因在于在t=10ns时刻,输出必须为高,它不能仍然保持为低,等到20ns时(就象我们的例子所说的那样)才改变,使得第二个边沿到来时产生一个受抑制的脉冲。只要输出在t=10ns时变为高电平,则第二个边沿(t=25ns)将自主地将其复位。您需要仔细考虑并理解这点。