ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于C6678与XC7V690T的6U VPX信号处理板设计与调试

基于C6678与XC7V690T的6U VPX信号处理板设计与调试

做VPX处理板这些年,我有个很深的体会:6U VPX信号处理卡这种“DSP TMS320C6678 + FPGA XC7V690T”的组合,几乎成了中高端信号处理板的标配。前两年调试一块6U VPX板卡时,对面兄弟扫了一眼原理图,直接来一句“又见老熟人”。确实,C6678负责复杂基带算法和协议处理,XC7V690T负责高速数据采集、接口扩展和实时预处理,一个管后端算法,一个管前端数据,分工干净利落。

这篇不是教科书式的原理讲解,而是把我做这块板子时从架构选型、电源时钟设计、双处理器最小系统,到最后整卡调试的真实思路串起来聊。内容会落到每个关键节点上:为什么这么选型、哪些引脚要特别注意、哪些地方容易翻车、原理图里必须预埋什么伏笔。适合正在做DSP+FPGA板卡、或者准备用C6678和XC7V690T搞6U VPX处理板的人参考。无论你是刚接手硬件设计的新人,还是已经在调板路上被折磨过几轮的工程师,看下来应该都能找到几个对自己有用的点。

1. 架构选型背后的逻辑:为什么6U VPX上非要DSP加FPGA

1.1 C6678和XC7V690T各自的角色

要解释硬件选型,得先从具体的计算场景说起。

我设计的这块板,主要干的是宽带信号采集、数字下变频、解调、脉冲压缩这类实时信号处理。信号从ADC/DAC进来之后,采样率动辄几百Msps甚至上Gsps,数据流是连续不断的。这种事情让通用处理器来做,IO带宽和实时性都不够;让纯FPGA来做,复杂算法开发效率低,浮点算法更是写到怀疑人生。所以最合理的解法,就是把“数据入口+预处理”交给FPGA,把“上层算法+模式调度”交给DSP,中间用高速互连把两边串起来。

先说DSP这头。TMS320C6678的优势在于8个C66x核心,每个核心都是定点和浮点双支持,主频最高能到1.25GHz。跑基带类算法非常合适,一个核做解调,另一个核做译码,还能通过IPC和共享内存做多核协同,基本可以扛住几十路的并行任务。对比早期C6455这种纯定点DSP,浮点算法不用手动定标,开发效率完全不在一个量级。C6678内部还集成了SRIO、PCIe、HyperLink、千兆以太网、EMIF16、UART、SPI、I2C、GPIO,对外互联基本不用额外挂桥接芯片,这对板级面积和功耗都是好事。

再看FPGA这头。XC7V690T属于Virtex-7系列,逻辑资源接近70万,做成信号处理板,重点不是看逻辑单元,而是看DSP48E1切片和块RAM。DSP切片干乘加运算,FIR、DDC、FFT都能源源不断塞进去;块RAM做数据缓存和FIFO,配合外部DDR3做深缓存,能应付长时间连续采集。再加上二十路左右的高速收发器GTX,光口、背板串行总线都能直接接出来,省掉不少物理层转接芯片。

1.2 DSP与FPGA之间的数据通路设计

这种双处理器板卡,最核心的原理图区域其实是DSP和FPGA之间的互连。如果这块没设计好,后面调试起来会非常难受。

我通常把FPGA到DSP的数据通路分成三类。

第一类是高速串行口。C6678有SRIO x4和PCIe x2,FPGA端也有对应的GTX。SRIO传输效率高,适合搬运大批量FFT结果或者采集数据;PCIe在DSP侧做端点或根复合体都有官方例程,能用但稍微繁琐,我一般只有在系统明确要求PCIe拓扑时才走它。第二类是并行低速总线,EMIF16,数据地址线加片选,适合传递控制字、小包数据和DSP引导代码。第三类是控制信号,GPIO和中断,FPGA把“数据准备好”“缓冲区满”这类事件通知DSP,DSP通过GPIO选通或者触发中断去取数。

设计原理图时,高速串行链路的重点是参考时钟。C6678的SRIO和FPGA的GTX参考时钟,最好同源或者有明确的相位约束,否则链路偶尔出现抖动很难查。EMIF16方面,地址线和数据线要等长,片选和读写信号要按C6678的建立保持时间核算,不能想当然地拉到GPIO上。GPIO中断线要注意电平匹配,C6678的GPIO通常工作在1.8V或3.3V电压域,FPGA要选对应bank配合,别把3.3V信号直接灌进1.8V电平的引脚。

1.3 6U板卡的物理资源约束

到了6U VPX这个层面,原理图设计就不再只是“把器件连起来”了,板卡物理尺寸、连接器选型、模块定义都在约束你。

6U板卡的尺寸是233.35mm×160mm,可用面积被安装孔、导冷条、连接器占掉不少。VPX背板连接器是高速高密度差分连接器,引脚密集,分布在P0到P6几个连接器上。大量差分对和电源引脚交织在一起,分配起来必须提前做好规划。我最常用的做法是:在原理图设计初期,就先把背板连接器上哪些引脚走SRIO、哪些走PCIe、哪些走千兆以太网、哪些给电源地固定下来,一格一格填到Excel矩阵里。等布板阶段再去调引脚,往往会被动得很。

另外,6U VPX板卡通常要预留系统管理相关接口,比如IPMB总线、SMC上电握手信号。哪怕项目暂时不做这些功能,原理图上也要留出引脚和电阻焊盘位置,否则全系统联调时会发现整槽管理能力缺失,再返工就不是改几根线的事了。

2. 电源树设计与上电时序:先把功耗账算清楚

2.1 功耗评估与VPX功耗等级

设计原理图第一步不是连线,而是算功率。

C6678满载功耗大约在10W上下,视内部核数和运行频率而定;XC7V690T根据IO翻转率、DSP slice利用率,我一般按15到25W估算,静态加动态再留出30%裕量。再加上DDR3、时钟芯片、千兆PHY、FPGA配置Flash、电平转换,整卡典型功耗能做到50W到70W。

6U VPX标准里对单槽功耗有明确分档,常见的几个等级是13.9W、23W、38W、58W、75W,后面还有更高的档位。选档时不能只看“典型功耗”,要看最恶劣情况——比如DSP八核满载、FPGA逻辑利用率拉满、所有光口和背板链路都在跑数据。我一般按最高档设计,免得整机联调时被供电和散热卡脖子。

2.2 电压轨与DC-DC选型

两个大家伙的电压轨各有各的脾气,这里列一个我在原理图里常用的电源清单:

电源轨电压主要负载预估电流
VCCINT1.0VFPGA核心逻辑10~20A
VCCAUX1.8VFPGA辅助逻辑1~2A
VCCO1.5V/1.8V/2.5V/3.3VFPGA各bank IO按bank分配
MGTAVCC1.0VGTX收发器模拟核心0.5~1A
MGTAVTT1.2VGTX收发器端接0.5~1A
CVDD/DVDD1.0VDSP核心和DDR PHY4~8A
VDD1V81.8VDSP IO、复位、监控1~2A
VDD3V33.3VDSP IO、Flash、PHY1~2A
DDR3 VDD1.5VDSP/FPGA DDR32~4A
DDR3 VTT0.75VDDR3终端1A

这些电压轨不能全从背板直接取,12V转1.0V给C6678和V7,无论是效率还是纹波都很难看。常见做法是板上先做一级中间母线,比如12V进来,先用高效DC-DC转出5V,再让各路大电流POL模块从5V降到1.0V、1.8V等。C6678和FPGA核心电流都很大,选型时要注意功率器件的散热能力。电流特别大的1.0V轨,我会选择双相或多相控制器,分散热点的同时也能降低输入纹波。

DSP的CVDD和FPGA的VCCINT虽然都是1.0V,但我不建议强行共用一路电源。原因有两个:二者上电时序要求不同,电流峰值也不同,共用之后相互影响,容易在某个上电瞬间掉压,导致复位毛刺。所以原理图上宁可多一路DC-DC,也不要在这里省模块。

2.3 上电时序、监控与复位联锁

DSP和FPGA都有上电顺序要求。C6678要求CVDD、DVDD先于IO电压起来,或者同时起来;FPGA要求VCCINT先于VCCAUX、VCCAUX先于VCCO。如果顺序反了,轻则芯片电流异常,重则IO结构闩锁,长期可靠性很成问题。

原理图设计时,每个DC-DC模块都有使能引脚EN和Power Good输出。最简单的时序实现,就是把前一级的PG接到后一级的EN,形成级联。比如12V到5V这路,5V输出稳定后拉高PG,再去使能5V到1.0V的POL模块,1.0V输出正常后再去使能1.8V,依此类推。如果时序间隔需要更精确,可以加RC延时网络或者直接上一颗电源时序控制器。像UCD9090这类专业排序器有点贵,但对这种双大芯片、多电压轨的板卡来说,能省掉很多上电时序调试的麻烦。

除了排序,还要加电压监控。我习惯用一颗多通道电压监控芯片盯住1.0V、1.8V、3.3V、DDR3电源,任何一个低于阈值就拉低系统复位信号。之前遇到过一次低温启动时1.0V掉到0.95V导致DSP随机复位的问题,虽然监控芯片不能直接止血,但至少能记录电源异常,不至于在整机现场一脸懵。

3. 稳定性的地基:时钟、复位与配置链路

3.1 时钟树设计

6U VPX处理板的时钟树往往被低估,但实际调试故障里,时钟问题占了三成以上。

C6678的主时钟一般用25MHz或50MHz晶振输入,经内部PLL倍频到内核频率;DDR3控制器时钟由DDR PLL产生。FPGA端则用专用时钟输入引脚接50MHz、125MHz等参考时钟。设计时最好用一颗可编程时钟发生器,比如LMK或者SI5338系列,同时产生DSP主时钟、SRIO参考时钟、GTX参考时钟、ADC采样时钟。这样做的好处是各参考时钟之间的相位关系可控,而不是每个模块各用各的晶振,各走各的频率,最后在跨时钟域时留下一堆隐患。

串行总线的参考时钟质量尤其要注意。SRIO链路我习惯用5Gbps速率,GTX也常用5G或6.25G,参考时钟的抖动要求非常严格。有源晶振供电要加滤波:电源脚串一颗铁氧体磁珠,再加0.1μF和10μF电容去耦,不要直接挂在数字电源平面。另外,C6678的SRIO和PCIe是独立的参考时钟输入,FPGA的GTX每个高速bank也有对应的MGTREFCLK引脚。分配时钟引脚时,要跟实际数据通道所在的bank对齐。不要图方便把参考时钟从远端bank绕过来,否则高速布线绕行导致相位失配,链路均衡再怎么做都救不回来。

顺便提一句,最近常有人搜“哪一款DSP芯片用的晶振12.288MHz”。这个频率在数字音频和传输系统里是常见同步参考,在信号处理板上经常作为ADC采样时钟和帧同步基准。如果系统里有多块板卡需要同步采集,用12.288MHz做全局采样参考,再通过PLL倍频出所有采样时钟,是避免跨板采样时钟不同步的好办法。原理图设计时要预留这颗参考源的位置,哪怕第一版不用。

3.2 复位与配置方式

DSP复位引脚有POR、RESET、RESETSTAT。上电时POR要保持足够长的低电平时间,等电源稳定后释放,随后RESET释放,DSP才开始执行引导程序。很多新手把POR和RESET直接短接,不是不能用,但调试时会很被动。我倾向于用一颗复位监控芯片,上电瞬间保持低电平,同时看门狗超时也能强制复位。原理图上留一组跳线把POR和RESET分开,调试时可以单独模拟复位场景,排查启动失败。

FPGA的配置方式有JTAG、Slave SelectMAP、Master SPI、Master BPI。VPX板卡上我习惯把JTAG和Master SPI都做出来。正常工作时FPGA从SPI Flash加载逻辑,调试时用JTAG下载临时版本。如果要做在线升级,可以利用FPGA实现串口升级QSPI Flash:先加载一个小的升级工程,通过UART接收固件数据,再通过QSPI控制器重写Flash,最后触发重新配置。这个功能我在多个项目里都遇到需求,有了它,现场不用JTAG也能升级逻辑,维护成本低很多。

3.3 JTAG调试链路设计

DSP和FPGA的JTAG链路,在原理图阶段就要把信号完整性和电平匹配想清楚。

C6678是TI标准的14针JTAG接口,FPGA是Xilinx标准接口,两者硬件上不能直接通用。设计时我会把两个调试头放在板卡同一侧,并且尽量靠近器件。JTAG信号走线都要短,TMS、TDI、TDO加10kΩ上拉电阻,TCK加33Ω串阻,这样能有效抑制噪声抖动。如果板上JTAG器件多,比如DSP、FPGA、CPLD串成菊花链,中间要加缓冲器隔离,防止一个器件没供电就把整个链路拉死。

调试DSP时经常出现“仿真器连接不上”的问题,我遇到过的大多数情况都跟JTAG信号电平、电源顺序或者TCK质量有关。比如C6678的JTAG工作在1.8V,而仿真器默认可能是3.3V,中间就要加电平转换或者选支持宽范围的仿真器。另外,上电后要等DSP复位完成再去连接,否则仿真器访问不到芯片内部资源。

4. C6678最小系统里的原理图关键节点

4.1 启动模式配置与引导Flash

C6678上电后会采样一组配置引脚,决定从哪个接口引导:EMIF16 Nor Flash、SPI Flash、SRIO、PCIe、HyperLink等。原理图设计要把这些引脚通过拨码开关或者电阻上拉下拉固定下来,不能悬空。

我在这块板上最常用SPI引导,Flash选16MB或32MB,把程序烧进去后cold boot直接启动。调试阶段偶尔用“no boot”模式,让仿真器加载代码到片内内存,等验证完再切回Flash引导。SPI Flash的写保护引脚要处理好。WP引脚下拉或由DSP GPIO控制,调试时方便擦写,量产时又能保护固件。EMIF16引导则要把Flash接到CE1空间,地址线、数据线、片选信号都要严格匹配C6678的时序。

4.2 DDR3接口设计要点

C6678的DDR3接口是64位数据宽度,支持DDR3-1600。原理图设计最重要的是分组和端接。

地址和控制信号采用Fly-by拓扑,终端电阻拉到VTT 0.75V;数据信号两侧用ODT片上端接。设计时还要根据PCB层叠和特性阻抗决定要不要加串联电阻。常见误区是把VREF参考电压直接用电阻分压,结果VREF被噪声污染,导致偶发性数据错误。我建议VREF用低噪声LDO或者精密分压加RC滤波,走线单独拉出去,尽量不跟数据总线平行。

DDR3的仿真在原理图阶段就可以做一轮,主要看地址信号的时序裕量。我吃过一次亏,以为64位DDR3只是线多,防呆处理一下就行,结果布线完成后发现地址线等长差太多,DDR3只能降频跑。原理图阶段多花点时间把地址组、控制组、数据组的分组和端接方案定好,后面能少返工。

4.3 高速互连及调试口分配

板上的SRIO、PCIe、HyperLink、千兆以太网、UART、GPIO都要在原理图引脚规划阶段定清楚。

SRIO通道我给FPGA分配了x4,同时预留一部分到背板,用于多板级联;千兆以太网和UART用于调试和远程管理;GPIO至少预留四路给状态灯和FPGA中断。调试口分配经常被忽略,结果是调板时想用示波器探某个信号,但该信号连到背板引脚或BGA内部,探针没地方夹。我的习惯是把关键调试信号,比如复位、RESETSTAT、FPGA的DONE、几路电源的PG,都引到PCB板边的过孔测试点,并标注丝印。后面调试效率高很多,查问题不用翻图纸一个个找。

5. XC7V690T在信号处理卡上的设计重点

5.1 FPGA配置电路与在线升级

XC7V690T的位流文件通常有十几MB,配置Flash至少要64Mbit,实际选256Mbit比较宽裕。原理图里模式引脚M[2:0]要固定到Master SPI和JTAG的组合。HP bank和HR bank的VCCO电压不同,配置引脚所在的bank电压会影响启动过程,尤其是DONE和INIT_B的上拉电平,必须和后续逻辑电平匹配。

如果要做串口升级QSPI Flash,那FPGA原理图上要把Flash的CS、CLK、MOSI、MISO引脚从普通IO引到支持QSPI的bank。升级工程通过UART接收数据,写入Flash,再触发IPROG或重新上电配置。这里要注意Flash的供电去耦和WP引脚,防止升级中途写保护意外打开,导致Flash内容被部分改写而配置失败。

5.2 GTX高速通道设计

FPGA的GTX收发器是板上最金贵的资源之一。设计时要把GTX所在bank、参考时钟、交流耦合电容、终端电阻都规划好。

每一对GTX收发器旁边都要预留交流耦合电容位置,电容尽量靠近接收端。GTX的电源要单独滤波:MGTAVCC和MGTAVTT用低噪声LDO或者LC滤波,不要直接和VCCINT共用一个磁珠。我见过不少人把GTX电源和核心电源混在一起,结果高速链路抖动超标,眼图闭合,最后只能降速或换板。

在信号处理卡上,光模块接口(QSFP/SFP)接GTX,背板SRIO也接GTX,如果ADC/DAC使用JESD204B协议,还要把JESD204B通道接到另一组GTX。所以原理图阶段要预留足够的GTX通道,并合理分配bank。提前把每个GTX通道的用途标记清楚,布线时不会因为引脚交叉把PCB走线搞成蜘蛛网。

5.3 与ADC/DAC及DDR3的数据路径

信号处理卡前端通常是高速ADC/DAC。如果使用并行LVDS接口,ADC输出的DDR模式每个通道一对线传两个采样点,等长要求非常高。FPGA引脚分配时,要把同一组LVDS数据线放在同一个IO bank,使用同一组时钟区域,否则布局布线时绕线长度很难控制。

FPGA内部大概率要做多端口DDR3读写缓存。原理图阶段就要考虑DDR3颗粒数量、rank数,以及FPGA侧DDR3接口的bank分配。我会把DDR3接口分成两个独立bank,一个bank对应数据采集FIFO,一个对应算法缓存,避免数据流相互干扰。逻辑设计时还要规划地址窗口,FPGA写DDR3的带宽和DSP读DDR3的带宽要匹配,否则总有一侧在等待中浪费带宽。

6. 从原理图到整卡调试:最容易翻车的几个环节

6.1 上电前的检查清单

第一次上电永远不要大意。我给自己定了一套顺序,每次都按这个来:

先用万用表二极管档量关键电源轨对地的压降。比如1.0V对地如果压降小于0.1V,基本可以判断有短路,这时候绝对不能上电。再查JTAG、时钟引脚焊接是否正常,晶振两脚之间有没有虚焊。然后确认拨码开关的启动模式和配置模式引脚,和实际要启动的方式一致。最后用限流电源上电,比如12V输入限流2A,先看板卡功率是否正常。如果电流异常大,立刻断电检查。

很多人在上电阶段就翻车,往往不是电路设计有硬伤,而是某个电阻没贴、某个电容焊反,导致短路或者电源保护。慢就是快,这一步省不了。

6.2 最小系统启动验证步骤

先不插仿真器,检查DSP外部晶振频率,用示波器看晶振是否起振、频率是否正确。DSP复位释放后,看片选Flash是否出现读操作信号。如果DSP引导失败,最常碰到的情况是POR低电平时间不够,或者boot引脚配置与实际Flash位置不一致。这时候先量POR和RESET波形,再查boot引脚。

FPGA最小系统启动看DONE是否拉高。配置完成后DONE应该为高,INIT_B被释放并拉高。如果DONE不是高,优先查模式引脚配置,其次看Flash里有没有正确烧录bit文件。调试阶段我习惯先用JTAG加载一个闪灯小工程,确认FPGA能否正常配置和运行,再继续加载高速接口测试工程。

6.3 高速链路调试与误码率测试

SRIO、PCIe、GTX链路调试,我喜欢按“芯片内部回环到板级回环再到系统回环”的顺序做。

先在FPGA端把GTX配置成内部回环,跑PRBS误码测试,确认GTX收发器本身没问题。再通过板上差分走线做回环,确认PCB走线质量。最后把SRIO接到DSP侧,做端到端训练。C6678的SRIO如果端口训练失败,优先查参考时钟、差分对极性和端接电阻。串行链路最常见的问题是差分对极性接反,PCIe和SRIO协议支持极性反转,所以有时候症状很轻,但如果你把两个方向都接反,链路就会一直training失败。

DDR3调试也有个顺序:先用FPGA侧的ILA抓写数据,再读回来比对。如果发现偶发错误,先查DDR3参考电压和时序训练参数。温度变化大的环境里,DDR3训练参数可能会漂移,建议在板卡上留温度传感器接口,方便做温度补偿。

做完整卡调试之后,我个人最受益的一件事,是把所有关键信号测试点都提前放到板边,并且把每个电源轨的实测纹波、每路高速链路的误码率、DDR3能稳跑的频率档位,都记在硬件调试记录表里。这些数据看着琐碎,但一旦板子在使用现场出问题,翻记录永远比重新拆机测试快得多。另外,原理图里每条高速差分对加一个串阻预留位,布完线根据实际信号质量再决定要不要贴,这个小习惯帮我在好几块板上避免了链路ISI超标的返工。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进