ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用Matlab设计宽带连续时间Sigma-Delta调制器:从NTF综合到行为级仿真

2026/9/6 16:19:07 拓冰建站 浏览量
用Matlab设计宽带连续时间Sigma-Delta调制器:从NTF综合到行为级仿真 简介面向无线通信与高带宽低功耗ADC设计场景的基于Matlab的宽带连续时间Sigma-Delta调制器设计文档适合混合信号电路工程师、研究生及对Sigma-Delta ADC行为级建模感兴趣的读者。压缩包内为单个docx文档整体约454KB内容涵盖额外环路延时补偿原理、零阶反馈回路设计、三阶三位反馈型结构构建、过采样率与系数选择等关键环节并对RC常数偏移、积分器非理想效应等敏感因素给出了建模方法。作者借助Matlab集成工具箱完成连续时间调制器的行为级建模与仿真输入8.5MHz正弦信号后在10MHz带宽下得到SNDR 95.6dB、ENOB约15.59bit的验证结果同时系统分析了运放增益带宽积、额外环路延时对SNDR的影响给出了实际设计裕量建议。文档从离散时间到连续时间的设计迁移逻辑清晰对后续芯片实现与参数优化具有直接参考价值。目前已有102人学习下载。 搞混合信号IC设计这几年我接触过不少ADC架构但要论在方案阶段最让人“又爱又恨”的连续时间Sigma-Delta调制器确实排得上号。用Matlab把宽带连续时间Sigma-Delta调制器从指标拆解做到行为级仿真这里面的门道远比教科书上写的干货要多。这篇内容围绕我一个20MHz带宽、640MHz采样率的宽带CT-SDM设计项目展开覆盖架构选型、NTF综合、离散时间到连续时间的系数映射、非理想因素建模以及最后频谱与SNR的验证适合正在做ADC课题的学生、刚接触连续时间架构的模拟设计工程师也适合想用Matlab做系统级建模的朋友参考。先说结论Matlab在整个流程里不只是画图工具而是帮你把系统架构定下来、把所有折中摆到桌面上、把后期流片风险提前暴露出来的关键工具。你越早把模型做细后面电路级设计返工就越少。1. 方案选型为什么宽带ADC选连续时间而不是离散时间1.1 离散时间与连续时间的本质差异很多刚接触Sigma-Delta的人第一反应是为什么要选连续时间CT离散时间DT的开关电容Sigma-Delta不是更成熟吗这话对也不全对。离散时间架构的系数由电容比决定工艺偏差控制得很好而且设计流程极度成熟几乎每一本教科书都拿它当范例。但它的代价是每个时钟周期都要完成“采样、建立、复位”这一整套动作运放必须在半个甚至更短的时钟周期内建立到足够精度。到了几百MHz采样率开关电容的建立时间和采样开关的导通电阻会让人非常头疼功耗也被抬得很高。连续时间架构的核心优势有三点。第一抗混叠是天然的环路滤波器本身对带外信号有抑制省掉了前置抗混叠滤波器第二积分器是连续工作的不要求在一个周期内完成建立对运放压摆率和增益带宽积的要求明显变低第三采样操作发生在量化器前面而反馈DAC的脉冲波形本身就是一种平滑这对宽带信号特别友好。打个不太严格的比方离散时间像用天平称药每称一次必须等指针完全停稳才能开下一包连续时间像用水龙头持续加水只要流量稳定你根本不用等“水停”的那一下。1.2 宽带场景下的指标分解与约束我这个项目的设计目标是信号带宽20MHz目标SNR大于70dB折算ENOB约11.5bit功耗预算控制在可接受的范围内。拿到这种指标第一件事是不要急着上电路先在系统级把OSR、环路阶数、内部量化器位数这几个参数定下来。OSR选择16采样率随之定在640MHz。我为什么不用OSR8因为超低OSR下NTF形状会变得极其苛刻高阶环路的稳定性余量很小一点非理想因素就会让SNR崩掉。用OSR32的话SNR会更好做但640MHz带宽乘2再乘32就是1.28GHz采样率对时钟和DAC的时序压力一下子就上去了。环路阶数选了4阶。二阶环路在当前OSR下根本压不住20MHz带宽内的量化噪声四阶是最合适的“甜点位”噪声整形增益非常可观降两阶性能不够升到五阶则稳定性更难保证、处理器复杂性也更高。内部量化器用了4bit也就是16电平。多比特量化能显著降低对环路增益的依赖让NTF有更激进的整形能力。代价是反馈DAC必须做动态元件匹配DEM处理否则DAC失配会直接把谐波抬起来。综合下来4阶、OSR16、4bit量化器的组合是比较经典的宽带CT-SDM配置主流论文里大量使用。2. 用Matlab搭建第一版系统模型2.1 设计环境与工具箱准备整个项目我建议用Matlab R2022b或更新的版本因为后续Simulink连续时间模型的求解器兼容性更好。除了Matlab本体最关键的依赖是delsig工具箱这是Schreier教授开源的Delta-Sigma设计工具箱m文件全部开放可以自由查看和修改。把delsig解压后用Matlab的“设置路径”功能把整个工具箱目录加进去这一步漏了会报Undefined function或variable错误。delsig里最常用的函数我列一下synthesizeNTF用于合成噪声传递函数realizeNTF用于把NTF变成实际拓扑系数simulateDSM做离散时间行为级仿真simulateSNR自动扫输入幅度测SNR曲线calculateSNR用于从频谱中计算信噪比。这里需要提醒delsig的核心仿真以离散时间为主连续时间的建模和验证还要靠我们自己写脚本或者搭Simulink模型。设计流程上我的习惯是“两条腿走路”先用纯脚本做离散时间理想仿真快速定系数再用Simulink连续时间模型验证真实CT行为逐步加入非理想因素。2.2 顶层行为模型的两条路线路线一是纯Matlab脚本。把采样序列、NTF系数、量化器位数放在一个脚本里用simulateDSM跑出量化码流再算频谱和SNR。优点是速度快一套参数几秒就能出结果特别适合做参数扫描和折中分析。缺点是它默认系统是离散时间没有办法直接体现连续时间积分器的工作过程。路线二是Simulink搭建的连续时间模型。在Simulink里积分器用连续时间积分器模块DAC反馈用脉冲发生器或阶跃信号表示量化器可以用比较器或自定义S-Function实现。Simulink模型能比较真实地反映CT行为比如反馈DAC的脉冲宽度、量化器时钟采样、环路延迟ELD等。我的建议很直接先脚本后Simulink。脚本负责把系数定下来Simulink负责验证CT实现是否符合预期。千万不要一上来就搭Simulink否则参数怎么调都抓瞎因为你连理想SNR上限是多少都不知道。3. 核心设计NTF综合与离散时间到连续时间映射3.1 先用delsig完成NTF综合与验证进入正题。先用synthesizeNTF把4阶、OSR16的NTF综合出来再用realizeNTF得到CRFB拓扑的系数%% 设计离散时间原型 OSR 16; order 4; nlev 16; % 4bit量化器16个电平含0 Hinf 2.5; % NTF带外增益控制环路稳定性 ntf synthesizeNTF(order, OSR, 2, 0, 1); [a, g, b, c] realizeNTF(ntf, CRFB); ABCD stuffABCD(a, g, b, c, CRFB); % 看看零极点分布和带外增益 zpk(ntf) infnorm(ntf)这里synthesizeNTF第三个参数opt2表示对带内零点做优化可以让NTF零点在带宽边缘略微散开换来几个dB的SNR提升。带外增益infnorm通常控制在2.5到3.5之间数值越大整形越激进但环路越不稳定。我习惯先取2.5确保后面加非理想因素时还有余量。综合完NTF后先跑一遍离散时间理想仿真拿到SNR上限%% 理想DT仿真确认SNR上限 N 65536; t (0:N-1) / 640e6; u 0.35 * sin(2 * pi * 5e6 * t); % 输入幅度约-9dBFS v simulateDSM(u, ABCD, nlev); v v - mean(v); % 去掉量化器直流偏置 win hann(N, periodic); spec fft(v .* win); P abs(spec(1:N/2)).^2; f linspace(0, 320e6, N/2); % 计算带宽内的噪声功率并与信号功率对比得到SNR从仿真经验看4阶OSR16的NTF理想SNR大约能做到85dB以上只要理想模型SNR没到80dB后面再加各种非理想因素基本就没救了。所以这个环节一定要先确认“理论天花板”够高再往下走。3.2 DT到CT系数映射的原理与实操这是整个项目里最容易被低估的一步。DT原型得到的是离散时间传递函数而CT-SDM里积分器是连续工作的反馈DAC输出的脉冲是时域波形这两者必须匹配否则行为和预期完全不是一回事。匹配的核心原理是脉冲响应不变法让CT环路滤波器在采样时刻的冲激响应和DT原型在采样时刻的冲激响应一致。具体到NRZ反馈DAC就是在每个采样周期内DAC输出保持一个恒定的高电平等效于零阶保持。教科书上会有s域到z域的转换表和部分分式展开法但手推误差大工程上我更推荐用数值拟合来做。在Matlab里可以用c2d函数做CT到DT的等效转换然后和DT原型对比误差把系数拟合出来。大致思路是这样%% DT到CT系数映射数值拟合法示意 % 假设CT模型状态空间为Ac(k), Bc(k)由系数k[a1 a2 a3 a4 g1 g2]决定 % 用c2d在每个采样周期做ZOH等效再与DT目标ABCD对比 sys_ct ss(Ac(k), Bc(k), Cc, Dc); sys_dt c2d(sys_ct, 1/640e6, zoh); err norm(sys_dt.a - A_dt, fro) norm(sys_dt.b - B_dt, fro); % 用lsqnonlin迭代优化k使err最小我第一次做这个映射时踩过一个坑只匹配了状态矩阵A没检查输入矩阵B结果仿真SNR比DT理想模型低了十几dB怎么排查都找不到原因。后来发现是DAC的直流增益没有对齐。所以做数值拟合时一定要同时对比所有矩阵的误差并且要检查映射后NTF的零点位置是否还被正确保留。谐振器和谐振器的系数g如果偏差几个百分点带内零点的凹陷位置就会偏移SNR立刻受损。3.3 非理想因素建模时钟抖动、过量环路延迟与RC偏差系数映射完成不代表可以松口气。连续时间调制器对三类非理想因素极其敏感建模时必须提前加进去否则流片后大概率翻车。时钟抖动对CT-SDM的影响体现在DAC反馈脉冲上因为是连续时间DAC输出的面积误差直接注入到环路滤波器误差大小和输入信号幅度及边沿位置相关。在Matlab里建模时可以在每个采样周期给DAC有效脉宽加一个随机扰动扰动标准差取决于时钟源抖动指标。过量环路延迟ELD是另一大杀手。实际电路里量化器比较、逻辑输出、DAC开启都有时延当总时延超过一个采样周期的一部分NTF会急剧恶化甚至振荡。工程上最常用的补偿方法是在量化器输入前加一条额外的直接反馈路径也就是引入一个不经过积分器的“直通”DAC把ELD的贡献提前抵消掉。建模时可以在量化器输入端添加一条增益为ELD系数的反馈并相应调整其他反馈系数。RC偏差的问题更隐蔽。连续时间积分器的增益由RC时间常数决定工艺偏差可能让RC变化±20%导致积分器增益和谐振频率偏移带外增益变化又影响稳定性。所以在系统级模型里必须预留系数校准口这个口子后期在电路级就是可调电容阵列或可调电阻阵列的位置。我的做法是先把环境设定为极端偏差状态比如RC偏慢20%仿真SNR仍然满足指标再看中心条件下SNR有多少余量。如果中心条件下SNR只有72dB指标70dB看起来达标了但RC一偏就直接跌穿这种设计是不能出带的。4. 行为级仿真、调试与常见问题4.1 仿真脚本中的几个关键代码片段到了实际仿真阶段我把常用脚本按模块拆开方便参数扫描。核心模块包括激励生成、调制器仿真、频域分析、SNR计算。%% 激励生成 function u genInput(N, fs, fin, amp) t (0:N-1) / fs; u amp * sin(2 * pi * fin * t); end %% 主仿真与SNR计算 function snr calcSnrFromCode(v, N, fs, fin, BW) v v(:); v v - mean(v); win hann(N, periodic); spec fft(v .* win); P abs(spec(1:N/2)).^2; f (0:N/2-1) / N * fs; % 信号频点附近取若干bin作为信号功率 kf round(fin / fs * N); sigBand (kf-3):(kf3); sigPow sum(P(sigBand)); % 带宽内除信号频点外的功率作为噪声 noiseBand f BW; noiseBand(sigBand) false; noisePow sum(P(noiseBand)); snr 10 * log10(sigPow / noisePow); end上电后的第一个检查项是“直流偏置”。delsig的simulateDSM输出码流以0到nlev-1的整数范围为中心默认带一个直流偏置如果不先减去均值频谱里会看到一个巨大的直流分量虽然不影响SNR计算但画图和排查干扰非常大。4.2 常见问题速查表仿真过程一定会遇到各种疑难杂症我整理了一份速查表按“现象、可能原因、处理方法”三列对应现象可能原因处理方法输出码流全满反转或周期性跳动环路不稳定NTF带外增益过高降低synthesizeNTF中的Hinf或提高量化器位数SNR比DT理想模型低10dB以上DT到CT系数映射误差大检查c2d后的A、B矩阵是否和DT目标一致带内出现明显谐波DAC非线性或输入幅度过大降低输出幅度检查STF在带内的增益是否平坦频谱底部抬升SNR不随输入幅度改善时钟抖动或积分器泄漏加入抖动模型检查积分器直流增益是否足够仿真波形发散出现NaNSimulink求解器步长不合适将求解器改为变步长ode15s限制最大步长最难排查的是“SNR低了但频谱形状看起来正常”。这种情况往往是STF在带内不平坦输入信号被放大了环路里的信号幅度早早就接近量化器满摆幅真正能容纳噪声的余量被挤占。所以做仿真时一定要看输出信号的幅度必要时检查STF增益我个人的经验是把STF在频带内的峰压到2dB以内再往下走。4.3 调试心得从理想模型到非理想模型的推进顺序仿真调试是有顺序的顺序反了问题会像滚雪球一样越来越大。我现在的习惯非常固定每一步都给自己定一个通过门槛。第一步先做纯DT理想模型确认NTF本身的理论SNR达到指标至少加10dB余量。这一步不过后面一切都别谈。第二步做CT理想系数验证比较DT和CT在仿真层面的SNR差距正常情况下差距应该在1dB以内。如果差距大了优先怀疑系数映射而不是急着加非理想因素。第三步加入ELD和时钟抖动这两项最影响环路性能但都还可以在系统级调整。第四步才加入DAC失配和RC偏差这时候看的是鲁棒性不是单纯SNR。我踩过最贵的坑是在项目中期为了把SNR做高拼命压NTF带外增益结果CT仿真一直不稳定。后来回到DT模型做稳定性分析用描述函数法看环路增益相位边界才发现问题不在CT而在NTF本身就太激进。从那以后我养成了一个习惯每个NTF定型前先做一次环路的开环增益裕度和相位裕度计算随手记在笔记本上后面调电路时这些才是真正救命的数据。每加一项非理想因素都要保证SNR退化的幅度在预期范围内。比如ELD补偿前SNR掉了5dB补偿后恢复3dB剩下2dB是电路时序结构本来就该背的代价。这种“每笔账都有据可查”的方式能和后面电路设计阶段无缝对接。最后再给一条实操建议系统级模型做好后把系数导出成表格按积分器顺序标好a、g、b、c每一组值同时标注输入幅度和SNR对应的仿真条件。这份表格就是你和版图、电路设计师之间最有效的交接文档。实际做下来你会发现工程师之间的大部分扯皮都源于系统级参数交接不清而Matlab行为级模型的最大价值就是把这个交接做到没有歧义。本文还有配套的精品资源点击获取