简介:《高性能sigma-delta ADC的设计与研究》PDF为西安电子科技大学微电子学与固体电子学博士学位论文,面向微电子、模拟集成电路及ADC设计方向的研究生、工程师与科研人员,聚焦过采样和噪声整形机制下的高精度模数转换器系统设计与实现。包内含1个PDF文件,压缩包约5.44MB,便于按章节研读与专题检索。论文以MATLAB建模和仿真为基础,梳理从过采样率、精度、动态范围到调制器阶数、前馈与反馈因子、积分器增益的参数选取流程,并量化分析运放有限直流增益、有限带宽与摆率、输出摆幅、开关非线性、时钟抖动及采样电容kT/C噪声等非理想因素。正文给出4阶单环1位调制器与多级降采样数字抽取滤波器的设计,实测15.31位精度和93.9dB动态范围;同时讨论前馈MASH 2-2多位4b 4b级联结构、四位量化器、DWA数字校正以及数模混合版图的噪声隔离。已有262人学习,可作为指标分解、结构选型、参数仿真和电路实现核查的参考。
1. 一位量化器凭什么做到15位:噪声整形的反直觉结论
sigma-delta ADC 最反直觉的地方在于:它的核心量化器只有一个比较器,输出非 0 即 1,可整颗芯片的有效位数能跑到 15 位以上。按常理,1 位量化的信噪比不到 8dB,靠什么补上这 80 多 dB?答案不在器件匹配,而在频域:过采样把量化噪声摊薄,噪声整形把带内噪声搬到带外,数字抽取滤波器再把带外噪声连同高频一起扔掉。这套机制真正值钱的地方是——它不要求模拟元件精确匹配,标准 CMOS 工艺就能做出高精度转换器,这跟流水线 ADC 靠校准、SAR 靠电容匹配的路子完全不同。搞懂它,就搞懂了「用速度和数字资源换精度」这笔交易到底怎么算。
2. 过采样与噪声整形:带内噪声到底去哪了
2.1 量化噪声的白噪声模型与功率谱密度
把量化误差 e[n] 看成与输入无关的加性噪声,是分析 sigma-delta 的起点。假设量化台阶为 Δ,误差在 [-Δ/2, Δ/2] 内均匀分布,噪声总功率就是 Δ²/12。再假设它在频域均匀铺开,双边功率谱密度为 Δ²/(12·fs),落到信号带宽 fB 内的噪声功率就是总功率乘 2fB/fs,也就是除以过采样率 OSR。
这个结论很朴素:OSR 每翻一倍,带内噪声降 3dB,等效精度涨 0.5 位。想把 1 位做到 15 位,光靠过采样需要 OSR 约 2^28,采样时钟高到不现实。所以过采样只是第一层,真正干活的是噪声整形——让量化噪声的频谱不再平坦,而是在 DC 附近挖一个深坑。
2.2 一阶环路的 STF 与 NTF:把噪声搬出带宽
一阶 sigma-delta 调制器的结构是「积分器 + 1 位量化器 + 1 位反馈 DAC」。设积分器状态为 u[n],量化器输出 y[n] = u[n] + e[n],反馈回来的是 y[n],积分器做的是 u[n+1] = u[n] + x[n] - y[n]。把这两个式子代进去消掉 u,得到时域关系 y[n] = x[n-1] + e[n] - e[n-1]。
换到 z 域就是整篇文章最核心的一行:
Y(z) = z⁻¹·X(z) + (1 - z⁻¹)·E(z)信号传递函数 STF = z⁻¹,输入只是被延迟了一拍,幅度不变;噪声传递函数 NTF = 1 - z⁻¹,在 z=1(对应 DC)处取零,在 z=-1(对应 fs/2)处取 2。也就是说,DC 附近的量化噪声被压到零,越靠近奈奎斯特频率噪声被放大得越厉害。这就是「噪声整形」四个字的全部含义:噪声总量没少,只是被赶到了高频。
把 |NTF| = 2|sin(ω/2)| 在带内积分,可以得到一阶环路的带内噪声功率正比于 π²/(3·OSR³)。OSR 每翻一倍,带内噪声降 9dB,等效 1.5 位。二阶是 15dB/倍频(2.5 位),L 阶是 (6L+3)dB/倍频。阶数每加一阶,整形斜率就陡一截,这就是高阶调制器的动力来源。
import numpy as np fs = 81.92e6 # 采样时钟 osr = 64 # 过采样率 fb = fs / (2 * osr) # 信号带宽 = 640kHz L = 4 # 环路阶数 # 理想 L 阶 NTF 幅度:|(1 - z^-1)^L| = (2·sin(w/2))^L w = np.linspace(0, np.pi / osr, 200000) ntf_sq = (2 * np.sin(w / 2)) ** (2 * L) # 带内噪声功率占总量化噪声功率的比例 inband_ratio = np.trapz(ntf_sq, w) / np.pi # 1 位量化器满量程正弦功率 / 量化噪声总功率 ≈ 1.5,即 1.76dB snr_ideal = 10 * np.log10(1.5 / inband_ratio) print(f"带内噪声占比: {inband_ratio:.3e}") print(f"理想量化噪声极限 SNR: {snr_ideal:.1f} dB")代码里np.trapz(ntf_sq, w) / np.pi这一步,算的是 NTF 平方在 [0, π/OSR] 上的归一化积分,物理意义就是「留在带内的那部分量化噪声」。1.5这个系数来自 1 位量化器的满量程正弦功率 Δ²/8 与噪声功率 Δ²/12 之比,换成 dB 正好是 1.76dB。对 4 阶、OSR=64 这组参数,输出约 134dB——这是一个只考虑量化噪声的理论上限。
2.3 OSR、阶数与 ENOB 的换算表
把上一节的积分对几组参数跑一遍,能得到一张很直观的换算表。注意这里的 SNR 是「只考虑量化噪声」的理想值,后面会看到实际电路离它有多远。
| 环路阶数 L | OSR=32 | OSR=64 | OSR=128 |
|---|---|---|---|
| 1 阶 | 41.8 dB | 50.8 dB | 59.8 dB |
| 2 阶 | 64.2 dB | 79.2 dB | 94.2 dB |
| 4 阶 | 107.0 dB | 134.1 dB | 161.2 dB |
这张表说明两件事。第一,阶数比 OSR 更「值钱」:从 2 阶升到 4 阶,OSR=64 下理论 SNR 涨了将近 55dB,而 OSR 翻倍只涨 15dB。第二,4 阶 OSR=64 的理论值 134dB 对应约 22 位,可那颗芯片实测是 15.31 位、93.9dB 动态范围,中间差了 40dB。这 40dB 就是后面第 3 章要逐项交代的非理想因素账单。系统设计从来不是把理想公式算出来就完事,而是管住这 40dB 的泄漏。
提示:用这张表估算时,别把「阶数越高越好」当成结论。4 阶以上的单环调制器是条件稳定的,输入稍大就可能从正常调制突然跌进振荡,SNDR 断崖式塌陷。稳定性和精度在这里是一对直接冲突的指标。
3. 从 MATLAB 到电路参数:系统级设计怎么落地
3.1 系数综合:前馈因子、反馈因子与积分器增益
系统级设计要解决的问题是:给定 OSR、带宽、目标精度,怎么定出每一级积分器的增益、前馈系数和反馈系数。常见的实现思路是先在高层次工具里综合出 NTF,再把它映射到具体的开关电容拓扑(比如级联积分器前馈 CIFB 结构),最后展开成一组系数。
四个积分器级联、带前馈通路的 CIFB 结构,差分方程大致长这样:
u1[n+1] = u1[n] + a1·(x[n] - b1·y[n]) u2[n+1] = u2[n] + a2·(u1[n] - b2·y[n]) u3[n+1] = u3[n] + a3·(u2[n] - b3·y[n]) u4[n+1] = u4[n] + a4·(u3[n] - b4·y[n]) y[n] = quantize(c1·u1 + c2·u2 + c3·u3 + c4·u4)其中 a1~a4 是积分器增益(决定每一级的动态范围分配),b1~b4 是反馈到各积分器的系数(决定 NTF 的零点位置),c1~c4 是前馈求和系数(决定 STF 的平坦度)。一套好的系数分配,核心目标是让四个积分器的输出摆幅大致均衡——不能第一级就顶到运放的输出饱和,也不能最后一级小到被热噪声淹没。
一个常见的经验是积分器增益从前往后递增,比如 0.1、0.2、0.4、0.8 这个量级(具体值取决于目标 NTF 和满量程定义)。前级增益小,是因为它直接面对输入信号,摆幅最大;后级增益大,是因为信号已经被前级衰减过,需要放大才能充分利用量化器的输入范围。这套「逐级放大」的分配不是拍脑袋,它直接决定了每个运放需要多大的输出摆幅和驱动能力。
% 用高层工具综合 NTF 并映射到 CIFB 结构(示意流程) order = 4; % 环路阶数 osr = 64; % 过采样率 ntf = synthesizeNTF(order, osr, 1); % 综合出 4 阶 NTF,带零点优化 [a, g, b, c] = realizeNTF(ntf, 'CIFB'); % 映射为 CIFB 系数 % a: 积分器增益;g: 谐振器反馈(决定零点位置) % b: 各级反馈系数;c: 前馈求和系数这段流程的关键在synthesizeNTF的第三个参数。置 1 表示对 NTF 零点做优化,把零点从 DC 挪一部分到带内其他位置,能在同样阶数下多榨出几 dB 的带内抑制。对 4 阶单环来说,两个零点放 DC、两个零点分散到带内,比四个全放 DC 的带内噪声更低。代价是电路里要多两个谐振器反馈路径,电容和开关都会增加。
3.2 高阶单环的稳定性判据:Lee 准则与过载点
4 阶单环不是无条件稳定的。量化器本身是强非线性环节,当积分器状态摆得太大,环路增益下降,噪声整形的极点就会从单位圆内跑到外面,调制器进入一种低频大幅振荡的状态,输出频谱上出现一片抬起的底噪。
工程上常用的判据是 Lee 准则:要求 NTF 的幅度在所有频率上不超过某个上限(常见取 1.5 左右),这样量化器输入不会在正常输入范围内过载。更实用的做法是直接仿真——扫输入幅度,看 SNDR 随幅度变化的曲线,找到 SNDR 峰值之后开始塌陷的那个点,把最大稳定输入(MSA)定在塌陷点再往回退几 dB。
% 扫描输入幅度,找最大稳定输入(MSA) amps = 0.1:0.05:0.95; % 归一化到满量程 for k = 1:length(amps) sndr(k) = simulateDSM_SNDR(amps(k), ntf, osr); end [peak, idx] = max(sndr); msa = amps(idx); fprintf('峰值 SNDR = %.1f dB @ 幅度 %.2f\n', peak, msa); fprintf('建议 MSA 取 %.2f(回退 3dB)\n', msa * 0.7);这里的simulateDSM_SNDR是行为级仿真:把调制器差分方程跑几万个周期,对输出做 FFT,算带内信号功率与噪声加失真功率之比。扫描步长 0.05 对应满量程的 5%,够粗但能定位塌陷点。真正定系数时会在这个基础上再细扫一遍,并且要看四个积分器的峰值状态有没有超出设计摆幅——SNDR 没塌不代表运放没饱和,后仿里这一条经常翻车。
3.3 非理想因素的量化预算:那 40dB 是怎么丢的
上一章算出 4 阶 OSR=64 的理论 SNR 是 134dB,实测 93.9dB。这 40dB 不是某一项吃掉的,而是七八项非理想因素各吃几个 dB 叠出来的。系统设计的真正工作量,就是给每一项分配预算,然后反推电路指标。
运放的有限直流增益 A 会让 NTF 的零点从单位圆上往内移,DC 处的深坑变浅。经验判据是 A 要比 2^L × OSR 高一个量级,4 阶 OSR=64 对应 2^4×64=1024,约 60dB,实际取 80dB 以上才保险。有限单位增益带宽和摆率决定建立精度,残留的建立误差会作为下一级积分器的输入误差直接叠进带内。输出摆幅限制会让积分器在大信号下削顶,这是 MSA 的直接限制因素。开关非线性(导通电阻随输入变化)产生与信号相关的谐波,通常用自举开关把栅源电压恒定住。时钟抖动把采样时刻的误差转成相位噪声,SNR 上限是 -20log10(2π·fin·σj)。采样电容的 kT/C 噪声是硬下限,只能靠加大电容压下去,而电容加大又反过来加重运放的驱动负担。
import numpy as np # 时钟抖动对 SNR 的限制 fin = 640e3 # 带内最高信号频率 sj = 10e-12 # 采样时钟抖动 10ps snr_jitter = -20 * np.log10(2 * np.pi * fin * sj) # kT/C 采样噪声 k, T = 1.38e-23, 300 C = 1e-12 # 采样电容 1pF vn2 = k * T / C # 噪声功率 vfs = 1.8 # 全差分满量程摆幅 snr_ktc = 10 * np.log10((vfs**2 / 2) / vn2) print(f"时钟抖动限制 SNR: {snr_jitter:.1f} dB") print(f"kT/C 限制 SNR: {snr_ktc:.1f} dB")按这组参数算出来,抖动限制约 88dB,kT/C 限制约 86dB,两项都已经逼近实测的 93.9dB。也就是说,这颗芯片的精度不是被量化噪声卡住的,而是被采样网络的模拟非理想性卡住的。这个判断直接决定了设计重心:与其去优化数字滤波器,不如把采样电容和时钟质量做扎实。把每一项都算出来列成预算表,比笼统地说「留裕量」有用得多。
3.4 多级抽取滤波:为什么不能一级干完
调制器输出是 81.92MHz 的 1 位码流,最终要降到 1.28MHz 的 16 位左右数据(64 倍抽取)。如果用一个 FIR 直接完成,按 80dB 阻带衰减、过渡带 640kHz~740kHz(归一化到 81.92MHz 只有 0.0012)估算,凯泽公式给出的阶数在两千阶以上。两千阶 FIR 意味着两千个乘法器系数和对应的存储,功耗和面积都不可接受。
多级分解是唯一现实的路径。第一级用 CIC(级联积分梳状)滤波器做大比例抽取,它只需要加减法器和寄存器,没有乘法器,非常适合高速前端;中间几级用半带滤波器,有一半系数为零,运算量减半;最后一级用补偿 FIR,把 CIC 在通带边缘的 sinc^N 滚降补平,同时完成最后的窄过渡带滤波。
import numpy as np def kaiser_order(A, df, fs): """估算满足阻带衰减 A(dB)、过渡带 df 的 FIR 阶数""" dw = 2 * np.pi * df / fs return int(np.ceil((A - 8) / (2.285 * dw))) fs = 81.92e6 # 单级方案:过渡带 100kHz n_single = kaiser_order(80, 100e3, fs) # 多级方案:前级 CIC 抽取 16 倍,末级过渡带放宽到 1.28MHz 域 n_last = kaiser_order(80, 100e3, 1.28e6) print(f"单级 FIR 阶数: {n_single}") print(f"末级 FIR 阶数: {n_last}(工作在 1.28MHz 采样率)")关键在最后一行:同样的 100kHz 过渡带,工作在 1.28MHz 采样率下的 FIR 阶数只有工作在 81.92MHz 下的 1/64。这就是多级抽取的根本理由——运算量按采样率折算,越往后做越便宜。CIC 先扛下大比例抽取,把采样率降下来,后面的窄过渡带滤波才做得起。这条设计顺序搞反了,就会出现「滤波器面积比调制器还大」的尴尬局面。
4. 单环与 MASH:稳定性、精度与速度的对撞
4.1 4 阶单环 1 位:固有线性换来的条件稳定
1 位量化器有一个别的结构给不了的好处:它的传递特性只有两个点,两点必然共线,所以 1 位 DAC 是天生线性的。多位 DAC 要靠单元匹配,匹配误差直接转化成谐波失真;1 位没有这个问题。对线性度要求苛刻的场合(比如高保真音频),这是决定性的优势。
代价也很直接。1 位量化噪声大,必须靠高阶加高 OSR 压下去,而 4 阶单环是条件稳定的,最大稳定输入被限制在满量程的七八成,动态范围的上端被削掉一截。那颗 4 阶 1 位芯片的做法是:全差分开关电容结构、1.8V 单电源、81.92MHz 时钟、OSR=64、带宽 640kHz,实测 15.31 位、93.9dB 动态范围,整颗芯片(含数字抽取滤波器)1mm×2mm、56mW。这个功耗里数字部分占了不少,因为 64 倍抽取的多级滤波器要一直跑到 81.92MHz。
开关电容积分器的时序是两相不重叠时钟:采样相把输入电压采到电容上,积分相把电荷转移到反馈电容。两相之间必须留死区,否则采样开关和积分开关同时导通,电荷会从输入直接漏到输出,积分器精度就没了。这个死区时间不能太长(留给运放建立的时间变短),也不能太短(开关关不断),通常取时钟周期的几个百分点,靠时钟产生电路里的延迟链控制。
4.2 MASH 2-2:噪声抵消逻辑与匹配敏感度
单环的稳定性问题在宽带应用里会被放大,MASH 结构就是冲着这个来的。2-2 级联的意思是:第一级是个 2 阶单环调制器,它处理输入信号,同时把自己量化器的误差 e1 送给第二级;第二级也是个 2 阶单环,把 e1 再调制一遍,输出 y2。数字域里把两路输出按特定系数组合,就能把第一级的量化噪声完全抵消掉。
理想情况下,2-2 MASH 的输出是:
Y(z) = z⁻²·X(z) + (1 - z⁻¹)²·E2(z)第一级的误差 e1 消失了,只剩下第二级的量化噪声被 2 阶整形。这相当于用两个稳定的 2 阶环路,拼出了一个 4 阶整形的效果,稳定性由每个 2 阶环路自己保证,整体不存在条件稳定的问题。
但这套抵消逻辑有个致命前提:模拟域第一级的传递函数和数字域抵消网络的传递函数必须严格一致。模拟侧的积分器增益有偏差、电容有失配,抵消就不彻底,第一级的量化噪声会漏一部分到输出,在频谱上表现为抬起的底噪。这是 MASH 的血泪教训——它对模拟精度的要求比单环高,省下来的稳定性是用匹配敏感度换的。
4.3 4 位量化器与 DWA:把 DAC 失配整形掉
宽带应用里,2-2 MASH 的每一级都用 4 位量化器,量化噪声比 1 位降了 16 倍,等效 12dB。但 4 位意味着反馈 DAC 有 16 个单元电容,单元之间的失配会直接注入一个与输入相关的误差。这个误差不是白噪声,它跟着信号走,在频谱上长出谐波杂散,SFDR 首当其冲。
数字校正的经典解法是动态元件匹配(DEM),其中数据权重平均(DWA)最简单。思路是:不固定用哪几个 DAC 单元,而是用一个指针循环选择,每次用连续的若干个单元,指针随输入码字递增。这样一来,单元失配的误差不再与输入相关,而是被一阶整形搬到了高频。
def dwa_select(code, n_unit, ptr): """DWA:根据输入码选择 n_unit 个 DAC 单元,返回选择向量和新指针""" sel = [0] * n_unit for i in range(code): sel[(ptr + i) % n_unit] = 1 new_ptr = (ptr + code) % n_unit return sel, new_ptr # 示例:16 单元 4 位 DAC,连续三个码字 5, 5, 5 ptr = 0 for _ in range(3): sel, ptr = dwa_select(5, 16, ptr) print(sel, "-> next ptr =", ptr)代码里sel是这一拍实际导通的单元向量,ptr是下一次的起点。输入码为 5 时,选择从 ptr 开始的 5 个连续单元,下一拍从 ptr+5 继续。失配误差的累积效应因此变成周期性的斜坡,等效于对失配噪声做了一阶高通整形——带内的失配噪声被压下去,谐波杂散变成了一片抬起的底噪。
DWA 的局限也要说清楚:当输入码接近满量程或接近零时,指针的循环模式会退化,失配噪声可能重新变成音调,在频谱上冒出离散杂散。工程上的补救是加抖动(dither)或者改用更高阶的 DEM 算法,代价是逻辑复杂度上升。那颗 MASH 2-2 芯片的实测结果是:-6dBFS@1.25MHz 输入、160MHz 采样下,SNDR 峰值 80.9dB、SFDR 87dB、ENOB 13.15 位,靠的就是 4 位量化降压噪声、DWA 压失配杂散这两手一起上。
5. 避坑与排查:从仿真收敛到实测掉位的记录
5.1 行为级仿真很好,后仿掉 20dB
现象:MATLAB 行为级跑出来的 SNDR 接近理论值,换到晶体管级后仿,带内底噪整体抬升,SNDR 掉了将近 20dB,频谱上没有明显杂散,就是一片均匀抬起的噪声。
原因:行为级只加了运放有限增益和 kT/C 两项非理想因素,开关非线性、时钟抖动、建立误差全按理想处理。后仿里这几项一起进来,尤其是采样开关的电荷注入和时钟馈通,直接往采样电容上叠了一个与信号相关的误差。
解决:把非理想因素拆成独立的开关逐项打开,每开一项跑一次后仿,记录 SNR 变化,做成敏感性表。哪一项贡献超过 3dB 就重点优化,贡献小的先放。这套流程看着笨,但能把「20dB 到底丢在哪」定位到具体电路模块,比反复调参数靠谱得多。
5.2 频谱上冒出固定频率的杂散
现象:调制器输出做 FFT,在某些输入幅度下出现几根离散的杂散,位置随输入码字变化,幅度能到 -70dBFS 左右,SFDR 被压得很低。
原因:DWA 的指针在特定输入码下进入短周期循环,失配误差不再被整形,而是退化成周期性音调。输入码越接近 0 或满量程,循环越短,音调越明显。
解决:在 DWA 的指针更新里加一个伪随机偏移,打乱循环周期;或者把单元选择从「连续段」改成「更均匀的分布模式」。前者改动小,后者效果更彻底但逻辑更复杂。改完要重新扫一遍输入幅度和频率,确认杂散在所有工作点上都被压到 -90dBFS 以下。
5.3 动态范围随温度漂移
现象:常温测试动态范围 93dB,高温下掉到
本文还有配套的精品资源,点击获取