简介:面向射频微波功率放大器与Doherty架构的学习者和工程验证人员,这份宽带对称式高回退功放ADS仿真工程提供了可复现的完整参考,重点解决从原理图搭建、偏置与匹配调试到版图联合仿真的衔接问题。其工作在1.8~2.2GHz、带宽0.4GHz,饱和增益7.5~9dB,回退增益11dB,饱和效率高于65%,9dB回退效率高于40%,便于对照指标理解负载调制、效率提升与回退性能之间的折中。压缩包共1003个文件、约510.7MB,涵盖ADS工作区与工程配置、原理图与版图相关数据、仿真与优化记录,以及参数、模型和结果文件,目录结构较完整,适合按模块检索并复现实验。已有1810人学习,可作为Doherty功放课程设计、课题验证和版图联合仿真的实操素材,帮助读者核对偏置与匹配参数、复现效率曲线,并积累从原理图到版图的调试思路。
1. 从一次 8 dB 回退效率塌方说起:这套宽带对称式高回退 Doherty 放大器 ADS 仿真源文件能解决什么
A 同学拿着一份宽带对称式高回退 Doherty 放大器的 ADS 仿真工程来找我,指标写的是 3.3~3.8 GHz、8 dB 回退效率目标 45%,他照着自己以前做单管 PA 的习惯改了改匹配,HB 跑出来回退点只有 31%,饱和点倒是勉强够。问题不在管子,也不在偏置,而是他把 Doherty 当成"两个功放并起来"在调,offset line 和合路点的阻抗调制整个没对上。这份源文件的价值就在这儿:它把宽带对称式 Doherty 从等分功分、载波支路、峰值支路、offset line、合路网络到后匹配,再到 Momentum 版图联合仿真这条链路完整摆在一个 ADS workspace 里,不是零散几张原理图。适合已经会跑单管 HB、想往 Doherty 和宽带匹配走一步的射频功放开发者,也适合带学生做毕设、做课程设计的人拿它当骨架。功率放大器这个圈子里的坑,基本都在这份工程的参数里埋过一遍。
2. 工程解构:ADS workspace 里的原理图分层与版图组织
2.1 目录结构与 Design 分层
拿到压缩包先别急着双击打开跑仿真,先看目录。这类带版图的 ADS 工程通常是一个 workspace 目录,里面按networks/、data/、layout/、mom/、substrate/分块,每一块承担的角色不一样,混着看很容易把"仿真结果对不上"误判成模型问题。我一般按下面的顺序过一遍:
doherty_wb_wrk/ workspace 根目录 ├── networks/ 原理图与 symbol 库 │ ├── doherty_top/ 顶层 testbench(偏置+功分+两支路+合路+后匹配) │ ├── carrier_amp/ 载波支路:输入匹配 + 管芯 + 输出匹配 + offset line │ ├── peaking_amp/ 峰值支路:输入匹配 + 管芯 + 输出匹配 + offset line │ ├── splitter/ 输入等分功分(Wilkinson 或 Lange 形式) │ ├── combiner/ 合路节点(T 型或集总) │ ├── post_match/ 后匹配网络:合路低阻到 50 欧 │ └── bias_network/ 栅极/漏极偏置馈电,含去耦 ├── data/ dataset:DC、SP、HB、LSSP 结果 ├── layout/ 版图单元与顶层装配 ├── mom/ Momentum 工程与 EM 模型 └── substrate/ 层叠定义(介电常数、厚度、金属电导率)这个分层的好处是每张原理图只负责一件事。carrier_amp和peaking_amp是同一套匹配拓扑,差别在 offset line 的电长度和管子偏置;顶层doherty_top只做装配和测试激励,不放任何匹配元件。改频段的时候你只需要动carrier_amp、peaking_amp和post_match三处,顶层几乎不用碰,这是后续二次开发能跑得快的前提。
需要提醒一句,不同版本的 ADS 对 workspace 目录的命名不完全一致,打开时如果提示库路径缺失,多半是networks/下的 symbol 引用了外部库,在Options > Technology里重新指一下工艺文件就行,不用重建工程。
2.2 三条链路的原理图走读与顶层装配
Doherty 的原理图看着元件多,逻辑其实只有三条链路:输入功分到两支路、两支路各自匹配后经 offset line 到合路点、合路点经后匹配到 50 欧负载。顶层装配在 ADS 里体现为网表连接,下面这段是从顶层 testbench 抽出来的简化网表,元件名按工程实际命名,语法是 ADS netlist 风格:
* doherty_top 顶层装配(简化示意,非完整网表) PORT1 in 0 Num=1 Z=50 Ohm PORT2 out 0 Num=2 Z=50 Ohm * 输入等分 SPLIT1 in p1 p2 SPLITTER2 Z=50 Ohm * 载波支路:偏置 -> 输入匹配 -> 管芯 -> 输出匹配 -> offset BIAS_C p1 vg_c Vdc=VG_CARRIER IMN_C p1 c_in MATCH_CARRIER DUT_C c_in c_out vg_c vd_c MODEL=GaN_HEMT_W OMN_C c_out c_off MATCH_CARRIER_OUT OFF_C c_off c_j TLIN Z=Z_OFF_C E=E_OFF_C F=F0 * 峰值支路 BIAS_P p2 vg_p Vdc=VG_PEAK IMN_P p2 p_in MATCH_PEAKING DUT_P p_in p_out vg_p vd_p MODEL=GaN_HEMT_W OMN_P p_out p_off MATCH_PEAKING_OUT OFF_P p_off p_j TLIN Z=Z_OFF_P E=E_OFF_P F=F0 * 合路与后匹配 COMB c_j p_j j_node COMBINER_T POST j_node out MATCH_POST_BROADBAND看这段网表,重点不在元件名,而在三处参数:VG_CARRIER和VG_PEAK决定两支路的工作类别,E_OFF_C、E_OFF_P是两支路 offset line 的电长度,MATCH_POST_BROADBAND是后匹配网络的 symbol。回退效率上不去,九成出在这三处中的一处。载波管一般偏在 Class AB,峰值管偏在 Class C 甚至更深,让它在回退区彻底关断,否则载波支路的负载调制会被提前"泄"掉。
提示:
E_OFF_C和E_OFF_P不要直接照抄 90 度。宽带工程里这两个数是在中心频点算出来的等效电长度,实际用多节低通或带通网络逼近,具体值要看data/目录下 load-pull 和 S 参数的结果反推。
2.3 版图单元与 EM 模型的组织方式
layout/下的版图和原理图是一一对应的,但不是简单复制。载波支路、峰值支路、功分器、后匹配各有一个版图 cell,顶层doherty_layout把它们按原理图的连接关系拼起来。每个 cell 在进 Momentum 之前都要确认三件事:端口位置是否落在实际焊接/探针位置、参考地是否完整、金属层是否与substrate/里的层叠定义匹配。
mom/目录里是已经建好的 Momentum 工程和导出的 S2P 模型。工程里通常会给每个子网络设一组 port,跑完 EM 后把 S 参数模型替换回原理图的对应 symbol,形成 co-simulation。这一步是整份源文件里最值钱的部分之一,因为宽带 Doherty 的匹配网络在低频和高频的寄生差异很大,纯 schematic 仿真和 EM 联合仿真的增益能差 1~2 dB,效率差 5 个点以上。
3. 把仿真跑起来:从直流工作点到 HB 功率扫描的完整流程
3.1 打开工程先确认模型库与工艺角
工程能打开不代表能跑。第一步永远是确认管芯模型库加载正常。在 ADS 里打开doherty_top,看DUT_C和DUT_P这两个 symbol 是否显示为正常元件而不是红叉。红叉说明模型库路径失效,去Options > Technology > Library Definition重新指向工艺库目录。
确认模型后,先别跑 HB,跑一次 DC 注解。DC 注解里同时扫描VG_CARRIER和VG_PEAK,看两支路的静态电流。载波管在 Class AB 下应该有几十 mA 量级的静态电流,峰值管在 Class C 下静态电流接近零或者只有几 mA。如果两支路静态电流差不多,说明峰值管偏置没设对,后面回退效率一定不对。
* DC 注解(简化) DC1 DC SweepVar="VG_PEAK" Start=-3.5 Stop=-1.5 Step=0.1 * 同时用 ParamSweep 扫 VG_CARRIER 的几组取值这段注解的意思是把峰值管栅压从深夹断往开启方向扫,同时观察DUT_P的漏极电流。理想情况下电流曲线在VG_PEAK接近某一点时才开始明显抬升,那个点就是峰值管的开启门限。把VG_PEAK设在门限以下 0.2~0.4 V,峰值管才能在回退区保持关断。
3.2 Load-pull 定输出阻抗与 Offset Line 电长度
载波支路的输出匹配不是拍脑袋做的。工程里data/目录下一般有一组 load-pull 结果,或者至少有一张LSSP扫描。我一般用 Python 把 load-pull 的等效率圆和等功率圆读出来,找Z_opt的位置,再结合 Doherty 的阻抗调制关系反推 offset line 需要的变换比。
# 从 ADS 导出的 load-pull CSV 里找最佳阻抗 import numpy as np import pandas as pd df = pd.read_csv("loadpull_carrier_3p55GHz.csv") # 列:gamma_real, gamma_imag, pout_dbm, pae_pct z0 = 50.0 gamma = df["gamma_real"] + 1j * df["gamma_imag"] z_load = z0 * (1 + gamma) / (1 - gamma) # 按 PAE 排序,取前 5% 的功率点,再在其中挑功率最大的 pae_th = np.percentile(df["pae_pct"], 95) cand = df[df["pae_pct"] >= pae_th] best = cand.loc[cand["pout_dbm"].idxmax()] z_opt = z0 * (1 + (best["gamma_real"] + 1j * best["gamma_imag"])) / \ (1 - (best["gamma_real"] + 1j * best["gamma_imag"])) print("Z_opt = %.2f + j%.2f ohm" % (z_opt.real, z_opt.imag))这段脚本干的事很直白:把 Γ 转成阻抗,按 PAE 取高分位,再从中挑输出功率最大的点。得到Z_opt之后,按对称 Doherty 的关系,载波支路在回退点的负载阻抗应该是Z_opt的 2.8 倍左右(对应 8~9 dB 回退),饱和点回到Z_opt。offset line 的作用就是在峰值管关断时把这 2.8 倍的阻抗"呈现"给载波管,在峰值管导通时又不额外增加损耗。
注意:load-pull 的参考面一定要和 offset line 的参考面对齐。很多人 load-pull 是在管芯输出端做的,offset line 却画在匹配网络之后,中间隔了一段传输线,参考面一错,算出来的
E_OFF_C就完全跑偏。
3.3 HB 功率扫描与效率、AM-PM 提取
DC 和 load-pull 都没问题,再上 HB。HB 控制器里扫输入功率,同时扫频率,把Pout、PAE、Gain、AM-PM都存进 dataset。这一段建议用 AEL 脚本批量跑,手动改参数太容易漏。
// ADS AEL:批量跑 HB 功率扫描并写 dataset decl designs = list("HB_3p3G", "HB_3p5G", "HB_3p8G"); decl pin_start = -10; decl pin_stop = 30; decl pin_step = 1; foreach (design_name in designs) { decl d = getDesign(design_name); // 设置功率扫描变量 Pin,单位 dBm setVarValue(d, "Pin", pin_start); // HB 控制器里 SweepVar 指向 Pin simulate(); // 把结果对话框挂到 dataset,方便后处理 decl ds = getDataSet(design_name); writeDataset(ds, sprintf("%s_pae.ds", design_name)); }这段 AEL 的写法是"一个频点一个 design"的组织方式,每个 design 里放一个 HB 控制器扫Pin。setVarValue改的是原理图变量,simulate()触发仿真,writeDataset把结果落盘,否则 dataset 会被下一次仿真覆盖。三个频点跑完,回退点效率、饱和功率、增益压缩曲线就都有了。
后处理我一般用 Python 读 dataset 导出的 CSV,按回退量算效率:
# 按饱和功率回退 N dB,找对应 PAE def pae_at_backoff(pin, pout, pae, backoff_db=8.0): psat = pout.max() target = psat - backoff_db idx = np.argmin(np.abs(pout - target)) return pin[idx], pout[idx], pae[idx] for f in ["3p3G", "3p5G", "3p8G"]: d = pd.read_csv(f"hb_{f}.csv") pin, pout, pae = pae_at_backoff(d["Pin"], d["Pout"], d["PAE"]) print(f"{f}: 回退 8 dB 时 Pin={pin:.1f} dBm, PAE={pae:.1f}%")pout.max()是饱和功率,target是回退 8 dB 对应的功率点,argmin找到最接近该功率的索引。三个频点的回退效率拉出来一对比,宽带一致性好不好一眼就能看出来。如果中心频点 45%、边频掉到 35%,问题多半在后匹配网络的带宽上,不在管子。
4. 宽带与高回退的实现细节:阻抗调制比、Offset Line 与后匹配怎么定
4.1 对称式 Doherty 的回退量与阻抗调制比
对称式 Doherty 的意思是载波管和峰值管用同尺寸器件,经典架构下回退 6 dB 时效率最高。要把回退点推到 8~10 dB,靠的不是换更大的峰值管,而是提高阻抗调制比 α。载波管在回退点的负载阻抗按Z_c_bo = Z_opt * (1 + α)走,α 越大回退越深,但载波管看到的驻波也越恶劣。
# 由目标回退量反推所需调制比 def alpha_from_backoff(backoff_db): return 10 ** (backoff_db / 20.0) - 1 for bo in [6, 8, 9, 10]: a = alpha_from_backoff(bo) print(f"回退 {bo} dB -> 调制比 alpha = {a:.2f}, 载波管回退负载 = {1+a:.2f} * Z_opt")跑出来的结果:6 dB 对应 α=1.0,也就是经典 Doherty;9 dB 对应 α≈1.82,载波管回退时负载接近 2.8 倍Z_opt。这意味着载波管在回退点的电压摆幅已经接近击穿边界,选管的时候要留足余量。对称器件做 9 dB 回退,本质是在用载波管的电压裕量换效率,这是这份工程最需要小心的地方。
峰值管的偏置也要配合。回退越深,峰值管开启点越晚,VG_PEAK要设得更负,Class C 导通角更小。但压得太深会导致峰值管在大功率区增益不足,AM-PM 恶化。工程里VG_PEAK那组参数是折中过的,二次开发时不要单改一个数,要和 offset line 一起动。
4.2 宽带合成网络:Offset Line 与后匹配的联合设计
窄带 Doherty 用 λ/4 微带线做 offset 和阻抗变换,带宽撑死 10%。这份工程要覆盖 3.3~3.8 GHz,相对带宽约 14%,必须把 λ/4 换成宽带等效网络。常见做法是用多节低通或者带通结构逼近 90 度相移,同时把变换比做进去。
* 宽带 offset line 的等效网络(三节低通示意) OFF_C_BROADBAND L1 c_off n1 L=L_OFF1 C1 n1 0 C=C_OFF1 L2 n1 n2 L=L_OFF2 C2 n2 0 C=C_OFF2 L3 n2 c_j L=L_OFF3三节低通的L、C值不是随便凑的,要满足两个约束:中心频点相移接近 90 度,带内插损尽量平坦。工程里这组值一般是用 ADS 的Filter DesignGuide或者Smith Chart工具反推出来的,改频段时最稳的办法是把中心频点改掉,重新跑一遍综合,不要手工微调。
后匹配网络的任务是把合路点的低阻抗(对称结构下大约是Z_opt/2)变换到 50 欧。如果Z_opt是 25 欧,合路点就是 12.5 欧,变换比 1:4,单节 λ/4 做不出来,宽带实现通常是两到三节。这里有个血泪经验:后匹配的带宽往往比两支路的匹配带宽更窄,是整个 Doherty 的瓶颈。调宽带的时候先看后匹配的 S11 和插损,再回头调支路,顺序反了会做很多无用功。
4.3 版图联合仿真:从 Schematic 到 Momentum 的闭环
原理图跑通只是第一步,带版图的工程要过 EM。流程是:layout/里画好各 cell,mom/里建 substrate、设 port、跑 S 参数,再把 S2P 模型替换回原理图 symbol,重跑 HB。这一步在 ADS 里叫 co-simulation,工程里通常已经配好了EM Model的 symbol。
* Momentum 关键设置(示意) Substrate: 4 层,介质厚度与 Er 按工艺文件填 Frequency Plan: 1.0 GHz ~ 12.0 GHz,覆盖到三次谐波 Ports: 每个 cell 的输入输出各一个 TML port,参考地就近 Mesh: 边缘网格密度调高,细线宽处单独加密频率上限一定要覆盖到三次谐波。功放在大信号下二次、三次谐波分量不小,如果 EM 只跑到基波,回填后的 HB 结果和实际差很多,尤其是效率。Mesh 密度不够会导致细线宽的匹配枝节阻抗偏移,表现为增益掉、带宽变窄。
EM 跑完回填,重跑 HB,对比纯 schematic 和 EM 联合仿真的回退效率。我一般要求两者差距在 3 个点以内,超过就说明版图上有寄生没控住,回去查过孔、耦合间距和地平面完整性。
5. 避坑与排查:HB 不收敛、效率对不上、版图结果漂移的常见现场
5.1 现象:HB 报 convergence failure,扫到一半就停
现象很典型:功率扫描到某个Pin值,仿真器报HB convergence failure,dataset 里只有前面几个点。原因通常有三个:一是峰值管偏置太深,Class C 导通角极小,HB 的谐波截断阶数不够,迭代发散;二是输入功率太大,管子进入强非线性区,牛顿迭代初值给得不好;三是 offset line 的等效网络里有接近谐振的节点,阻抗突变。
解决办法按顺序试:先把 HB 的Order从 3 提到 5 甚至 7,谐波数不够是最常见的;再把MaxIterations调大,Solver从Newton换成Kylov;如果还不行,用Sweep的Continuation模式,让仿真器沿着上一点的解往下扫,别每次都从冷启动开始。最后检查 offset line 的 L、C 值,有没有哪一节的谐振频率正好落在扫描频段内。
5.2 现象:回退点效率比预期低 5~10 个点
这是最高频的现场。A 同学那份工程就是这个毛病。原因拆开看:一是峰值管在回退区没真正关断,VG_PEAK设得不够负,载波管的负载调制被提前泄放,阻抗升不到 2.8 倍Z_opt;二是 offset line 电长度不对,回退时没能把峰值支路的开路"变换"到合路点,载波管看到的还是低阻;三是后匹配网络在回退点的插损偏大。
排查顺序反过来:先看回退点的Z_c实际是多少,在 HB 里加一个Zin注解,扫Pin,看载波管输出端阻抗随功率的变化曲线。理想曲线应该从高阻单调降到Z_opt,如果一开始就是低阻,说明 offset line 或峰值管偏置有问题。确认阻抗调制对了,再查后匹配插损。
5.3 现象:EM 联合仿真后增益掉 2 dB、带宽明显变窄
纯 schematic 跑出来好好的,回填 EM 模型之后增益掉了、边频效率塌了。原因一般是版图寄生:匹配枝节之间的耦合没考虑、过孔电感偏大、地平面被分割导致回流路径变长。宽带匹配网络对寄生特别敏感,尤其是后匹配那几节,线宽和间距一变,阻抗就偏。
解决方法是分段回填,不要一次性把所有 cell 都换成 EM 模型。先换后匹配,跑一次 HB,看差多少;再换载波支路,再跑;最后换峰值支路。哪一段换上去之后指标掉得最多,问题就在那一段的版图上。定位到具体 cell 之后,回 Momentum 看电流分布,找耦合最严重的位置,加间距或者改地孔。
5.4 现象:原理图变量名和 dataset 对不上,后处理脚本报 KeyError
这类工程经常被不同人改过,原理图里的变量名从VG_C改成VG_CARRIER,dataset 里的列名还是旧的。Python 后处理脚本按列名取数据,直接KeyError。看着是小问题,排查起来能耗掉半天。
养成习惯:每次改完原理图变量,同步在data/目录下重新导出一份 CSV,列名以导出文件为准,脚本里用一个映射字典做兼容。另外 HB 控制器里的SweepVar名字和ParamSweep的变量名要一致,ADS 不会帮你校验这个,扫出来是一条直线的时候先查这里。
6. 二次开发:把这份工程改成你自己的频段和回退量
拿到这份源文件之后,最常见的改造需求就两类:换频段、换回退量。换频段相对简单,把post_match、carrier_amp、peaking_amp三处的中心频点改掉,重新跑Filter DesignGuide综合匹配网络,offset line 的等效网络按新频点重算,然后走一遍 EM。换回退量麻烦一些,要动VG_PEAK、offset line 电长度和调制比,三者是耦合的,单改一个必然翻车。
我一般用下面这种参数扫描的方式找折中点,而不是手工试:
# 扫描峰值管偏置和 offset 电长度,找回退效率最优组合 import itertools, subprocess vg_list = [-3.2, -3.0, -2.8, -2.6] eoff_list = [70, 80, 90, 100] results = [] for vg, eoff in itertools.product(vg_list, eoff_list): # 调 ADS 命令行批处理,改变量后跑 HB cmd = f"ads -p doherty_wb_wrk -c \"setVar VG_PEAK={vg}; setVar E_OFF_P={eoff}; simulate HB_3p5G\"" subprocess.run(cmd, shell=True, check=True) # 读结果,记录回退 8 dB 的 PAE pae = read_backoff_pae("hb_3p5G.csv", 8.0) results.append((vg, eoff, pae)) results.sort(key=lambda x: x[2], reverse=True) print("Top3:", results[:3])这段脚本的逻辑是把两个强耦合的参数做二维网格扫描,每个组合跑一次 HB,按回退 8 dB 的 PAE 排序。setVar改的是原理图变量,simulate HB_3p5G触发指定 design 的仿真,read_backoff_pae复用前面那段后处理。实际跑起来一个组合几十秒,十六个组合十几分钟,比手工调快得多。
几点经验:一是扫描范围不要开太宽,VG_PEAK偏离 0.5 V 以上效率就会明显掉,先粗扫再细扫;二是 offset line 的电长度在宽带工程里不是单一值,扫的时候要同时看三个频点,别只盯中心频点,否则中心频点最优、边频塌了;三是每次跑完把 dataset 单独存一份,命名带上参数组合,否则很容易被覆盖,后悔药没得吃。
还有一点容易被忽略:这份工程是纯模拟域的,没有留数字预失真(DPD)的接口。如果你后续要接 DPD 做线性化,记得在顶层 testbench 里预留AM-PM和AM-AM的导出节点,别等做到一半再回头加,那时候匹配网络已经定型,改起来很麻烦。我现在的习惯是,任何一个功放工程第一次打开,先把 DC、load-pull、HB、EM 四步的检查项列一遍,走完再动参数,从那以后没再出现过"跑了三天发现偏置设错"这种事。希望帮到你。
本文还有配套的精品资源,点击获取