3. 交流分析(AC Analysis)的基本概念与工程意义

聊到信号完整性仿真,很多人第一反应就是时域的波形,比如眼图、S参数什么的。但我个人觉得,真正让你摸透互联结构“脾气”的,反而是这个看起来很简单的AC分析。

什么叫AC分析?说白了,它就是一种频域扫描。你给网络施加一个小信号正弦波激励,然后看它在不同频率下的响应。你不用管芯片里边那些复杂的非线性开关行为,只关心“这个结构在特定频率下,信号穿过去还剩多少,相位歪了多少”。

我记得最早做DDR3项目的时候,遇到了一个很棘手的串扰问题。那时直接用瞬态仿真折腾了三天,死活看不到规律。后来我退了一步,先跑AC分析看频域耦合曲线。你猜怎么着?5分钟就定位到谐振点——原来是一条走线的过孔回流路径太差,在880 MHz附近形成了很强的耦合。这件事让我明白了一个道理:做SI,先看频域,再看时域。

📌 个人习惯
我每次拿到新的PCB叠层文件,第一件事不是跑飞秒级的TDR,而是先做一个络的AC扫描。这样做的好处是:
• 快速检出异常谐振点 —— 如果某个网络在2.4 GHz突然衰减掉3 dB,那很可能有阻抗失配或天线效应。
• 帮你判断哪些频率段需要重点优化 —— 你不必在整个工作频段平均使力,集中攻克最关键的那几十兆赫兹就够了。

3.1 AC分析的“三件套”:阻抗、S参数、谐振

在SIwave里跑AC分析,本质上是在算一组线性系统的稳态解。你告诉求解器:“我只想研究这个对象从100 kHz到10 GHz的频率行为”,然后求解器就一个一个频率点去构建矩阵,求解节点的电压和电流。

这背后是基尔霍夫定律,频率从虚部加了进来。实际计算中它会把寄生参数——电阻、电感、电容——都换算成复数阻抗。换个角度看,AC分析就像在用探针给整个PCB做一次“全身体检”,每个网络都能拿到一条阻抗-频率曲线或者传输-频率曲线。

你拿到的主要参数

参数 意义 我一般用来看什么
阻抗(Z) 端口看进去的复阻抗 PDN目标阻抗是否达标
传输(S21) 信号从1端口传到2端口的增益/损耗 走线损耗、通道一致性
反射(S11) 端口自身的回波损耗 阻抗失配程度
相位延迟 信号通过网络的相位偏移 时序偏差、信号同向性

你想想看,要是没有AC分析,你就只能靠时域波形去反推。但时域波形里一大堆码型依赖性,你很难说清楚那个过冲到底是阻抗失配引起的,还是同时切换噪声的干扰。AC分析则帮你剥离了这些因素,直击本质。

3.2 你需要避免的模式陷阱

AC分析虽然简单,但也不是没有坑。我在这里根据自己的踩坑经历,给你列几个最常见的问题。

  • 频率范围设得太宽——很多人习惯设成0 Hz到20 GHz,认为这样覆盖最全。其实大错特错。低频点密集到浪费计算时间,而关键的高频段却被稀拉斯坎的频点错过了。我建议:先用粗扫找出谐振区,再在谐振区附近做加密扫描。
  • 激励幅度用得不对——默认是1 V的交流源,但如果你管脚上同时有大直流偏置(比如电源管脚),应改成更小的幅度(比如0.1 V),避免把有源的EOS钳位效应卷进来。
  • 忽略参考地设置——这在SIwave里很隐晦。有些用户设了差分端口但没指定参考地平面,结果算出来的S参数完全不合理。我遇到过的一个案例:一对LVDS走线,仿真结果居然在1 GHz显示有6 dB损耗,查了两天发现是参考地没连接对——这个问题AC分析能告诉你,但前提是端口和参考回路的模型要正确。

3.3 AC分析的一个完整小流程

假设你手头有一块8层板,你想看看一线存储器接口在DDR4-3200速率下的通道性能。我通常的走一遍流程如下:

  1. 在AEDT里导入ODB++或Ansys文件,确认叠层和材料参数无误——εr和tanδ必须有频变模型,否则高频段会严重偏离实际。
  2. 创建端口:把源端、接收端的芯片模型去掉,换成离散端口或差分端口。我个人喜欢用“Circuit Port”,因为可以直接设50 Ω参考阻抗,和测试设备匹配。
  3. 打开AC分析设置:扫频范围设100 kHz ~ 8 GHz(DDR4-3200的奈奎斯特频率约1.6 GHz,考虑到三五次谐波,8 GHz足够)。扫描模式选“Interpolating”,点数设2000点,勾选“Save All Solutions”。
  4. 跑仿真:耐心等一会儿。
  5. 结果后处理:把S参数矩阵的数据导出成Touchstone文件,然后用Matlab或Python画S21幅频曲线和相位曲线。我最常用的一个指标是“insertion loss at 1.6 GHz ≤ -3 dB”——只要满足,基本说明通道损耗过得去。
# 在AEDT/SIwave中用脚本自动化跑AC分析的部分示例(简化版)
# 注意:这是AEDT API风格,真实使用时需要调整模块路径

import ScriptEnv

ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop = GetAppDesktop()
oDesktop.RestoreWindow()

oProject = oDesktop.SetActiveProject("MyDDR4")
oDesign = oProject.SetActiveDesign("SIwave_DC_AC")

# 获取AC分析设置模块
oModule = oDesign.GetModule("AnalysisSetup")

# 创建一个新的AC分析设置
ac_setup_name = "AC_100kHz_8GHz"
oModule.InsertSetup("AC", 
    ac_setup_name + 
    "::SOLVE::AdaptiveSweep::General::StartValue:=100e3, " +
    "StopValue:=8e9, " +
    "NumFreqs:=2000, " +
    "SweepMethod:=Interpolating, " +
    "SaveFields:=True, " +
    "SaveRadFields:=False")

print("AC 分析设置完成:" + ac_setup_name)

你看,整个过程用脚本自动化也就十几行代码。但它的价值远不止于跑仿真——你要通过结果曲线去判断:设计需要加线宽补偿吗?需要换低损耗的板材吗?需要调整过孔反焊盘大小吗?这些判断的基石,就是AC分析那一根根干净的频域曲线。

3.4 工程意义:AC分析是PDN分析的“照妖镜”

在电源完整性领域,AC分析的地位几乎不可替代。为什么呢?因为PDN是一个包含数百个电容、平面、过孔、连接器的复杂谐振系统。它的阻抗-频率曲线像一座山峰,而你的目标就是让整条曲线在目标频段内低于目标阻抗。

⚠️ 我曾经的一个痛苦的教训
某款FPGA核心供电1.0 V,生命周期最大电流实际超过设计值20%,导致PDN在某个高频区域阻抗飙到40 mΩ。仿真时用了AC分析,很直观地发现那一段曲线超出了目标阻抗(10 mΩ)。但是我当时为了赶时间,出于侥幸,只凭经验补了三个电容没做验证。结果板子回来就是纹波超标——因为你没法凭直觉知道新增电容的自谐振频率和安装电感到底能不能落在缺口上。后来老老实实重新跑一遍AC扫频,才找到正确的电容组合。从那以后,我每个电源轨必须跑AC扫描,不看曲线不画版图。

所以,我给这个章节定个基调:AC分析不是跑流程的摆设,而是你做所有决策的前提。它能帮你在流片或投板之前看清每一个网络在高频下的真实面貌。有了这个基础,你再去做时域的眼图仿真、时序仿真或者EMI分析时,才能做到“心中有数”。

一句话总结:你如果想当一名合格的SI/PI工程师,第一件事就是把AC分析吃透。它是读懂PCB高频语言的“ABC”。

AC分析的工程落地:从建模到判据 导入设计/模型 叠层、材料、端口定义 AC求解 & 扫频 100 kHz ~ 8 GHz / 2000 pts 提取S/Z参数 S11/S21 / 阻抗曲线 判据:S21 > 阈值? 传输损耗 / 回波损耗 判据:Z < 目标阻抗? PDN 目标阻抗合格 ✅ 通过 → 进入后续仿真 🔍 关键解析 • 数据导出为 Touchstone • 谐振点自动定位 • 判据不合格 → 回到建模或加电容