ADDA模块在FPGA和单片机学习套件里属于那种“看起来简单、实际门道不少”的板卡。正点原子这套以AD9280和AD9708为核心的模块,几乎成了很多人第一次接触高速模数/数模转换的入门硬件。但大多数教程只告诉你“接上就能用”,很少有人把这两颗芯片的外围电路为什么这么设计、时钟从哪来、模拟前端怎么匹配、电源和地怎么处理讲透。我前后用这套模块做过信号采集、波形发生、简易示波器前端,也踩过采样时钟抖动导致数据跳变、运放偏置不对导致波形削顶的坑。这篇就把AD9280与AD9708的硬件设计逻辑拆开讲,从芯片选型背景、模拟前端、时钟架构、电源与布局几个维度,把“为什么这样画板子”说清楚,适合正在用这套模块做项目、或者想自己复刻一版ADDA硬件的朋友参考。
1. 为什么这套模块选AD9280和AD9708这两颗芯片
1.1 两颗芯片的定位与关键参数
AD9280是一颗8位、最高32MSPS的模数转换器,AD9708是一颗8位、最高125MSPS的数模转换器。注意这里有个很多人第一眼会忽略的点:两者的采样率上限并不对称。AD9708的125MSPS远高于AD9280的32MSPS,这不是设计失误,而是由它们在模块中的角色决定的。
AD9280负责把外部模拟信号采进来,它的瓶颈在于模拟前端的建立时间和内部采样保持电路,32MSPS对应约31ns的采样周期,对8位精度来说已经够用。AD9708负责把数字波形送出去,做信号发生器时往往需要更高的更新率来保证输出波形的频率上限和边沿质量,125MSPS能支撑到几十MHz的输出带宽。所以这套模块的典型用法是:AD9280做中低速采集,AD9708做相对高速的波形输出。
从接口看,AD9280是并行8位输出加一个输出时钟,AD9708是并行8位输入加一个输入时钟。两者都是单电源供电,AD9280典型3V,AD9708典型3V到5V,具体看模块的电源设计。这种并行接口对FPGA非常友好,直接进IO口就能读,不需要复杂的串行协议解析,这也是学习套件偏爱这两颗芯片的原因。
1.2 为什么不用更高位的ADC/DAC
有人会问,现在12位、14位的ADC也不贵,为什么入门模块还用8位。核心原因是学习成本和接口复杂度。8位并行数据意味着8根数据线加时钟,FPGA里一个always块就能采样,时序约束简单。12位以上往往要面对更严格的建立保持时间、更复杂的参考电压设计、更高的布局要求。对于刚接触ADDA的学生,8位是理解“采样—量化—重建”这条链路的最佳起点,先把原理跑通,再上高位才有意义。
另外,AD9280和AD9708在工业界有大量存量应用,资料齐全,价格稳定,供货周期可控。做教学模块最怕芯片断供,这两颗属于“老而稳”的型号,选它们本质上是工程可靠性和教学可复现性的平衡。
1.3 模块的整体信号流
把两颗芯片放在一块板子上,信号流大致是:外部模拟输入经过运放调理进入AD9280,AD9280在采样时钟驱动下输出8位数字到FPGA;FPGA处理后把8位数字送到AD9708,AD9708在更新时钟驱动下输出模拟波形,再经过运放缓冲和滤波输出。整个链路里,运放调理、时钟质量、电源干净程度是决定最终性能的三个关键,芯片本身反而只是其中一环。后面几节就围绕这三点展开。
2. AD9280模拟前端:运放调理电路的设计取舍
2.1 输入信号范围与偏置问题
AD9280的模拟输入范围由内部参考决定,模块上通常配置成0到2V或者0到1V的输入摆幅,具体取决于参考电压引脚怎么接。这里第一个坑就来了:很多信号源是双极性或者以0V为中心的,而AD9280的输入是单极性。如果你直接把一个以0V为中心、幅度1V的正弦波接进去,负半周会被直接削掉,采出来全是0。
所以模拟前端必须做两件事:一是把信号偏置到输入范围的中点,二是把幅度缩放到不超过满量程。模块上一般用一个运放搭成加法器或者电平搬移电路,把输入信号叠加一个直流偏置。偏置电压通常取输入范围的一半,比如输入范围0到2V,偏置就取1V。这样以0V为中心的信号搬移后正好落在0到2V之间。
提示:偏置电压的精度直接影响采集波形的对称性。如果偏置偏高或偏低,波形会整体上移或下移,严重时一侧削顶。调试时先用直流输入测一下码值,确认中点码值接近128(8位满量程256的中值),再上交流信号。
2.2 运放选型与带宽匹配
前端运放不是随便挑一个就行。AD9280最高32MSPS,对应输入信号带宽理论上到16MHz(奈奎斯特),实际工程里为了抗混叠,前端带宽会限制得更低。运放的增益带宽积必须留足余量,一般要求增益带宽积至少是被处理信号最高频率的5到10倍。比如你要处理5MHz信号,运放增益带宽积最好在50MHz以上。
模块上常见的做法是用电压反馈型运放,因为它的直流精度和偏置稳定性好。电流反馈型虽然带宽高,但直流偏置和反馈电阻选择更麻烦,教学模块一般不用。运放供电也要注意,单电源运放和双电源运放在偏置电路里的接法完全不同,模块如果只提供单电源,就必须选单电源轨到轨运放,否则输出摆幅会被压缩,靠近电源轨的部分非线性严重。
2.3 抗混叠滤波器的必要性
采样定理大家都背过,但实际做的时候很多人省掉抗混叠滤波器,结果采出来的波形上叠加了莫名其妙的低频干扰。原因就是高于奈奎斯特频率的成分被采样后折叠回低频,混进了有用信号里。AD9280前端通常会在运放后面加一级简单的RC低通,截止频率设在略高于你关心的最高信号频率处。
这个RC不是随便取值。截止频率f=1/(2πRC),假设你要保留10MHz以内信号,截止频率设12MHz左右,选R=100Ω,则C≈1/(2π×12e6×100)≈133pF,取标称值130pF或150pF。电阻不宜太大,否则和ADC输入电容形成额外极点影响建立时间;电容要用高频特性好的C0G或NP0材质,普通X7R在MHz级别损耗大、容值漂移明显。
2.4 输入驱动与建立时间
ADC的采样保持电路在采样瞬间会从输入端抽取电荷,如果驱动能力不够,输入电压在采样瞬间会塌陷,导致采样值偏低。所以前端运放必须有足够的输出电流能力和压摆率。压摆率要求可以用这个经验公式估算:SR ≥ 2π × f_max × V_pp。假设最高信号频率10MHz,峰峰值2V,则SR ≥ 2π×10e6×2 ≈ 125V/μs。选运放时压摆率要高于这个值,否则高频大信号会被压摆率限制,波形变成三角波。
另外,运放输出到ADC输入之间如果串了电阻,要算上这个电阻和ADC输入电容形成的极点,确保在采样周期内电压能建立到8位精度(约0.4%)。8位精度对应约7.6个时间常数,采样周期31ns,留给建立的时间可能只有十几ns,时间常数必须远小于这个值。
3. AD9708输出通道:从数字码到模拟波形的还原
3.1 电流输出型DAC的负载设计
AD9708是电流输出型DAC,两个互补电流输出IOUTA和IOUTB,满量程电流由参考电流决定,典型20mA或者按公式设定。很多人第一次用会懵:为什么输出是电流不是电压?因为电流输出在高速下更容易处理,负载电阻上的电压建立更快,而且可以通过差分转单端的方式抑制共模噪声。
模块上的做法通常是在IOUTA和IOUTB各接一个负载电阻到地,然后在两个输出之间接一个变压器或者差分运放做差分转单端。负载电阻的取值要算:满量程电流20mA,如果负载电阻50Ω,单端电压摆幅就是20mA×50Ω=1V,差分输出就是2V峰峰值。负载电阻不能太大,否则输出节点的时间常数变大,高频响应变差;也不能太小,否则输出摆幅不够,信噪比下降。
3.2 差分转单端的实现方式
差分转单端有两种常见方案:变压器耦合和运放差分放大。变压器耦合的优点是噪声低、带宽高、不需要供电,缺点是低频响应差,不能传直流。运放差分放大的优点是能传直流、增益可调,缺点是运放本身的带宽和噪声会限制性能。
教学模块一般用运放方案,因为要能输出任意波形包括直流和低频。用一颗差分运放或者用两颗单端运放搭成差分放大器,把IOUTA和IOUTB的电压差放大成单端输出。这里要注意反馈电阻的匹配,差分放大器的四个电阻如果不匹配,共模抑制比会下降,输出会带上共模噪声。电阻用1%精度的金属膜电阻,匹配度尽量高。
3.3 输出滤波与重建
DAC输出的是阶梯波,每个采样点保持一个采样周期,频谱里除了有用信号还有大量采样频率的镜像分量。要还原出干净的模拟波形,输出端必须加重建滤波器,也就是低通滤波器,截止频率设在奈奎斯特频率附近,把镜像分量滤掉。
滤波器的阶数取决于你对镜像抑制的要求。一阶RC每倍频程衰减6dB,如果采样率50MHz,有用信号5MHz,镜像在45MHz,频率比9倍,一阶RC能衰减约19dB,可能不够。二阶或者三阶巴特沃斯滤波器能把镜像压得更低。模块上如果只做简单演示,一阶RC也能看出波形,但要做频谱分析就必须加高阶滤波。
3.4 输出运放的压摆率与建立
和ADC前端一样,DAC输出运放也要满足压摆率要求。AD9708更新率125MSPS,输出信号频率可能到几十MHz,压摆率需求比ADC前端更高。假设输出20MHz、2V峰峰值,SR ≥ 2π×20e6×2 ≈ 251V/μs。这个要求不低,选运放时要特别看这个参数,很多通用运放达不到。
建立时间同样关键。DAC每个更新周期输出一个新码值,运放必须在下一个更新周期到来前把输出建立到8位精度。125MSPS对应8ns周期,留给建立的时间可能只有几ns,运放的建立时间必须远小于这个值。这也是为什么高速DAC输出运放往往比较贵,它不是随便一颗运放能替代的。
4. 时钟架构:采样与更新的时序根基
4.1 采样时钟的来源与质量要求
AD9280的采样时钟和AD9708的更新时钟通常来自FPGA的PLL输出或者外部晶振。时钟质量直接决定采样和输出的信噪比。时钟抖动(jitter)是这里最隐蔽的杀手。采样时钟的抖动会让采样时刻偏移,对于快速变化的信号,采样值误差正比于信号斜率乘以抖动时间。8位精度下,抖动要求可以粗略估算:如果信号频率10MHz、幅度1V,斜率最大约2π×10e6×1≈6.3e7 V/s,要保证误差小于1/256的满量程(约4mV),抖动必须小于4e-3/6.3e7≈63ps。这个要求不算苛刻,但普通FPGA普通IO直接输出的时钟抖动可能就在几十到几百ps,所以最好用PLL输出的专用时钟或者外部晶振。
4.2 采样时钟与数据输出的相位关系
AD9280在采样时钟的上升沿采样,经过一个流水线延迟后在输出时钟的边沿输出数据。模块上一般会把AD9280的输出时钟也引到FPGA,让FPGA用这个输出时钟去锁数据,而不是用采样时钟直接锁。原因是采样时钟到数据输出之间有固定延迟,直接用采样时钟锁可能采到数据跳变沿。用输出时钟锁,时序关系由芯片保证,FPGA只需要处理输出时钟到内部寄存器的建立保持。
这里有个实操技巧:在FPGA里对AD9280的输出时钟做一次寄存再使用,可以改善时序。如果输出时钟频率不高,直接进全局时钟网络也行,但要注意输出时钟和FPGA内部时钟的相位关系,必要时用IDELAY或者相位调整来对齐。
4.3 双时钟域的协调
AD9280和AD9708如果同时工作,就有两个时钟域:采样域和更新域。如果两者时钟同源,比如都来自同一个PLL的不同输出,那还好处理,跨域数据用异步FIFO或者双口RAM。如果两者时钟独立,就必须做跨时钟域处理,否则数据会亚稳态。
教学模块里常见做法是让AD9708的更新时钟和AD9280的采样时钟同频或者成整数倍关系,这样跨域处理简单。比如采样32MHz,更新也是32MHz,FPGA里采一个送一个,不需要FIFO。但如果要做采样存储再回放,就需要FIFO缓冲,FIFO深度取决于你要存多少点。
4.4 时钟走线与端接
时钟信号在PCB上要走得干净。时钟线尽量短、尽量直、远离模拟信号线。如果时钟频率高,要考虑传输线效应,源端串一个22Ω到33Ω的电阻做端接,减少反射。时钟线不要跨分割地平面,否则回流路径断裂,辐射和抖动都会变差。
AD9280和AD9708的时钟输入引脚通常有内部缓冲,但输入电容和输入阻抗要查手册。如果时钟源驱动能力弱,可能需要在时钟线上加一个缓冲器或者用LVDS差分时钟。差分时钟抗共模噪声能力更强,高速时优先考虑。
5. 电源与地:决定底噪的隐形战场
5.1 模拟电源与数字电源的分离
AD9280和AD9708都有模拟电源和数字电源引脚,模块上必须把两者分开供电,至少用磁珠或者电感隔离。模拟电源给内部参考、采样保持、DAC电流源供电,数字电源给接口逻辑供电。如果混在一起,数字开关噪声会通过电源耦合进模拟部分,底噪明显上升。
分离的做法是:数字电源用一路LDO,模拟电源用另一路LDO,两路在电源入口处单点连接。磁珠选高频阻抗高的,比如100MHz时阻抗600Ω以上,这样能有效阻断数字噪声。LDO的PSRR(电源抑制比)也要看,越高越好,尤其是你要处理的信号频率对应的频段。
5.2 参考电压的干净程度
AD9280的参考电压决定输入范围,AD9708的参考电流决定输出满量程。参考电压如果不干净,采集和输出的绝对精度都会漂。模块上参考电压一般由芯片内部产生或者外部基准源提供。如果用内部参考,要在参考引脚加去耦电容,通常0.1μF和10μF并联,0.1μF滤高频,10μF滤低频。
如果用外部基准,基准源的温漂和噪声要重点关注。8位精度下,参考电压的噪声要小于1/256的参考值,比如参考2V,噪声要小于8mV。普通基准源能做到,但要注意布局,基准源远离数字电路和时钟线。
5.3 地平面处理与回流路径
PCB布局里,地平面的处理是底噪的关键。模拟地和数字地要分开铺,最后在ADC/DAC下方单点连接。这样数字回流不会流经模拟地,模拟回流也不会流经数字地。连接点选在芯片下方,让模拟和数字的参考电位在芯片处一致。
回流路径要短。高速信号的回流总是走阻抗最小的路径,通常是信号线正下方的地平面。如果地平面被分割,回流要绕路,形成环路,辐射和串扰都会增加。所以信号线不要跨分割,尤其是时钟线和模拟信号线。
5.4 去耦电容的布局
每颗芯片的每个电源引脚都要有去耦电容,0.1μF就近放置,越近越好,最好和引脚在同一面。10μF的体电容可以放在稍远的地方,给整个芯片供电。去耦电容的接地端要就近打过孔到地平面,过孔要短,否则电感效应会让高频去耦失效。
注意:去耦电容不是越多越好,关键是布局。一个布局糟糕的0.1μF电容,效果可能不如一个布局良好的1μF电容。电容的等效串联电感(ESL)在高频下主导阻抗,所以小封装(0402或0201)比大封装(0805)高频特性好。
6. 实测中容易踩的坑与排查思路
6.1 采集数据跳变:先查时钟再查电源
采集到的数据低位跳变,很多人第一反应是芯片坏了,其实大概率是时钟或者电源问题。排查顺序:先用示波器看采样时钟的抖动和过冲,如果时钟边沿有振铃或者抖动大,先解决时钟。时钟没问题再看电源纹波,用示波器交流耦合看模拟电源上的噪声,如果纹波超过几mV,就要查去耦和LDO。
还有一个隐蔽原因:输入信号源本身不干净。信号发生器输出如果带噪声,采出来自然跳。先用直流或者电池分压的干净信号测,确认ADC本身没问题,再上信号源。
6.2 输出波形失真:从负载和滤波查起
AD9708输出波形失真,常见原因有三个:负载电阻不匹配、输出运放压摆率不够、重建滤波器截止频率不对。先测负载电阻上的电压波形,如果阶梯明显、边沿圆钝,可能是负载电阻太大或者运放带宽不够。如果波形顶部或底部削平,可能是输出摆幅超出运放输出范围,检查运放供电和输出范围。
重建滤波器如果截止频率设得太低,有用信号高频成分被衰减,波形会变圆;设得太高,镜像滤不干净,波形上会有高频毛刺。用频谱仪或者FPGA做FFT看输出频谱,能快速定位是滤波问题还是其他问题。
6.3 双芯片同时工作的串扰
AD9280和AD9708在同一块板子上,如果布局不好,DAC的输出会串到ADC的输入。排查方法:让DAC输出一个固定频率,ADC输入接匹配负载不接信号,看采集数据里有没有DAC频率的成分。如果有,说明串扰存在,需要加大模拟输入和输出之间的隔离,比如拉开距离、加地线隔离、输入输出走线垂直交叉。
串扰还可能通过电源耦合。DAC工作时电流变化大,会在电源上产生噪声,如果ADC和DAC共用模拟电源,噪声就传过去了。解决方法是模拟电源再分两路,ADC和DAC各一路,中间用磁珠隔离。
6.4 时序不满足导致的误码
FPGA读AD9280数据时偶尔出现误码,时序问题居多。用示波器同时看输出时钟和数据线,确认数据在输出时钟边沿是否稳定。如果数据跳变沿和时钟边沿太近,就要调整FPGA的采样时刻,用IDELAY或者把时钟反相。也可以降低采样率试试,如果降速后误码消失,基本确定是时序问题。
AD9708写数据也一样,FPGA输出数据和更新时钟的相位关系要满足芯片的建立保持时间。查手册找到t_su和t_h,用示波器测量实际相位,留足余量。高速时建议用FPGA的ODDR原语输出时钟和数据,保证两者相位关系确定。
7. 自己复刻时的布局与调试建议
7.1 叠层与分区规划
如果自己画板子,建议至少四层:顶层信号、第二层地、第三层电源、底层信号。模拟区和数字区分开布局,ADC/DAC放在中间,模拟输入输出在一侧,数字接口在另一侧。时钟线走内层或者顶层但包地,远离模拟线。
电源层不要整片铺,按模拟和数字分割,分割间隙足够宽,避免跨分割。地平面整片铺,但在ADC/DAC下方做模拟地和数字地的桥接,桥接宽度要够,让回流顺畅。
7.2 关键器件的选型清单
运放选型看增益带宽积、压摆率、建立时间、噪声。ADC前端运放重点看建立时间和噪声,DAC输出运放重点看压摆率和带宽。负载电阻用低温漂的金属膜电阻,精度1%以内。去耦电容用C0G和X7R组合,小容值用C0G,大容值用X7R。基准源如果外置,选低噪声低温漂的。
连接器选阻抗匹配的,高速信号用SMA或者排针加地针。排针便宜但阻抗不连续,短距离低速可以,高速建议SMA。
7.3 上电调试的步骤
上电前先目视检查焊接,尤其是电源和地有没有短路。上电后先测各路电源电压,确认正常再插芯片。然后测参考电压,确认在预期值。接着给时钟,用示波器看时钟波形。最后给输入信号,看ADC输出数据,再测DAC输出。
调试时一步步来,不要一上来就全接。先让ADC单独工作,确认采集正常,再让DAC单独工作,确认输出正常,最后两者一起工作,看有没有相互干扰。这样出问题时容易定位。
7.4 性能评估的简易方法
没有专业仪器时,可以用FPGA做简单评估。采集一个正弦波,做FFT看信噪比和有效位数。有效位数ENOB=(SINAD-1.76)/6.02,SINAD是信号与噪声加失真比。8位ADC理想ENOB约7.8位,实际能做到7位以上就不错。DAC输出接回ADC输入,做环回测试,看整体链路性能。
环回测试能同时暴露ADC和DAC的问题,但要注意DAC输出要衰减到ADC输入范围,否则会削顶。衰减用电阻分压,分压比按输入输出范围算。
这套ADDA模块的硬件设计,说到底是在有限的成本和板面积下,把模拟前端的偏置与滤波、时钟的抖动与相位、电源的分离与去耦、地的回流与隔离这几件事做到平衡。AD9280和AD9708本身是成熟的芯片,性能上限由外围设计决定。我自己的经验是,同样的芯片,布局和电源处理不同,实测有效位数能差一位以上。所以别急着换芯片,先把外围这几个环节抠一遍,往往比换芯片提升更明显。