☰
AD9361多芯片同步实战:从REF_CLK共用到MCS相位对齐全解析
2026/10/5 6:56:39 网站建设 项目流程

最近在给一套4通道相控阵接收前端做通道校准,折腾了一周,最磨人的不是射频链路本身,而是两片AD9361之间的相位关系。刚接触SDR那会儿我也以为,只要把两片AD9361的REF_CLK接到同一个晶振上,采样率和中心频率配置成一样的,它们自然就同步了。被现实教育过几次之后才明白,AD9361的多芯片同步远不是“同频”两个字能概括的,SYNC信号、BBPLL相位、RF PLL分频器、TDD切换时刻,每一个环节都可能让你采集到的IQ数据相位漂得莫名其妙。这篇文章把整个同步过程从原理到实战捋一遍,包括硬件连线、软件流程、实测方法,以及我踩过的那些坑。

1. 问题本质:为什么两片AD9361即使共用一颗晶振,相位依然各走各的

1.1 AD9361内部时钟链路拆解

AD9361虽然是高度集成的射频收发器,但它的核心时钟生成链路和分立器件方案在本质上没有区别。每片AD9361内部有两条独立的锁相环(PLL)链路:

  • 参考时钟REF_CLK进来之后,通常会先经过一个片上时钟缓冲器,再送入射频本振PLL(RF PLL)和基带/数据时钟PLL(BB PLL)。
  • RF PLL负责产生射频本振信号,用来做混频器激励,也就是LO信号。
  • BB PLL负责产生ADC/DAC的采样时钟,同时也会派生出发送数据时钟、接收数据时钟以及FPGA接口用的逻辑时钟。

问题就出在这里:两片AD9361即使从同一颗晶振取REF_CLK,也仅仅是“标称频率一致”,因为每片芯片内部的PLL压控振荡器(VCO)起始频率、环路滤波器充放电状态、分频器初始位置都是独立随机启动的。PLL的锁定本质上是一个反馈收敛过程,它保证的是“输出频率无限接近目标值”,但输出信号的绝对相位与启动时刻的VCO自由振荡相位强相关。

这就好比两个人用同一块母钟对好了手表,但母钟本身不是内置到每块手表里的,而是每块手表内部石英振荡器各自起振、各自锁频。最终两兄弟报时都能报出一样的“几时几分”,但秒针指向的位置可能完全不同。

1.2 “同频”与“同相”的差距,以及它会毁掉什么应用

如果你的应用只是单通道收信、看频谱、解个FM,那么芯片间相位不一致根本无所谓。但一旦涉及下面这些场景,问题立刻放大:

  • MIMO通信:空时编码、空间复用都需要多通道之间的相对相位可预测。
  • 波束成形:各天线通道的相位关系直接决定了波束指向。每片AD9361的LO相位差一个θ,最终波束就想偏一个方向偏。
  • 干涉测向 / 到达角估计:通道间相位差是估值的基础输入,相位漂移等于给测向结果注入巨大偏差。
  • 灵巧干扰 / 抗干扰阵列:需要精确控制任意阵元信号的相位和幅度。

在这些应用里,“同频”只是底线的底线。不同芯片之间哪怕只差一个本振周期的零点几几%,经过混频后就会在IQ数据里表现为一个恒定的通道间相位差;如果每次上电这个相位差还是随机的,那你的校准工作就永远不能收敛。

2. 多芯片同步要管的三个层面:采样时钟、本振相位与数据接口

2.1 采样时钟对齐:让所有ADC在同一时刻采样

第一个要做的是采样时钟对齐。AD9361每个芯片的BB PLL会以REF_CLK为参考,产生一个高频时钟,然后经分频得到ADC采样时钟。由于两片芯片的BB PLL分频链起点随机,即使频率完全一致,两片ADC的采样时刻也会差一个固定的、可能高达几百皮秒到纳秒级的时间。

这个时间差在射频链路里意味着什么?假设中心频率2.4GHz,信号周期约0.42ns,如果两片ADC采样时刻差0.2ns,基带IQ数据的相位差就是2π×0.2/0.42≈171度,接近反相了。这显然是不可接受的。

AD9361为此设计了SYNC_IN/SYNC_OUT引脚。当所有芯片的BB PLL都锁定后,往SYNC_IN引脚上送一个脉冲,芯片内部会把BB PLL输出的分频链复位到一个已知状态,从而让所有芯片从同一个相位基准开始输出采样时钟。这个过程在多芯片同步术语里常称为“MCS”(Multi-Chip Synchronization)。

2.2 本振相位对齐:射频链路的基准必须统一

采样时钟对齐解决的是“基带离散时间轴上各通道采样点对齐”,但射频本振的相位也必须对齐,否则即使ADC采样时刻完全一致,各通道混频器的载波相位也会不同。

AD9361的RF PLL输出通常要经过射频分频器才能得到LO信号。射频分频器本身也是数字分频链,它的初始状态是上电随机的。这就是为什么即使你强制两片芯片输出完全同相的采样时钟,LO相位仍可能差一个不确定的分频相位。

解决思路和BB PLL一致:在RF PLL锁定完成后,用同一个SYNC脉冲去复位射频分频链。AD9361内部清楚这一点,所以它的同步机制并不是只对齐一个点,而是把BB PLL分频链、射频分频链以及TX/RX数据路径全部放在同一个同步事件里统一复位。

有一点必须注意:RF PLL从VCO锁定到分频链复位稳定需要时间,SYNC脉冲不能给得太早。建议在软件里确认PLL锁定指示(通常读寄存器),再延后几十微秒触发SYNC。具体延后量参考AD9361官方参考手册里Multi-Chip Synchronization一章的时序图。

2.3 数据接口对齐:从射频到FPGA的最后一公里

前两层都搞定了,最后还差数据接口。AD9361通过LVDS或CMOS并口把ADC数据和TX数据送到FPGA。多片AD9361的数据线最终会汇聚进FPGA内部的总线,如果不同芯片的数据到达FPGA的时间不一致,即使前端采样时钟和LO都对齐了,FPGA内部恢复出来的多通道数据流依然存在lane间偏斜。

实际工程中,数据接口对齐通常分两步:

  1. 先依靠FPGA内部的IO Delay和Bitslip逻辑,把从各片AD9361进来的并行数据各自调整到正确的字边界。
  2. 再通过HDL工程里的一套校准状态机,利用AD9361输出的测试图形,把所有通道的数据用同一个帧头对齐。

AD9361支持在MCS后强制输出一段固定的测试数据,FPGA可以据此调整内部FIFO读指针,把多通道的数据统一对齐到同一个时钟沿上。这一步在FMCOMMS5官方HDL参考设计里已经有现成实现。如果你完全自己写Verilog/状态机,最容易漏的就是这一层,最后表现出来是:相位测试时IQ数据正弦波很干净,但不同通道间总是差那么一两个采样点。

3. 硬件连线与同步拓扑:一块板卡上的4路收发是怎么布出来的

3.1 参考时钟扇出:全系统抖动最低的一根线

参考时钟的质量决定了整个系统的底噪和同步上限。如果参考时钟的抖动太大,PLL的锁定相位噪声就会恶化,多芯片的相位稳定性也跟着变差。

我这次做的4通道接收前端,用的是两片AD9361,参考时钟选择了10MHz。布线方案如下:

  • 10MHz参考源选用低抖动TCXO/OCXO,先经过一级时钟扇出缓冲器,分成两路低抖动时钟,再分别送入两片AD9361的REF_CLK引脚。
  • 时钟扇出缓冲器优先选择专门的时钟分配芯片,而不是用普通逻辑门分路。普通逻辑门的传播延迟、输出上升沿抖动脉冲都会直接叠加到参考时钟上。
  • 两路REF_CLK走线在PCB上尽量等长,至少保证误差在几十mil以内。10MHz的波长很长,走线长度差带来的相位差相对较小,但仍会转化为初始相位差的一部分。

如果你用的是40MHz参考时钟,注意不要直接拿FPGA的通用IO输出给两片AD9361,除非你对时钟扇出能力很有把握。实测中,FPGA普通IO直驱两片AD9361的REF_CLK,在2.4GHz频段会额外引入约几十皮秒的有效抖动,对高要求场景并不合适。

参考时钟源方案抖动水平(经验值)适用场景
晶振直连单芯片最低单芯片系统
晶振经时钟缓冲器扇出到多芯片低多芯片同步推荐
FPGA普通IO直驱偏高仅在低速/非敏感应用中使用

3.2 SYNC信号广播:用FPGA统一触发所有芯片

同步信号的拓扑有两种常见选择:一种是级联(主芯片SYNC_OUT接到从芯片SYNC_IN),另一种是广播(FPGA的一个GPIO同时接所有芯片的SYNC_IN)。

我早期在FMCOMMS5参考设计上用的级联方式,理由是官方评估板就这么干的,后面自己布板就偷懒直接搬。结果发现级联链的传播延迟比较大,主芯片的SYNC_OUT经过板级缓冲再进从芯片,到达时间比直接要慢,如果时序裕量处理不好,高低温下容易偶尔失步。

这次我改成了广播方式:FPGA内部用一个专用的同步状态机,在合适的时刻往所有AD9361的SYNC_IN引脚同时打一个满足参考手册时序要求的脉冲。脉冲宽度要用BB_CLK域寄存打拍,确保信号相对所有芯片的时钟域都有充足建立保持时间。

SYNC信号建议走HSTL/LVCMOS缓冲器扇出,且各路之间的skew尽量控制在200ps以内。实际测量中,如果两片AD9361的SYNC_IN引脚之间存在明显走线长度差或经过不同路径的缓冲器,同步后通道间相位差会偏大且不稳定。

3.3 SPI总线与每个芯片的身份识别

每片AD9361控制接口都是SPI,多片使用同一个SPI总线时用片选CS区分。我的习惯是SCLK/SDI/SDO共用,CS0/CS1分别接两片AD9361,CS由FPGA逻辑控制。

这里有个容易被忽略的小坑:SPI总线的工作频率不能太高,否则在长线上反射严重,而片选信号又受同步状态机控制,很容易出现“寄存器写一半断流”的情况。建议SPI时钟控制在20MHz以内,必要时在FPGA侧对SPI输入信号做IO下降沿采样。

另外,上电时序上必须保证两片AD9361的RESET释放时间差不能太大。我一般让FPGA在系统上电后先把两片RESET同时拉低,再统一释放,释放后至少延时100ms再开始配置寄存器。这样可以尽量让两片芯片的初始状态接近,虽然MCS会最终对齐相位,但初始状态接近也能降低个别板卡同步失败的机率。

4. 软件侧同步流程:从IIO设备到MCS动作的完整链路

4.1 驱动与设备树里的双AD9361实例

linux系统下调试AD9361,最简单的方式是用ADI官方的libiio环境。两片AD9361在设备树里表现为两个独立的IIO设备,分别占用不同的SPI片选。驱动起来后,通过命令行或C API就可以分别读写每个实例的属性。

如果你是自己写裸机驱动或FPGA状态机控制,核心思路是一致的:把每片AD9361当成一个独立对象,按固定顺序做“配置频率→等待PLL锁定→统一触发SYNC→校验收敛”。

特别提醒一下,千万不要在MCS过程中交叉读写两片芯片的SPI,容易把同步时序搞乱。建议的做法是:先依次把每片AD9361配置到目标频率,并确认各自PLL锁定完成,然后暂停SPI操作,专门发SYNC信号,SYNC后再恢复对每片芯片的读操作。

4.2 同步执行顺序:为什么必须“先频率、后触发”

拿我这次2.4GHz载波、30.72MSPS采样率的配置为例,多芯片同步的软件执行流程是:

  1. 暂停所有通道的数据采集,确保MCS期间不产生无效干扰。
  2. 对两片AD9361做完整的初始化,包括SPI接口、数字接口模式(LVDS还是CMOS)、滤波器配置。
  3. 先后配置两片芯片的LO频率和采样率,确保两者配置完全相同。
  4. 读PLL锁定指示寄存器,确认两片都已锁定。
  5. 延时一段时间(我通常给500us到1ms,依据参考手册和实测效果调整),确保内部模拟校准完成。
  6. 由FPGA控制GPIO发出SYNC脉冲,同时送入两片AD9361。
  7. 等待同步完成,通常需要几十毫秒量级;然后读相关寄存器确认同步状态。
  8. 对每片重新执行必要的RX/TX校准,因为MCS会复位部分数字链路。

第5步容易被忽略。有些工程师直接发完频率就在几十微秒内打SYNC,结果发现相位差好的时候很好,差的时候乱七八糟,概率大概两三天出现一次。这往往就是没等PLL和内部校准链路完全稳定。

4.3 重同步策略与TDD模式下的选择

多芯片同步不能做成“只在上电跑一次”。射频系统长期运行会产生温升,PLL控制电压、滤波器的群延迟、PCB板材的介电常数都会随温度缓慢变化,通道间相位也会跟着漂移。如果你做的是连续波或长时测量,建议每运行一段时间就做一次MCS重同步。

TDD模式下问题更突出。因为每次收发切换,AD9361的LO都会被power down再重新上电。不同step切换之间,LO重新锁定后的初始相位未必完全重现之前的相位关系,这就导致通道间相位差在每一次TDD切换后都可能跳变。

比较实用的应对方案:

  • 如果系统允许,在每次TDD切换后做一个快速同步动作。
  • 如果不允许频繁同步,用AD9361支持的fastlock profile机制,把某一次成功锁定后的状态保存下来,后续切换直接调用同一个profile。这样每次切换时LO重锁定的过程完全一样,相位可重复性会好很多。
  • 实测下来,fastlock profile对多芯片相位稳定性的提升非常明显,但前提是profile保存的是“已经做过同步”的状态,而不是随便某次的锁定状态。

5. 实测验证:怎样证明两片AD9361真的同步了

5.1 用CW单音信号测通道间相位差

软件跑完MCS后,必须用实测验证,不能只看状态寄存器就说“同步成功”。

我的做法是:用射频信号源输出一个连续波(CW)单音信号,经功分器同时送到两片AD9361的RX端口;信号源和AD9361的10MHz参考时钟用同一个源,这样可以排除因参考源不一致而导致的天然频差。

然后FPGA同时采集两个通道的IQ数据,各取64K点,用FFT或者直接对单点复数信号求相角。计算两个通道初相之差:

  • 单音频率最好落在通道带内偏中心一些的位置,避免直流附近和通带边缘的失真。
  • 重复测量20次以上,观察相位差是否恒定。
  • 稳定的相位差应该是固定值,通常小于1度;如果每次测试结果乱跳,说明同步链路没做好。

我还做过一个更极端的实验:连续下电再上电多个循环,每次都等系统完全重启动再执行MCS,记录每次通道间相位差。因为MCS本身应该消除上电随机相位,所以这个统计值应该非常集中。如果每次上电机后相位差都在一个很小的范围内重复,说明MCS流程可靠。

5.2 长时间观测:相位稳定性与温度漂移

同步瞬间相位对齐了,不意味着永远对齐。一个更严格的方法是长时间采集数据,比如每小时记录一次相位差,连续观测十几小时,再和板卡工作温度对照。

在我这次实测中,MCS刚完成时两通道相位差大约0.1度;连续工作4小时后,由于功放、电源等发热区域影响两片AD9361的温度不对称,通道间相位差慢慢漂到了0.4度左右。这个漂移量值和PCB布局、系统通风密切相关,但只要漂移是缓慢的、连续的,通常可以通过周期性MCS重同步来修正。

如果发现相位差不是缓慢漂移,而是每隔几分钟就跳变一次,那基本不是热漂移问题,而是某些数字分频器或数据接口偶尔失锁。这种情况需要回到信号完整性和时序上排查,比如SYNC信号的信噪比、LVDS数据线的差分匹配、FPGA内部FIFO溢出等。

5.3 同步失败的快速判断方法

平时调试不一定要每次都上信号源。我自己习惯用一个很简单的快速探测方法:

  • 把两片AD9361的发射通道都设置为输出一个已知单音信号(比如2.4GHz连续波),再用宽带接收通道自环采集这个信号。
  • 如果多芯片同步正常,采集到的IQ数据相位差随时间是一条直线;如果同步丢失,就能看到相位差发生明显台阶式跳变。
  • 这个方法能在不出门、不用额外仪器的情况下快速验证同步稳定性,也适合做成自动化测试脚本,观察几十个小时。

另外,libiio环境里可以直接查看LO频率锁定状态、RSSI等属性。虽然RSSI不直接反映相位,但RSSI突跳往往伴随着同步异常,可以作为第一级告警信号。

6. 实战中踩过的坑与注意事项

6.1 只接REF_CLK不接SYNC的“假同步”

我最初给两片AD9361铺好共享REF_CLK后,系统确实能工作,频谱、解调都正常,唯独测通道相位差时发现,每次上电结果都不一样。后来定位到原因:我并没有真正执行MCS,两片芯片的PLL分频链完全是各跑各的,所谓“同步”只是表面上的频率一致。

很多刚开始做MIMO的人都会掉进这个坑。判断方法很简单:把系统断电重新上电几次,如果每次测出的通道间相位差都不一样,基本可以断定SYNC没起作用。

6.2 SYNC脉冲时序不足时的偶发失步

另一个很折腾的问题是:MCS流程看起来执行了,状态也正常,但连续大批量测试中偶尔有一片板卡相位差偏大40~50度。

后来查了时序,才发现SYNC脉冲的宽度和建立时间裕量不足。AD9361参考手册对SYNC_IN相对于内部时钟的建立/保持时间有明确定义,如果直接用FPGA IO打一个几十ns的脉冲而不经过任何同步处理,在温度和电压变化时就可能落入亚稳态区域,导致某一颗芯片没有正确响应。

解决办法:SYNC信号在FPGA内部用BB_CLK域打两拍再输出,输出端再加一个专门驱动缓冲器;同时把脉冲宽度留足手册要求值的1.5倍以上。改完这版后,几十块板卡连续重复测试,失步概率降到零。

6.3 复位顺序与重启后的重新同步

多芯片系统里,任何一片AD9361的复位都会破坏全局同步状态。实际工程中,有人为了调其他功能,单独复位了其中一片AD9361,然后其他通道继续工作,结果收发数据全部错乱还找不到原因。

记住一个原则:只要动过任意一片AD9361的电源、复位、重新配置或PLL重锁,就必须重新执行一次完整的MCS流程。

还要注意,执行MCS前不要同时开启所有通道的数据流。建议先关接收数据流,做完MCS再打开。否则同步动作可能被总线上的数据干扰,状态寄存器虽然显示同步完成,但后续数据流里依然存在残留的相位错位。

最后再说一点经验:多芯片同步是系统工程,硬件、软件、时序、热设计、测试方法是一环扣一环的。如果你在设计初期就把参考时钟扇出、SYNC广播、MCS状态机当成和滤波器一样的基本模块来对待,后面调试会顺很多;如果等到板卡回来才发现多芯片相位对不齐,那就只能像我一开始那样,拿着示波器万用表在暗无天日的调试台上慢慢折腾了。希望这篇记录能让你少走这段弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询