ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于C6678与XC7V690T的6U VPX信号处理板设计:SRIO、电源、时钟与DDR3实战

基于C6678与XC7V690T的6U VPX信号处理板设计:SRIO、电源、时钟与DDR3实战 1. 从一块6U VPX板卡说起为什么C6678加XC7V690T是信号处理平台的经典组合第一次接触6U VPX信号处理卡的人往往会被板卡上密密麻麻的器件和高速连接器吓到。但如果你把这块板子拆开看核心其实就两大部分一颗负责重计算的DSP一颗负责高吞吐调度的FPGA。我手里这块板子用的是TI的TMS320C6678搭配Xilinx的XC7V690T这个组合在雷达、电子对抗、软件无线电、医疗成像这类场景里出现频率极高属于那种你绕不开、早晚要碰的经典架构。先说这块板卡到底解决什么问题。6U VPX是标准尺寸比3U大一圈能塞下更多计算资源和散热结构。信号处理卡的本质工作是把前端采集到的高速数据接进来做滤波、FFT、脉压、波束形成、解调这类运算再把结果通过背板送到主控或者存储单元。这个过程中FPGA擅长的是流水线式的、位宽固定的、延迟敏感的处理比如多通道AD数据的实时预处理、高速接口协议解析、数据搬运而DSP擅长的是浮点密集、算法复杂、需要灵活调度的运算比如矩阵求逆、自适应滤波、复杂的解调算法。两者分工各干各擅长的事。为什么偏偏是C6678和XC7V690TC6678是八核C66x定点/浮点DSP单核主频能到1.25GHz八核加起来定点算力能到320GMAC、浮点160GFLOP这个算力放在今天依然能打。更关键的是它自带SRIO、PCIe、HyperLink、千兆网这些高速接口和FPGA、背板通信非常方便。XC7V690T属于Virtex-7系列逻辑资源、DSP Slice、Block RAM都很充裕尤其是它支持GTH高速收发器单通道能跑到10Gbps以上用来对接背板的SRIO或者Aurora链路非常合适。这两颗芯片放在一块6U板上基本能覆盖中高端信号处理平台的需求。我见过不少团队在这个架构上踩坑问题往往不出在算法本身而是出在两边怎么把数据高效倒腾过去以及电源和时钟怎么保证稳定这些工程细节上。所以这篇内容我不打算泛泛而谈而是围绕这块板卡的设计原理图把DSP和FPGA的接口设计、电源树、时钟树、DDR3布局、VPX连接器定义这些真正决定板子能不能跑起来的东西讲透。如果你正在做类似的项目或者准备入门VPX信号处理板设计这些内容应该能帮你少走几个月弯路。2. C6678与XC7V690T之间的数据通道SRIO、HyperLink还是EMIF2.1 三种互连方式的本质区别与选型逻辑DSP和FPGA之间的数据通道设计是整块板卡最核心的部分之一。选错了接口后面算法再优化也救不回来。C6678和XC7V690T之间常见的互连方式有三种SRIO、HyperLink和EMIF或者叫UPP/SPI这类低速接口。这三种不是随便挑的各自有明确的适用场景。SRIOSerial RapidIO是这块板子上最常用的高速互连方案。C6678自带四个SRIO lane每个lane能跑到5Gbps可以配置成1x、2x、4x模式。XC7V690T这边需要用SRIO IP核来实现Endpoint或者Switch功能。SRIO的好处是协议开销小、延迟低、支持DMA传输非常适合FPGA把预处理完的数据批量推给DSP。实测下来4x模式下理论带宽20Gbps实际有效吞吐能到14Gbps左右对于大多数信号处理场景够用了。HyperLink是TI自家的一种高速互连C6678上有一个HyperLink接口理论带宽能到50Gbps4 lane。但问题是FPGA这边没有原生HyperLink支持需要用SelectIO或者GTH去模拟实现起来比较麻烦而且Xilinx的IP支持不如SRIO成熟。所以除非你的项目对带宽有极端需求否则一般不会优先选HyperLink。EMIFExternal Memory Interface是并行总线C6678的EMIF16可以接FPGA的普通IO做16位或32位并行通信。这种方式实现简单但带宽有限一般只有几百MB/s适合传控制字、状态信息、低速数据。如果你用EMIF传大量采样数据那基本是自找麻烦。我的建议是主数据通道用SRIO控制通道用EMIF或者SPI两者配合使用。SRIO负责大数据块搬运EMIF负责寄存器配置和状态回读。这样分工明确调试起来也清晰。2.2 SRIO链路的具体设计与实测注意事项SRIO链路设计有几个细节特别容易出问题。首先是参考时钟C6678的SRIO参考时钟一般是125MHz或者156.25MHzXC7V690T的GTH参考时钟也要匹配。如果两边时钟不同源就要考虑用CDR恢复或者加抖动衰减器。我一般建议从同一个时钟芯片出两路同源时钟分别给DSP和FPGA这样最稳。其次是lane的映射和极性。SRIO的lane顺序和极性在PCB走线时可能因为布线方便而交换这时候需要在IP核配置里做lane reversal和polarity inversion。这个坑我踩过板子回来发现链路起不来查了半天才发现是lane顺序反了在软件里改一下配置就好了但前提是你得知道有这个选项。第三是SRIO的DMA配置。C6678这边要用SRIO的DMA通道来搬数据需要配置描述符、队列、中断。FPGA这边要用SRIO IP的AXI Stream或者AXI Memory Mapped接口。两边速率要匹配否则会出现溢出或者欠载。我一般会在FPGA里加一级FIFO做缓冲深度至少能扛住几毫秒的数据突发。实测中还有一个经验SRIO链路建立后不要急着跑满带宽先用小数据包做回环测试确认链路稳定后再逐步加大数据量。我见过有人一上来就跑满速结果误码率飙升查了半天以为是信号完整性问题最后发现是DSP端DMA描述符配置错了。2.3 EMIF与GPIO辅助通道的工程价值虽然SRIO是主通道但EMIF和GPIO的作用不能忽视。EMIF16可以配置成16位并行接口接FPGA的普通IO用来传控制命令和状态字。比如DSP要告诉FPGA开始采集、切换通道、复位这些命令用EMIF传就非常合适延迟低、实现简单。GPIO则用来传中断和握手信号。比如FPGA采集完一帧数据拉一个GPIO中断通知DSP来取DSP处理完一帧拉一个GPIO告诉FPGA可以发下一帧。这种握手方式虽然原始但非常可靠调试的时候用示波器一抓就能看到时序比查SRIO协议栈方便多了。我一般会在原理图里预留至少8个GPIO做双向握手和状态指示其中两个专门做中断两个做复位剩下的做状态灯或者备用。这些GPIO在调试阶段的价值极高等系统稳定了可以复用做其他功能。3. 电源树设计C6678和XC7V690T到底要吃多少电3.1 两颗芯片的供电需求拆解C6678和XC7V690T都是耗电大户电源设计如果做不好板子要么起不来要么跑着跑着就复位。先说C6678它的核心电压CVDD是0.9V到1.1V可调典型1.0V电流能到10A以上DDR3接口电压1.5V电流3A左右还有1.8V的IO电压、1.2V的SRIO电压等。XC7V690T这边核心电压VCCINT是1.0V电流能到15A甚至更高VCCAUX是1.8VVCCBRAM是1.0VGTH收发器的供电更复杂有1.0V、1.2V、1.8V多档。把这些加起来一块6U VPX板卡的总功耗轻松超过60W满载可能到80W以上。所以电源树的设计原则是分级转换、就近去耦、监控复位。3.2 电源树的分级与选型我一般把电源树分成三级。第一级是从VPX背板的12V或者5V输入经过热插拔控制器和EMI滤波变成中间总线电压比如5V或者3.3V。第二级是从中间总线转到各芯片需要的电压比如0.9V、1.0V、1.2V、1.5V、1.8V、2.5V、3.3V。第三级是各芯片附近的LDO或者小电流DC-DC做局部稳压和噪声隔离。选型上大电流的Core电压一般用多相DC-DC控制器加DrMOS比如TI的TPS40425或者Infineon的IR38060系列。这些控制器支持PMBus可以实时读电流、电压、温度调试的时候非常有用。小电流的AUX电压可以用LDO比如TPS7A系列噪声低适合给PLL和收发器供电。这里有个经验C6678的CVDD和XC7V690T的VCCINT最好分开供电不要共用一路DC-DC。虽然理论上可以共用但两颗芯片的负载特性不同DSP的电流变化快FPGA的电流变化相对平缓共用会导致互相干扰。分开供电虽然多花点钱但稳定性提升明显。3.3 上电时序与监控复位上电时序是另一个容易翻车的地方。C6678要求CVDD先上然后才是1.8V和1.5VXC7V690T要求VCCINT先上然后VCCAUX最后VCCBRAM。如果时序错了芯片可能无法正常初始化甚至损坏。所以电源树里必须有时序控制可以用电源管理芯片的PGOOD信号级联或者用CPLD/FPGA做时序控制。我一般会在原理图里加一颗专门的电源监控芯片比如TI的UCD9090或者ADI的ADM1266它可以同时监控多路电压做时序控制和复位输出。这颗芯片通过PMBus和主控通信调试的时候可以实时看每路电压的状态非常方便。还有一个细节每路电源的输出电容要算够。C6678的Core电压瞬态响应要求高如果电容不够负载突变时电压会跌落导致芯片复位。我一般会在Core电压上放至少1000uF的陶瓷电容加钽电容组合具体数值要根据DC-DC的环路带宽和负载阶跃来算。4. 时钟树JESD204B、SRIO、DDR3的时钟怎么分配4.1 时钟需求梳理这块板子上的时钟需求非常复杂。C6678需要100MHz的参考时钟给PLLDDR3需要400MHz或者533MHz的差分时钟SRIO需要125MHz或者156.25MHz的参考时钟。XC7V690T需要200MHz的系统时钟GTH需要125MHz或者156.25MHz的参考时钟DDR3也需要独立的时钟。如果板子上还有ADC/DAC那还需要JESD204B的Device Clock和Sysref。这么多时钟如果都用独立晶振板子面积和成本都受不了。所以一般用一颗高性能时钟发生器比如TI的LMK04828或者ADI的HMC7044它可以出多路低抖动时钟支持JESD204B的Sysref生成还能做时钟同步和延时调整。4.2 时钟芯片的配置与抖动要求LMK04828这颗芯片我用了很多次它有两级PLL第一级锁定外部VCXO或者晶振第二级生成各路输出。配置的时候要注意每路输出的分频比、驱动电平、抖动要求。SRIO和GTH的参考时钟对抖动要求高一般要求RMS抖动小于1ps所以要用高性能的VCXO做参考比如100MHz的Crystek或者SiTime的VCXO。DDR3的时钟要求相对宽松但也要注意走线匹配。我一般会把DDR3时钟单独从时钟芯片出一路不要和SRIO共用避免相互干扰。JESD204B的Sysref要求和其他时钟有确定的相位关系LMK04828支持Sysref生成和延时调整配置的时候要仔细算相位。这个如果搞错了ADC/DAC和FPGA之间的同步就会出问题数据会错位。4.3 时钟树的布局与去耦时钟芯片的布局很关键。我一般把它放在板子中间靠近DSP和FPGA这样走线短干扰小。时钟输出要尽量走差分阻抗控制100欧姆长度匹配。每路时钟输出旁边要放去耦电容一般0.1uF加0.01uF组合靠近芯片引脚。还有一个经验时钟芯片的电源要特别干净。我一般用独立的LDO给时钟芯片供电比如TPS7A4700噪声低PSRR高。如果和数字电源共用时钟抖动会变大影响SRIO和GTH的误码率。5. DDR3布局与信号完整性C6678和FPGA各自的存储子系统5.1 C6678的DDR3接口设计要点C6678有一个64位的DDR3接口支持DDR3-1600理论带宽12.8GB/s。这个接口的布局非常讲究因为速率高信号完整性如果做不好要么跑不到1600要么误码率高。首先是拓扑结构。C6678的DDR3控制器支持fly-by拓扑地址、命令、控制信号走fly-by数据信号点对点。Fly-by的好处是地址信号只需要一个终端电阻布线简单但需要做读写平衡write leveling和地址延迟校准。C6678支持这些校准但PCB走线要保证地址信号到每颗DDR3的延迟差在允许范围内。其次是阻抗和线长匹配。DDR3的单端信号阻抗一般控制50欧姆差分时钟100欧姆。数据信号每组8位加一个DQS差分对组内走线长度差要控制在5mil以内组间差控制在100mil以内。地址信号fly-by的走线要尽量短分支要短。去耦电容的摆放也很关键。每颗DDR3下面要放0.1uF和0.01uF的电容VREF要单独去耦一般用0.1uF加1uF组合。5.2 XC7V690T的DDR3接口设计差异XC7V690T的DDR3接口和C6678类似但也有一些差异。Xilinx的MIGMemory Interface GeneratorIP核支持DDR3配置的时候要选对芯片型号、速率、位宽。XC7V690T一般挂两颗或者四颗DDR3位宽32位或者64位。Xilinx的DDR3接口对时序要求更严格因为FPGA的IO延迟可调但需要做眼图扫描来确定最佳延迟。我一般会在MIG里开启读写校准然后实测眼图根据眼图调整延迟参数。还有一个差异Xilinx的DDR3接口支持内部VREF不需要外部VREF电路这简化了设计。但内部VREF的精度不如外部如果速率跑到1600以上建议还是用外部VREF。5.3 实测中的信号完整性排查经验DDR3调试的时候最常见的问题是读写误码。排查步骤一般是先降速跑比如从1600降到800如果降速能跑说明是时序问题然后看眼图如果眼图闭合说明是信号完整性问题最后查电源和地去耦如果电源纹波大也会导致误码。我遇到过一次DDR3跑到1600就误码降到1333就正常。查了半天发现是地址信号的fly-by终端电阻位置不对应该放在最远端的DDR3后面结果放在了中间导致反射。改板后问题解决。6. VPX连接器定义与背板接口6U板卡怎么和机箱对话6.1 VPX标准连接器的引脚分配6U VPX板卡一般用两个或者三个VPX连接器常见的是P0、P1、P2。P0是电源和系统信号P1和P2是高速差分信号和用户IO。VPX连接器有7排每排有若干针支持差分对和单端信号混合。P0上一般定义12V、5V、3.3V电源还有复位、时钟、地理地址等系统信号。P1和P2上定义SRIO、PCIe、千兆网、Aurora等高速链路。具体引脚定义要看你的背板设计VPX标准给了参考定义但实际项目往往根据需求调整。我一般会在原理图里把P1和P2的差分对分配给SRIO和PCIe留几对给千兆网和备用。P0的电源引脚要算够电流12V一般要能过10A以上5V和3.3V也要留余量。6.2 高速差分对的走线要求VPX连接器到DSP和FPGA的高速差分对走线非常关键。SRIO和PCIe的速率都在5Gbps以上走线要控制阻抗100欧姆长度匹配过孔要尽量少。我一般要求差分对走内层参考完整地平面过孔不超过两个。还有一个细节VPX连接器的引脚定义要和背板匹配。如果背板是标准VPX那引脚定义要符合标准如果是自定义背板那要提前和背板设计方确认。我见过有人板子做回来发现引脚定义和背板反了只能飞线非常麻烦。6.3 背板通信的调试经验背板通信调试的时候我一般先用低速链路测试比如千兆网或者低速SRIO确认物理链路通了再逐步升速。SRIO链路建立后用DSP的SRIO调试工具读链路状态看误码率。如果误码率高先查参考时钟再查走线最后查连接器。还有一个经验VPX连接器的插拔次数有限调试的时候尽量用延长板或者测试点不要频繁插拔板卡。我见过有人调试的时候反复插拔把连接器针脚弄弯了导致接触不良。7. 原理图设计中的几个关键细节与避坑清单7.1 JTAG与调试接口的预留C6678和XC7V690T都需要JTAG调试接口。C6678的JTAG是14针XC7V690T的JTAG是14针或者20针。我一般会在板子上留两个独立的JTAG座或者用一个多路复用器切换。调试的时候DSP和FPGA可以分别连仿真器互不干扰。还有一个细节JTAG信号要加ESD保护因为调试的时候经常插拔容易静电损坏。我一般用TVS二极管做保护比如SRV05-4。7.2 复位电路与看门狗复位电路要保证上电复位可靠还要支持手动复位和看门狗复位。我一般用一颗复位芯片比如TPS3808它支持上电复位、手动复位、看门狗输入。看门狗的输出接到DSP和FPGA的复位引脚如果程序跑飞看门狗超时后会复位整个系统。C6678的复位有上电复位、热复位、软复位原理图里要把这些复位信号都接好。XC7V690T的复位相对简单但也要注意复位脉冲宽度要够。7.3 温度监控与散热设计6U VPX板卡的散热是个大问题。C6678和XC7V690T的功耗加起来几十瓦如果散热不好芯片会降频甚至损坏。我一般会在DSP和FPGA旁边放温度传感器比如TMP461或者LM75通过I2C读温度。如果温度超过阈值软件可以降频或者报警。散热设计上6U VPX板卡一般用冷板或者风冷。冷板的话芯片和冷板之间要加导热垫或者导热硅脂厚度要控制好太厚热阻大太薄接触不好。风冷的话要保证风道畅通散热片面积够大。7.4 原理图检查清单最后分享一个我常用的原理图检查清单每次投板前都会过一遍电源树每路电压的电流够不够时序对不对去耦电容够不够时钟树每路时钟的频率对不对抖动够不够参考时钟同源吗高速接口SRIO、PCIe、DDR3的走线阻抗、长度匹配、参考平面对不对复位上电复位、手动复位、看门狗复位都接了吗JTAG调试接口预留了吗ESD保护加了吗连接器VPX引脚定义和背板匹配吗电源引脚电流够吗温度温度传感器放了吗散热方案定了吗这个清单看起来简单但每次都能查出几个问题。我见过太多板子因为电源时序不对或者DDR3走线不匹配而返工浪费几个月时间。所以原理图阶段多花几天检查比投板后飞线强得多。8. 从原理图到实测这块板卡跑起来之后我学到的几件事板子回来之后调试过程比原理图设计更考验人。我一般按这个顺序推进先测电源每路电压都量一遍确认纹波和时序然后测时钟用示波器或者频谱仪看频率和抖动接着连JTAG看DSP和FPGA能不能识别最后跑DDR3和SRIO逐步升速。实测中我学到几个教训。第一电源纹波比想象中影响大。有一次DDR3跑1600误码查了半天信号完整性最后发现是Core电压纹波太大换了电容就好了。第二SRIO链路建立需要耐心有时候要反复复位几次才能连上不要急着改代码先确认硬件没问题。第三温度对高速链路影响明显板子冷的时候SRIO能跑满速热了之后误码率上升所以散热一定要做好。还有一个经验调试的时候一定要有备份板。我见过有人只有一块板子调试的时候不小心烧了项目直接停摆。所以投板的时候至少做两块一块调试一块备用。这块板卡的设计和调试过程让我对VPX信号处理平台有了更深的理解。C6678加XC7V690T这个组合虽然经典但要把性能跑满电源、时钟、DDR3、SRIO、VPX接口每一个环节都不能掉链子。希望这些经验能帮到正在做类似项目的朋友少踩几个坑早点把板子跑起来。
返回列表