电路仿真基本流程:从网表到波形

说实话,很多初学者拿到 SPICE 第一件事就是点「运行」。结果呢?要么报错看不懂,要么波形出来不知道对不对。我当年也干过这事——直接拿别人网表一跑,看着波形挺漂亮,后来才发现电源极性都画反了。

电路仿真不是黑盒子。你得知道每一步在干什么。今天我就带你走一遍完整流程:网表编写 → 仿真器设置 → 运行仿真 → 查看波形。顺便把最常见的三种仿真类型(DC、AC、瞬态)讲透。

核心观点:仿真流程就像做实验——先搭电路(网表),再设仪器(仿真器),然后按按钮(运行),最后看数据(波形)。哪一步偷懒,结果就骗你。

电路仿真基本流程 网表编写 .cir 文件 仿真器设置 分析类型/参数 运行仿真 求解/收敛 查看波形 后处理 DC 分析(直流工作点) AC 分析(小信号频率) 瞬态分析(时域) 三种仿真类型对应不同设计验证需求,实际项目中经常组合使用

第一步:网表编写——电路的「语言」

网表是什么?说白了,就是用文本描述电路。每个元件一行,节点编号连接,最后加个 .end 告诉仿真器「我说完了」。

我习惯把网表分成三块:

  • 标题行:随便写,但要有辨识度。比如 My_First_Sim
  • 元件语句:电阻 R、电容 C、电感 L、电压源 V、电流源 I……每个元件一行
  • 控制语句:以 . 开头,告诉仿真器做什么分析、输出什么

看个最简单的例子——一个电阻分压电路:

* 电阻分压网表
V1 1 0 DC 5V
R1 1 2 1k
R2 2 0 2k
.DC V1 0 5 0.1
.PRINT DC V(2)
.END

注意那个 V1 1 0 DC 5V——节点 1 接正,节点 0 接地。节点 0 是全局地,所有仿真器都认。我见过有人把地节点写成 GND,结果仿真器直接报错。嗯,节点 0 是硬规定,别改。

小技巧:网表里用 * 开头的是注释。我习惯在每个模块前加一段注释,说明功能、作者、日期。三个月后你自己回头看,会感谢这些注释的。

第二步:仿真器设置——告诉它你想看什么

网表写好了,仿真器还不知道你要干嘛。是算静态工作点?还是扫频率?还是看波形随时间怎么变?

这些都由「分析语句」控制。最常用的三个:

分析语句 作用 典型写法
.DC 直流扫描——改变某个源的值,看节点电压/电流变化 .DC VIN 0 5 0.1
.AC 小信号交流分析——扫频率,看幅频/相频特性 .AC DEC 10 1 1MEG
.TRAN 瞬态分析——看时域波形 .TRAN 1u 1m

另外还有 .OP(直流工作点)、.TF(传输函数)等,但最常用的就是上面三个。我刚开始做仿真时,经常搞混 .DC 和 .TRAN——一个扫直流,一个跑时间,完全两码事。

注意:AC 分析的前提是电路已经算好了直流工作点。仿真器会先自动跑一遍 .OP,再在偏置点上叠加小信号。所以如果你的电路没给对偏置,AC 结果全是错的。我曾经在这上面栽过跟头——运放没加直流偏置,AC 扫出来增益是负的,查了半天才发现。

第三步:运行仿真——等它算完

设置好了,运行。大部分 SPICE 仿真器在命令行下就是敲 ngspice netlist.cir 或者点一下 GUI 里的「Run」按钮。

运行过程中,你会看到仿真器在屏幕上打印进度。如果网表有语法错误,它会直接报错退出。常见的报错有:

  • 「No such device」——元件类型写错了,比如把 R 写成 r(大小写不敏感,但拼写不能错)
  • 「Node 0 is floating」——有节点没接地,或者没连到任何元件
  • 「Singular matrix」——电路有矛盾,比如两个理想电压源并联

遇到报错别慌。我一般先看第一行错误提示,然后检查对应行附近的语法。80% 的错误都是拼写或节点编号问题。

避坑指南:我曾经写过一个网表,电阻值写成 1k 但忘了加单位后缀。SPICE 默认单位是欧姆,所以 1k 被当成 1 欧姆而不是 1 千欧。正确写法是 1k 或 1K,但 1k 后面不能有空格。养成习惯:数值和单位之间不要空格。

第四步:查看波形——数据变图形

仿真跑完了,数据存在 .raw 或 .out 文件里。你需要用波形查看器把它画出来。

常用的工具有:

  • ngspice 内置的 plot:命令行下直接 plot V(2) 就能看到简单波形
  • GTKWave:开源,支持多种格式
  • 专业 EDA 工具:Cadence ADE、Synopsys Custom WaveView 等

看波形时,我习惯先看整体趋势,再看细节。比如瞬态分析,先看信号有没有起振、幅度对不对,再放大看上升沿、过冲这些细节。

你想想看,如果波形出来是一条直线,可能是电路没工作,也可能是仿真时间太短。我遇到过有人跑瞬态只设了 1 纳秒,振荡器还没起振就结束了——波形当然是一条直线。

三种仿真类型详解

DC 分析——找静态工作点

DC 分析就是算电路在直流下的状态。所有电容开路、电感短路,只考虑电阻和直流源。结果就是每个节点的直流电压、每条支路的直流电流。

典型应用场景:

  • 放大器偏置点检查——三极管 VCE 是否在合适范围
  • 电源网络压降分析
  • 传输门导通电阻计算

DC 扫描(.DC)则是让某个源的值从 A 变到 B,看电路响应。比如扫一个电阻分压器的输入电压,看输出怎么变——这就是最简单的传输特性曲线。

AC 分析——看频率响应

AC 分析是在直流工作点基础上,叠加一个小正弦信号,然后扫频率。结果就是幅频曲线和相频曲线。

为什么叫「小信号」?因为信号幅度足够小,电路可以近似为线性。如果信号太大,非线性效应就出来了,AC 分析就不准了。

我做过一个滤波器设计,AC 仿真显示 -3dB 带宽是 100kHz,实际测试出来是 95kHz。嗯,差 5% 以内,说明模型和仿真设置都没问题。如果差太多,就要检查寄生参数了。

瞬态分析——看时域波形

瞬态分析是最直观的——给一个激励,看电路怎么响应。比如给一个方波,看输出波形有没有过冲、振铃、延迟。

瞬态分析的核心参数是时间步长和总时长。步长太小,仿真慢;步长太大,波形失真。我一般先设一个保守的步长(比如信号周期的 1/100),跑通后再调大步长加速。

经验之谈:三种仿真类型各有用途,但实际项目中经常组合使用。先跑 DC 确认偏置点,再跑 AC 看频率特性,最后跑瞬态验证时域响应。三步走完,电路基本就摸透了。

一个完整的仿真示例

下面是一个共射放大器的完整网表,包含了三种分析:

* 共射放大器仿真
VCC 1 0 DC 12V
R1 1 2 10k
R2 2 0 4.7k
RC 1 3 2k
RE 4 0 1k
Q1 3 2 4 NPN
VIN 5 0 DC 0 AC 1 SIN(0 0.1 1k)
C1 5 2 10u
C2 3 6 10u
RL 6 0 10k

.MODEL NPN NPN(BF=200 VAF=50)
.DC VIN 0 1 0.01
.AC DEC 10 10 10MEG
.TRAN 1u 2m

.PRINT DC V(3)
.PLOT AC V(6)
.PROBE
.END

你看,一个网表里同时写了 .DC、.AC、.TRAN。仿真器会依次执行这三种分析,输出各自的结果。你只需要在波形查看器里选择想看哪个就行。

建议:刚开始学的时候,别急着跑复杂电路。拿一个电阻分压器练手,把 DC 扫描、AC 分析、瞬态分析都跑一遍。等流程走熟了,再上放大器、滤波器这些。我当年就是这么过来的——一个分压器跑了十遍,把每个参数都试了一遍,后来遇到复杂电路心里就有底了。