写这篇ADS软件操作的记录之前,我先说说自己的情况。我做射频链路仿真有些年头了,平时用得最多的就是Keysight ADS。早些年我基本只用它的谐波平衡(HB)和S参数仿真,后来做带数字预失真(DPD)和宽带调制信号的系统级验证,才正儿八经开始折腾DAC控件。说实话,刚开始用的时候挺不顺手,明明一个不起眼的小控件,参数设置不对,后级滤波器和放大器仿真出来的频谱全都是乱的,我还一度以为是放大器模型出了问题。后来静下心把DAC控件的原理和它跟仿真器之间的关系梳理清楚,很多问题就迎刃而解了。这篇东西就是给刚开始用ADS做数模混合链路仿真的朋友写的,尤其是那些需要把数字信号送进模拟链路里去验证射频指标的人。
1. 先搞明白DAC控件在链路里到底干什么
1.1 数字域和模拟域之间那道“接口”
射频仿真里最头疼的事,往往不是单一模块的设计,而是把数字基带和模拟前端接到一起。ADS里面仿真域分得很清楚,数字基带信号在DSP/信号源库里是一串时间离散、幅度离散的样本序列,而模拟链路里的滤波器、放大器、混频器这些元件,需要的是真正连续的电压随时间变化的波形。你总不能把一串0101的比特流直接塞进滤波器端口,仿真器不知道该怎么解释。
DAC控件就是干这个的。它把一个数字序列按照设定的采样率、位宽和输出幅度,转换成一个可以被瞬态仿真(Transient)、谐波平衡仿真或包络仿真识别的模拟时域波形。你可以把它理解成一个理想化的数模转换芯片模型——每个时钟周期读入一个数字码字,输出一个对应的模拟电平,并且保持一个时钟周期,直到下一个码字到来。这个“保持”动作很关键,它决定了输出波形天然带着采样-保持(Sample and Hold)的特征。
我见过不少刚接触ADS的人,想当然地以为只要把数字源输出往模拟滤波器上一接,就能直接得到平滑的发射信号。实际上如果不经过DAC控件做转换,仿真器要么直接报错,要么输出结果完全不符合物理意义。所以DAC控件在整个链路里的位置,就是连接数字激励和模拟电路的那道“接口”。
1.2 为什么不用电压源直接替代
有人可能会问:既然要的是模拟波形,那直接用正弦电压源不就行了?这就要说到做系统级验证的根本目的了。在DPD和宽带调制信号仿真里,你关心的不是“一个标准的正弦波经过放大器之后变成什么样”,而是“一个带着量化噪声、带外杂散、码间串扰的真实数字基带信号,经过整个发射链路之后,ACPR(相邻信道功率比)和EVM(误差矢量幅度)会不会恶化”。如果直接用理想正弦源,你等于把最关键的信号失真环节跳过了,仿真的参考意义就大打折扣。
DAC控件存在的另一个重要价值,是让仿真链路具备“重构真实发射机行为”的能力。真实发射机里的DAC会引入量化噪声、采样镜像、时钟抖动等非理想效应,这些都会影响系统指标。ADS里的DAC控件允许你设定位宽、量化方式、时钟频率,这样你就能在仿真阶段提前评估,到底用10位的DAC还是12位的DAC,系统性能差别有多大。这个评估如果靠堆板子来做,成本和周期都是没法接受的。
在仿真器底层,DAC控件做的事其实是一个“数模状态转换”的过程。它读取前级数字源的输出数组,把每个离散样本映射到设定的电压范围内,然后在时间轴上按照采样周期展开成阶梯状波形。ADS的瞬态仿真器看到这个梯形波之后,就会像对待普通电压源一样去求解后续电路。你把它当作一个行为级模型去理解,很多参数设置就顺理成章了。
2. DAC控件各个参数怎么设置才不出问题
2.1 控件的存放位置和基本界面
在ADS原理图设计窗口里,不同版本的库路径会略有差异,但常用的DAC控件一般都可以从“Sources-Data Flow Controller”库或者“DSP”相关库里找到。我平常用得比较多的路径是:
- 元件面板选择“Sources-Data Flow Controller”,然后查找名字包含DAC的元件;
- 或者在“Design Library”里直接搜索关键词“DAC”。
放上去之后,双击打开参数设置对话框,你会看到好几个参数项,分别是位宽(Number of Bits)、采样率(Sample Rate)、量化模式(Quantum Mode)、最大输出电压(Max Output Voltage)等等。不同版本里参数名称可能有细微差别,但核心就那几个。
我个人的习惯是,在开始设置参数之前,先想清楚三个问题:
- 前级数字信号的码元速率和过采样率是多少?这决定了DAC采样频率要怎么设。
- 后级模拟链路能接受的输入电压范围和接口电平是多少?这决定了输出幅度的设置。
- 我是要做理想性评估,还是要考虑量化效应?这决定了位宽和量化模式怎么选。
把这三个问题想清楚了,参数设置基本不会跑偏。
2.2 位宽和量化效应:8位和12位的差别有多大
位宽是DAC控件里最容易理解、也最容易忽略的一个参数。N位DAC的理论量化电平数是2的N次方,比如8位对应256个电平,12位对应4096个电平,16位对应65536个电平。位数越多,输出波形越接近理想模拟波形,量化噪声的底噪就越低。
量化噪声在仿真里的体现,就是输出信号频谱基底抬升。理论上量化噪声的功率谱密度和位宽的关系近似是:每增加1位,量化噪声底降低约6dB。所以从8位升到12位,理论上频谱底噪可以低差不多24dB。这个数字很直观,你在仿真软件里看输出频谱,从8位改成12位,底噪确实会明显下沉。
我踩过的坑是:刚上手时图省事,把位宽设成16位,然后发现仿真速度变得特别慢,尤其是在瞬态仿真加后级滤波器的时候。原因倒不复杂——位数越高,DAC输出的阶梯波“台阶”描述越细,仿真器为了准确求解后续的滤波器响应,会在每个台阶处加密计算点,计算量自然上去了。后来我习惯分阶段处理:做链路架构验证和指标摸底时,先用8位或10位快速跑;最终评估某个具体DAC器件影响时,再换成12位或更高。
另外,量化方式也要留意。ADS里通常有Truncation(截断)和Rounding(四舍五入)之类的选项。截断相当于直接把小数部分丢掉,会有固定的直流偏移;四舍五入更接近理想量化器行为。我一般都用Rounding模式,除非你刻意要模拟某种特定芯片的截断误差特性。还有Dither(抖动)选项,有些版本提供了,这是模拟真实DAC里面加抖动来打散量化杂散的手段,系统级预估时可以先不开,细节评估时再打开看效果。
2.3 采样率、时钟和输出波形的关系
DAC控件的采样率设置,是跟你的数字信号源采样率严格对应的。假如你的基带信号源是100MHz采样率,产生了一个50MHz带宽的调制信号,那DAC控件采样率也应该设成100MHz。如果这里设置不对,输出波形的时域长度、频域位置都会发生错乱,看起来就像整个信号被“拉伸”或“压缩”了。
其实这背后是数字信号处理里最基本的采样定理问题。DAC输出的阶梯波,在频域上除了包含你想要的基带信号之外,还会在每个采样频率整数倍处产生镜像分量。你可以把DAC输出想象成在时域对理想冲激串做零阶保持,这在频域上相当于乘了一个sinc函数形状的幅度权重,同时在各个采样谐波附近产生镜像。镜像分量离有用信号越近,后级滤波器越难滤除;离得越远,滤波越轻松。
所以在设计仿真链路时,如果条件允许,尽量提高DAC的采样率,也就是常说的“过采样”。这样做的好处有两个:一是把采样镜像推得更远,二是因为量化噪声会被摊到更宽的频带里,带内的噪声密度会降低。ADS里你可以让DAC的采样率比信号码元速率高若干倍,来模拟真实系统中的内插滤波效果。有一段时间我做一个宽带信号仿真,基带速率是20MHz,DAC时钟用了320MHz,后级滤波器设计起来就非常轻松,带外镜像落在很远的位置,一个简单的低通滤波器就能压住。
2.4 输出电压范围和偏置设置不能拍脑袋
DAC控件的输出幅度参数,很多人喜欢随便填个1V就完事。但真正接上后级放大器之后,你会发现输出摆幅直接影响了放大器的工作点。如果DAC输出幅度给的过小,放大器的输入功率可能达不到预期,压缩状态完全不是你想要的那种;给得过大,又会过早进入饱和区,EVM和ACPR都很差。
我通常的做法是,先查后级驱动放大器或者滤波器指定的输入电平范围,再倒推DAC满量程输出。举个例子,如果滤波器输入要求最大不超过0.8V,我就会把DAC满量程设置到0dBm匹配阻抗下的0.632V,再配合直流偏置(如果仿真需要带直流的场景)。ADS里DAC控件一般有最大输出电压和最小输出电压,或者Reference Voltage相关参数,你按实际链路需要定就行。
直流偏置这一项,很多人会忽略。如果后级链路是交流耦合的,偏置设不设无所谓;但如果后级是直接耦合,而且模拟链路里面有单电源供电的放大器,那么DAC输出必须设置合适的直流偏置,否则放大器输入可能跑到不该跑的区域。我在做某些车规级射频前端仿真时,芯片内部是直流耦合架构,DAC偏置设错,后面放大器静态工作点全乱了,输出信号直接削顶。后来我把DAC的偏置和放大器输入端静态工作点对齐,问题马上消掉。
3. 手把手搭一个DAC输出链路并验证量化效果
3.1 准备最小验证链路:数字源+DAC+滤波器+频谱
纸上谈兵没啥用,我带你把一个最小链路从头搭一遍。这组配置我在项目里反复用过,很适合当成模板。
第一步,新建一个原理图,在信号源库里放一个数字调制信号源,或者直接用一个数字数据源。为了直观,我第一次建议用一个单音的数字源(就是数字正弦波序列),频率设为5MHz,采样率设为100MHz。这样输出的数字序列在时域上就是一个离散正弦波,接DAC之后你马上就能看出量化台阶。
第二步,从“Sources-Data Flow Controller”库里调出DAC控件,放在数字源后面。双击编辑参数,我建议的初始值如下:
| 参数项 | 建议值 | 说明 |
|---|---|---|
| Number of Bits | 8 | 能看到明显量化台阶,便于理解 |
| Sample Rate | 100 MHz | 和数字源采样率保持一致 |
| Quantum Mode | Rounding | 正常量化行为 |
| Max Output Voltage | 1.0 V | 满量程输出1V |
| Min Output Voltage | -1.0 V | 双极性输出 |
| Output Impedance | 50 Ohm | 和后级匹配习惯一致 |
第三步,在DAC后面接一个低通滤波器,可以用集总参数LC低通,也可以用S参数文件滤波器模型。如果只是验证DAC行为,用一个阶数适中的RC/LC低通就够,截止频率别超过10MHz。
第四步,在滤波器输出端放一个瞬态仿真控制器,设置仿真时长为几个微秒,步长建议取DAC采样周期的十分之一甚至更小。这样观察输出波形时,能看到每个DAC台阶内部被滤波器平滑的效果。
3.2 观察波形和频谱,怎么解读量化台阶
跑完仿真,把滤波前的DAC输出波形和滤波后的波形分别显示出来。滤波前的DAC输出,你应该会看到一个非常标准的“阶梯状”正弦波形。这时候可以数一数正弦波峰值附近有几个台阶,理论上8位DAC在整个幅度范围内有256级,一个满摆幅正弦波大约会经过全部或者大部分台阶;如果台阶数明显少,说明信号幅度没有用满DAC的动态范围,这时候应该调大信号源输出幅度或者调低DAC满量程电压。
然后把低通滤波后的波形和滤波前对比。滤波后的波形上,台阶边缘会被明显圆滑,正弦波变得更加连续。这个现象就是“重构滤波”的效果——滤除采样产生的高频镜像分量,保留基带信号。
接着看频谱。ADS里你可以在显示面板里添加一个FFT测量,或者直接对滤波器输出波形做频谱显示。关键看点有三个:
- 5MHz处的信号功率是不是符合你设置的幅度预期;
- 镜频分量是不是落在95MHz、105MHz、195MHz这些位置,对应采样率100MHz的整数倍偏移;
- 整个频谱基底是不是有一条平坦的底噪,这是量化噪声的体现。
如果看到镜频分量特别高,先别急着骂后级滤波器。可以把DAC输出直接接一个50MHz带宽的理想低通,再看镜频是否被压下去。如果压下去了,说明链路架构没毛病;如果没压下去,那就要检查滤波器截止特性和DAC采样率设置是否合理了。
3.3 量化噪声对频谱底噪的影响验证
一个很有意思的验证实验,是把DAC位宽从8位改成12位,其他参数不变,重新跑一遍仿真,对比噪声基底的变化。理论上你会看到频谱底噪下降了大约24dB。这个实验能帮助你直观理解位宽选择的性价比:如果你的系统指标要求带外噪声低于某个值,那么在DAC位数这个维度上,每增加1位大约带来6dB改善。
我自己做这个验证的时候,通常会顺手把Dither选项也对比一下。有些ADS版本里DAC控件带Dither,开启后你会发现量化产生的那些离散杂散被“打散”到整个频带里,看起来像噪声更低了一点。实际上总噪声功率是不变的,只是分布变了。在真实系统里,这样做对改善某些窄带干扰有好处,但会抬高整体底噪,所以到底开不开Dither,也是需要根据系统要求权衡的。
别忘了记录仿真时间。8位DAC的仿真时间比12位快不少,如果只是验证系统架构,用8位能节省大量时间。我一般先用8位把所有链路和指标趋势跑通,最后在关键节点换成12位,做精确评估。
3.4 进阶玩法:接上ADC形成闭环回环
DAC控件不只是单向的“数字转模拟”,它还可以配合ADC控件做成一个“数字回环”链路。最常见的场景是:你在仿真一个收发系统,接收端需要把AD采样后的数字序列拿来做算法处理。这时候你可以用DAC把数字信号送进模拟链路(模拟发射前端),经过信道模型之后,再用ADC控件把模拟波形采样回数字域,去看整个收发链路的量化损伤。
实际操作上,你只要在模拟链路的末端放一个ADC控件,设置它的位宽和采样率,然后连接到数字信号分析工具(比如ADS里的DSP库组件)上,就能得到接收端数字序列。这样整个仿真链路就是一个完整的数字收发闭环,前端的DAC量化和后端的ADC量化影响都可以单独评估。这个玩法对做系统链路预算和算法前验证特别有用,我在做数字预失真算法验证时,就用这个办法观察DAC/ADC量化对预失真收敛效果的影响。
需要注意的是,ADC控件的采样率尽量和DAC保持倍数关系,不要搞出非整数倍关系,否则后续数字处理里面的时钟同步会很麻烦。如果一定要异频,那就得在数字域里明确加上重采样模块,这样仿真链路才和真实系统对应得上。
4. 实际使用中的高频坑和排查办法
4.1 输出波形全平或者断开,问题大概率在数字源
我曾经遇到过一次很诡异的情况:DAC输出带宽设置了很多,位宽也正常,但输出波形就是一根直线。后来仔细检查,发现是前级数字源的输出格式和DAC控件的输入格式不匹配。ADS里有些数字源输出的是逻辑电平(0和1),而DAC控件期望的输入是完整的数字样本序列(比如带符号的整数值)。两种格式接在一起,DAC根本解析不了,输出自然就是无效电平。
这种问题在界面上还不会报错,因为数据流层面它是通的,只是数值解释完全不对。排查办法很简单,在DAC前面加一个数据探针,看看数字源实际输出的数值范围。如果是01序列,那你需要在前级加一个格式转换或者用lookup table把逻辑电平映射成DAC输入码字,不要直接硬接。
另外还要检查数字源的采样率和比特率是不是跟DAC的采样率匹配。如果数字源是1Gbps、每个符号2bit,可能输出速率是500Msps,而DAC采样率设成了100MHz,那么每五个数字样本才被DAC用一次,输出波形就会被“降速播放”,看起来频率不对。这个匹配关系一定要先算清楚。
4.2 频谱里镜频压制不掉,先别急着换滤波器
很多人看到DAC输出频谱里有一堆镜频,第一反应是“滤波器不够好”,然后开始换成高阶椭圆滤波器或者贵的S参数滤波器模型。但在仿真里,这样做往往得不偿失——仿真时间涨好几倍,镜频却未必压得干净。
有一个更优的思路:先把DAC采样率提高,让镜频推远。比如你的基带信号在5MHz,DAC采样率从100MHz提到400MHz,镜频就落在395MHz和405MHz,这时候用一个截止频率20MHz的低通滤波器就能把镜频压得很彻底,完全不用上高阶滤波器。
这个思路在真实硬件设计里也一样成立,用更高的DAC时钟去换取更宽松的滤波需求,是系统设计里非常经典的一个取舍。在ADS仿真里这样做还有一个额外好处:因为滤波器阶数降低了,仿真收敛性更好,整体计算时间反而可能比“低采样率+高阶级联滤波器”更快。
4.3 仿真速度慢到怀疑人生,试试分步仿真
当你把DAC接到一个包含非线性放大器的完整射频链路上,然后用瞬态仿真跑全链路,速度慢得让人崩溃是很常见的事。尤其当DAC采样率非常高、后级又有微带线、滤波器和非线性器件时,瞬态仿真器会耗费大量时间处理DAC每个台阶和后面电路的状态切换。
我的经验是:不要试图一次性把全链路都放在一个瞬态仿真里跑。先分段验证——第一段只验证“数字源+DAC+滤波器”的输出波形和频谱;第二段才把滤波器输出保存成文件或者作为固定激励源,送到后级射频链路里,用谐波平衡或者包络仿真来做射频指标验证。ADS里有“Save/Read”机制,可以把前级仿真结果保存下来,后级直接用这个文件做激励源。这样既保留了DAC量化带来的真实信号特征,又避开了整个链路一起做瞬态仿真的性能瓶颈。
如果你必须做全链路瞬态仿真,那就要合理设置仿真步长。不要为了保险把步长设得过小,把DAC时钟周期的1/20作为瞬态步长通常就够用了。更大的步长虽然更快,但可能漏掉滤波器响应里的细节;更小的步长典型是白白浪费算力。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查手段 | 解决办法 |
|---|---|---|---|
| DAC输出全为零或固定电平 | 前级数字源输出格式不匹配 | 用数据探针检查数字源输出数值范围 | 增加格式转换,或调整数字源输出为样本序列 |
| 输出波形台阶数偏少 | 信号幅度未用满DAC满量程 | 检查信号峰值和DAC满量程电压 | 调整数字源幅度,或降低DAC满量程设置 |
| 频谱出现非预期谱线 | 数字源采样率和DAC采样率不匹配 | 核对两者采样率设置 | 统一采样率,或加入重采样模块 |
| 镜频分量过高 | DAC采样率偏低或滤波器截止不足 | 查看镜像落在哪个频点 | 提高DAC采样率,或增加重构滤波 |
| 仿真时间过长 | 位宽过高、采样率过高、全链路瞬态 | 检查仿真步长和链路复杂度 | 分步仿真,合理设置步长,必要时降低位宽 |
这条速查表是我自己平时遇到问题最先翻的一页。很多问题看起来五花八门,但追根溯源,无非就是“采样率不匹配”“位宽设置不合理”“链路结构过于复杂”这三类。先把这三类问题排除,再谈别的。
4.5 一个小细节:后级器件负载效应对DAC输出的影响
还有个容易忽略的细节是,DAC控件虽然是个行为级模型,但它的输出源阻抗是可以在参数里设置的。如果设成高阻输出,而后级的滤波器或者放大器输入阻抗比较低,分压效应就会导致实际加在后级输入端的电压比DAC设定值低不少。这个问题在检查功率的时候特别容易露馅——明明DAC设了0dBm输出,到了放大器输入端测出来是-6dBm,大概率就是源阻抗和负载阻抗的失配问题。
解决办法是养成一个好习惯:在DAC参数里把输出阻抗设成和整个链路特征阻抗一致,比如50欧姆。同时在后级输入端加一个端口或阻抗匹配元件,确保信号源和负载之间是匹配的。这个做法能让仿真链路里的功率计算和实际硬件测试对得上号,不然你在仿真里看到的功率值拿到实验室测出来完全两回事。
5. 需要养成的几个使用习惯
5.1 先理想后现实,分阶段逼近真实模型
DAC控件是一个行为级模型,但不同参数组合下它的“现实程度”差异很大。我建议在做系统仿真时遵循一个原则:先做“理想DAC”评估,再做“现实DAC”评估。
具体操作是,第一轮把位宽设成16位甚至更高,量化模式选理想,关闭Dither,这时候DAC输出几乎接近理想模拟波形,仿真结果反映的是除去DAC量化影响之后,整个模拟链路的真实水平。如果你在这一步就已经发现某些指标恶化得很厉害,那基本可以排除DAC的嫌疑,问题大概率出在放大器、滤波器或者链路匹配上。
第二轮再把位宽调整成你计划选用的实际DAC位数,比如12位或者10位,打开量化模式,加上Dither(如果实际芯片有),这时候再对比指标变化。两轮之间的差值,就是DAC量化对系统带来的额外损伤。这个差值是你评估“能否用更低成本的DAC”或者“必须选择更高性能DAC”的核心依据。
5.2 把常用的DAC配置做成模板
ADS里可以把自己常用的配置好的模块保存成子电路或者模板。我强烈建议你把那些验证过的链路组合保存下来,比如“DAC+重构滤波器”做成一个子电路,参数都调好并加上注释,下次设计新项目直接拖出来用。这样既避免了重复犯错,也保证了不同项目之间仿真结果的可比性。
我用这个方法之后效率提升非常明显。以前每次新开项目都要重新设置DAC参数,偶尔漏掉一个采样率设置,结果全盘出错。现在模板一拉,顶多改一下采样率和位宽,其他都是一把过。
5.3 抽时间看看波形,不要只盯数据结果
现在的仿真环境越来越好用,很多指标都能直接通过测量表达式输出成表格。但我始终有个习惯,即使指标看起来很好,也会把DAC前后的时域波形调出来看几眼。因为很多问题在指标数据里是看不出来的——比如波形上有不明显的小毛刺、台阶边缘出现短暂的回退、相位跳变异常,这些在数据表格里很难体现,但是在波形图上一眼就能看出来。
有一次做个宽带调制信号仿真,ACPR和EVM指标都正常,但我无聊看了一眼DAC输出波形,发现信号包络在某个幅度位置有一个非常细小的“凹陷”。换了个DAC时钟之后凹陷消失,指标看起来差别不大,但我心里踏实多了。后来查资料才知道这可能是仿真器数值求解在特定采样点上的伪影。这种细节问题,只看数据是绝对发现不了的。
写在最后的几句实际体会
DAC控件在ADS里看着不起眼,参数也就那么几个,但它把数字仿真域和模拟仿真域之间的通道打通了。你只有真正理解它里面每秒在做的“读码字、置电平、保持住”这个循环,才能把参数设得不偏不倚。以前我也走过弯路,给8位DAC配了个极高阶的滤波器,仿真跑了几个小时还跑不出来,后来明白了提高采样率才是更优雅的办法,很多问题豁然开朗。
另外一个小建议,不同ADS版本之间DAC控件的位置和参数名称多少有点出入,碰到界面不一样也不用慌,先看帮助文档里对参数定义的说明,再看有没有“Sample and Hold”或者“Quantization”这类开关,基本都能对上。我自己遇到过一个版本把Max Output Voltage改成了Reference,第一眼没认出来,差点又踩坑。
如果你也在做带DAC的数模混合链路仿真,欢迎按我上面推荐的配置方式搭一个最小链路跑一遍,先感受一下量化台阶、采样镜像和重构滤波这几个现象,再往自己真正的链路里迁移。这套流程我用了很久,始终觉得是最快上手、也最能帮你建立直觉的路径。