拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FPGA上7:1 LVDS解串的XAPP585逻辑实现方案解析

很多做FPGA的家伙都有这么一段经历项目上突然要多接一个LVDS屏或者工业相机一看像素时钟七八十兆数据率四百多兆脑子里第一个念头是调用专用SerDes硬核。然后现实往往很打脸——低端FPGA根本没配串行收发器或者硬核被更重要的接口占光了。这时候你就得回头研究XAPP585这套逻辑实现方案。这份赛灵思老应用笔记核心就讲一件事如何在一片只有普通IO和DCM的FPGA上用一个3.5倍频时钟加两个IDDR2把7:1 LVDS源同步串行数据完整解出来。没有CDR没有GTP/GTX全靠源同步时钟倍频和DDR采样这两个核心技巧。本文把这份文档重新整理一遍把背后的采样数学、相位对齐逻辑、时钟约束和工程坑点全部摊开聊透不管你是第一次接触LVDS解串还是已经调过几版接口都能从里面捞到点实用的东西。1. XAPP585是什么一份被低估的LVDS解串设计指南1.1 应用笔记的定位与适用器件XAPP585全名是《Spartan-3E FPGA中的7:1 LVDS SerDes接收器》当年是为了解决低端FPGA接收LVDS显示接口数据的问题。那个年代LVDS屏幕接口非常流行主控端用一颗DS90CR287A把28位并行RGB信号拆成4对LVDS差分数据线加1对差分时钟线接收端再用一颗DS90CR288A解回来。每对数据线上传7个串行位所以叫7:1 SerDes。但很多低成本方案想把那颗接收芯片省掉直接用FPGA做解串。问题在于Spartan-3E这类器件没有内建的高速串并行转换硬核只能用IO引脚加逻辑资源硬解。XAPP585给出的答案是普通IO 差分输入缓冲 DCM时钟倍频 IDDR2双沿采样四样东西拼出一个可用的7:1解串器。它的设计对象是Spartan-3E/3A系列但方法论的适用面远不止这些老器件。Spartan-6、Artix-7甚至Kintex系列只要你不用自带的ISERDES想自己搭一套解串逻辑XAPP585的采样思想照样能用。1.2 为什么说它是学习7:1 SerDes的最佳入门材料现在很多FPGA教材讲SerDes上来就整PCIe、JESD204B这种万兆级别的东西又是CDR又是CTLE又是DFE新手直接劝退。但XAPP585讲的是另一种更朴素的SerDes形态——源同步接口它不需要从数据流里恢复时钟时钟是发送端随数据一起送过来的。这种接口在现实中大量存在LVDS显示屏、SubLVDS摄像头、ADC/DAC接口、一些专用的串行总线都是源同步或者准源同步架构。学会XAPP585这套方法你真正理解了三件事第一串行解串的本质是采样采样时钟哪里来要么从数据里恢复CDR要么由额外送过来的随路时钟产生。第二DDR双沿采样可以让采样时钟频率只需达到数据率的一半配合位宽重组就能实现任意比例的串并转换。第三高频采样最怕的是相位不对XAPP585给了用DCM动态调相位的思路。这三件事是往后所有高速接口设计的地基。即使日后你切到GTX/GTH硬核去调万兆链路底层要解决的时钟恢复、字对齐、采样裕量问题本质上还是同一套逻辑。所以我一直觉得与其一上来就啃那些动不动跑几十Gbps的协议不如先拿XAPP585练手成本低、逻辑清晰、还能真抓到波形。2. LVDS源同步接口的设计基础从电气特性和时序说起2.1 LVDS的电气参数与差分端接LVDS全称Low Voltage Differential Signaling低压差分信号。它的核心是一个3.5mA的恒流源驱动器电流流过100Ω的差分端接电阻在接收端产生约350mV的差分电压摆幅。工程上常用的几个参数要记牢输出差分摆幅250mV到450mV接收端输入阈值一般在100mV以内就能识别共模电压典型值1.2V范围1.125V到1.375V。由于摆幅小、共模电压稳定LVDS能跑很高的速率同时功耗和电磁干扰都很低。关于端接这是第一个大坑。LVDS作为点对点传输接收端必须接100Ω差分电阻。很多FPGA的高性能Bank支持内部可编程差分端接也就是IBUFDS配上DIFF_TERM属性后芯片内部自动把100Ω电阻接上。但Spartan-3E不行它没有内部端接必须外部在靠近FPGA引脚的位置放一个100Ω电阻。哪怕在现代FPGA上我依然建议外部放端接电阻理由有两个一是内部端接的精度通常在10%外部精密电阻可以做到1%对高速信号的质量有直接影响二是内部端接一旦出了问题你很难用万用表去查外部电阻则一目了然。2.2 7:1源同步的时序关系数据率怎么算源同步接口最典型的特征就是时钟和数据从同一个发送端发出接收端拿这对时钟来同步采样。在7:1 LVDS接口中发送端输出的时钟频率就是像素时钟但每对差分数据线上串行传输7个数据位。打个比方像素时钟是100MHz时每对数据线上的串行数据率就是100MHz × 7 700Mbps一个像素时钟周期内要传7个bit。这7个bit对应一个像素的RGB分量和控制信号。这里要建立的第一个直觉是数据率是像素时钟的7倍但时钟频率仍然是1倍。接收端不能直接拿100MHz时钟去采样700Mbps的数据那样一个时钟周期只能采一个点完全不够用。所以必须对随路时钟做倍频让采样时钟频率跟数据率匹配起来才能把7个bit都采到。真实场景中还有一个概念的区分很容易被搞混。LVDS显示接口虽然叫SerDes但它实际上是源同步并行总线的一种变体——总线的宽度被串行化到了单条差分对上但时钟仍然单独传输所以接收端不需要做CDR只需要做位同步和字同步。理解这个区别比死背参数重要得多。2.3 源同步和CDR的本质区别说到源同步和CDR的区别有个很直观的类比源同步就像你和一个朋友并排走路他每走一步就喊一声“走”你听到喊声就迈脚节奏由他控制你不需要去猜他的步伐。CDR则是他走在前面但不出声你只能通过观察他的背影移动来推测他的步频然后自己调整出和他一样的步伐。放在电路上源同步接收端用随路时钟产生采样时钟数据采样相位相对固定链路设计简单。CDR则要从数据跳变沿中提取时钟信息涉及锁相环锁定、频偏容忍、抖动滤除等一系列问题难度高一个量级。这也是为什么源同步接口能在几百Mbps到几个Gbps的区间内用普通IO就能解而CDR接口必须依赖专用SerDes硬核。XAPP585讲的是前者它把源同步接口的优势发挥到了极致只用DCM产生了采样时钟的倍频没有引入任何CDR逻辑。这也是新手学习SerDes时最容易建立的正确起点——先搞清你的接口到底是什么同步方式再决定方案。3. 7:1解串架构拆解为什么用3.5倍频而不是7倍频3.1 采样数学3.5倍频加DDR采样等于7位数据这是XAPP585最精华的部分也是Document里面写得最简要、但实际工程中最关键的一个数学关系。串行数据率 像素时钟 × 7。如果直接用7倍频的时钟去采样每个串行bit对应一个时钟上升沿采7个bit需要7个时钟周期完全可行。但问题是7倍频时钟在FPGA内部布线压力很大而且需要每个bit都能稳定采中相位要求极其苛刻。XAPP585换了个思路用DDR双沿采样采样时钟只用3.5倍频。也就是说在每个3.5倍频时钟的上升沿采一次、下降沿再采一次一个时钟周期采两个bit。这样做到了7个bit只用了3.5个时钟周期也就是一个像素时钟周期内完成了全部采样。具体数学是这样的像素时钟周期是T_p串行bit周期是T_p/7。3.5倍频时钟周期是2T_p/7刚好是两个bit周期的宽度。在这个时钟的一个周期内上升沿采到一个bit下降沿采到下一个bit两个沿间隔正好等于一个bit周期不多不少。从这个角度看3.5倍频不是随便定的它是7除以2。这样做的好处非常明显采样时钟频率只有数据率的1/2时钟网络上跑的是更低的频率时序收敛更容易对IO和布线的要求都低了一大截。3.2 IDDR2原语与数据重组逻辑有了3.5倍频时钟之后具体采样的工作落到IDDR2上。IDDR2是FPGA里的双沿触发器它在时钟上升沿捕获一个数据下降沿又捕获一个数据一个IDDR2在完整时钟周期内输出两个bit。在7:1方案中7个串行bit分布在3.5个时钟周期里实际可以用两个IDDR2配合完成解串一个IDDR2负责从第0、2、4、6个串行bit采样另一个负责从第1、3、5个串行bit采样。更准确地说由于采样时钟和数据位是1个bit对应一个沿的关系采样结果是分散在两个IDDR2输出端口上的。数据重组逻辑要做的事情就是把这两个IDDR2输出的并行位按照串行发送的顺序重新拼成7位并行数据再同步到像素时钟域输出。这一步在XAPP585里用了寄存器阵列和一个判定逻辑核心思想是以像素时钟为基准在每个像素时钟周期内选中最合适的7个采样点。很多初学者在写这部分时容易把IDDR2的输出顺序搞反。这里有个经验先画一张时间波形图把串行bit的编号标在3.5倍频时钟的各个沿上然后再决定哪个IDDR输出对应哪位波形图画对了逻辑基本不会错。3.3 采样窗口中心对齐的原理采样不是随便找个时钟沿采一下就行必须保证采样点落在数据bit的有效窗口中心附近。LVDS数据的每个bit都有建立时间和保持时间要求如果采样点靠近bit的边缘温度漂移、电压波动都会导致采到错误数据。XAPP585的思路是用DCM调整采样时钟相位把3.5倍频时钟的边沿移动到串行数据的bit中心。由于DDR采样时上升沿和下降沿的间距正好一个bit周期只要把其中一个沿对准某个bit的中心后续所有的沿自然对准后续bit的中心。这个对齐原理有点像调整相机焦距你先转粗调让画面大致清晰再用微调把焦点锁在最锐利的位置。DCM的相位移就是那个微调旋钮通过改变采样时钟相对于数据的相位把采样点精确送到每个bit的中心。实际操作中相位调整是否到位最好的验证方法就是遍历相位值并统计误码率。XAPP585中推荐了一个非常实用的做法从数据发送端发出固定测试图案接收端不断改变DCM相位观察解出来的数据是否和图案一致一致率最高的相位区间就是最佳工作点。关于温度漂移我必须多说一句。不要把采样点调整到刚好对准bit中心的边界处一定要留足裕量。工程上通常选择相位扫描结果的中心位置两侧各留不低于25% bit周期的余量。否则产品从常温跑到高温时钟相位一旦漂移最先出问题的就是这些没有裕量的节点。4. 时钟倍频与采样相位对齐的实操细节4.1 用DCM/PLL产生3.5倍频时钟M/D参数选择在Spartan-3E的XAPP585设计中3.5倍频时钟通过DCM的CLKFX输出产生。CLKFX支持小数倍频核心参数是CLKFX_MULTIPLY和CLKFX_DIVIDE输出频率等于输入时钟乘以乘数再除以除数。要在100MHz像素时钟下拿到350MHz采样时钟乘数设7、除数设2DCM #( .CLKIN_PERIOD(10.0), .CLKFX_MULTIPLY(7), .CLKFX_DIVIDE(2) ) u_dcm ( .CLKIN(clk_pixel_p), .CLKFB(clkfb), .CLKFX(clk_sample_3x5), .LOCKED(dcm_locked) );这里有个容易出错的地方DCM的CLKFX输出频率不是无限可调的每个器件都有允许范围。Spartan-3E的DCM CLKFX上限通常在350MHz左右所以如果你的像素时钟是106MHz7/2倍频后是371MHz很可能超出DCM能力需要重新评估方案。现代FPGA的PLL情况好一些但同样存在VCO频率范围限制。例如在Spartan-6上用PLL产生3.5倍频时PLL内部VCO频率可能达到700MHz到1GHz级别对电源纹波更加敏感。我的一般做法是先用数据手册查出芯片的PLL/DCM允许频率范围再反推像素时钟的上限。如果发现倍频后的时钟超出范围要么降像素时钟要么把数据通道拆成多路要么直接改用ISERDES硬核。这些决策应该在方案阶段就做掉别等板子画完了再冒烟。4.2 相位对齐的三种方法静态、动态扫描、训练模式XAPP585原文主要依赖DCM的固定相位移但在工程实践里我整理出了三种不同等级的相位对齐方法按需选用。第一种是静态相位设置。在布局布线前经验性地把DCM的PHASE_SHIFT设到一个猜测值然后跑板子试。这个方法最省事但对PCB布线延迟、温度变化完全没有适应能力只能用在速率很低的场合。第二种是动态相位扫描。DCM的PSEN、PSINCDEC、PSCLK引脚支持运行时动态调整相位。利用这个特性可以在系统上电后让FPGA自动扫描一组相位值对每个相位值采样一段已知的测试图案选出最优相位并锁定。这种方法是我在量产项目中最推荐的模式它能补偿板级差异把每块板的采样点都校准到bit中心。第三种是训练序列自适应。如果通信协议定义了同步训练码可以在训练阶段发送已知序列接收端根据训练结果实时调整相位。这等于把相位对齐做成了闭环控制系统但实现复杂度最高一般只用在速率很高的光纤通道或SerDes链路上7:1 LVDS场景用动态扫描就已经足够了。4.3 时钟分配与全局时钟网络要点采样时钟产生之后分配网络同样不能马虎。XAPP585强调采样时钟必须走全局时钟网络也就是BUFG后的全局时钟树这样才能保证到达各个IDDR2的时钟偏斜在可控范围内。这里会遇到一个实际约束全局时钟网络数量有限如果项目中已经用了好几个BUFG要确认采样时钟能否申请到独立的全局时钟网络。申请不到的话也可以用时钟使能的方式把采样逻辑挂在另一个全局时钟下但那样会增加时序分析的复杂度不建议新手尝试。另外DCM的CLKFB反馈脚要正确连接。XAPP585标准做法是把CLK0或CLK2X反馈给DCM通过内部反馈补偿时钟网络延迟。反馈路径直接影响采样时钟的绝对相位如果反馈时钟接错位置后面的相位扫描怎么调都调不出好的窗口。采样时钟和数据输入路径还有一个隐蔽的问题IBUFDS输出的数据和DCM输出的采样时钟两者路径延迟不一致会导致固定偏差。XAPP585里的DCM反馈设计虽然能补偿部分偏差但在布局时仍然要尽量把数据输入IO和DCM放近同时约束路径上不要插入额外的组合逻辑。5. 从XAPP585到现代FPGAISERDES实现与对比5.1 逻辑解串与硬核解串的差异把XAPP585的逻辑解串方案和现代FPGA内建的ISERDES硬核放在一起对比能看出很多门道。ISERDES本质上是一个硬件化了的1:N解串器它自带采样时钟分频、比特滑动、数据对齐功能不需要你在逻辑代码里手工拼位。以Spartan-6的ISERDES2为例一个原语就能完成1:7的解串操作配合一个BITSLIP控制端口还能自动调整字边界。从资源消耗上看ISERDES方案节省了大量寄存器逻辑代码大幅简化时序裕量也更充足。但硬核有两个限制第一是数量有限每个IOBank只有特定数量的ISERDES规划引脚的时候必须严格遵循Bank规则第二是位置固定ISERDES必须附着在专用IO上不能像逻辑解串那样通过普通逻辑单元任意放置。这也是XAPP585至今没有被淘汰的原因。很多工业级小批量项目FPGA选型已经被其他资源决定剩下能用的IO刚好够一个LVDS接口但那个Bank没有ISERDES硬核或者数量不够。这时候XAPP585的逻辑解串就是一个合理的兜底方案。5.2 现代FPGA上实现1:7解串的推荐做法如果你用的是Spartan-6、Artix-7或者更新器件我建议优先使用ISE/Vivado的SelectIO IP核里面自带7:1 LVDS接收器的模板。IP核底层就是ISERDES向导里配置一下数据位宽、时钟关系、BITSLIP使能就能生成一个经过验证的解串模块。IP核生成之后仍然要关注采样相位的调整。ISERDES同样需要采样时钟对齐数据窗口。工程师常犯的错误是以为用了硬核就不需要管相位了结果板子回来照样采不到数据。ISERDES只是把解串逻辑固化在了硅片上采样时钟和数据之间的相位关系还得你在约束里定义清楚。Vivado里通常的做法是利用IDELAYEYE原语做数据眼追踪或者通过约束中的输入端到寄存器的延迟来指定相位关系。相比老DCM的粗粒度相位调整IDELAY能做到ps级别的微调对齐精度高了一个数量级。不过坦白说如果你只是解7:1 LVDS这种几百Mbps的接口ISERDES的精细延迟调节往往是杀鸡用牛刀。只要PCB布局合理、时钟和数据链路等长控制到位固定相位约束就足够稳定了。5.3 与其他LVDS解串方案的对比除了用FPGA内部逻辑做解串市场上还有一类专门的LVDS解串器芯片典型代表就是DS90CR288A这一类8位总线LVDS解串器。这类芯片的好处是一颗搞定输出完整的并行RGB信号接口时序简单可靠性高几乎不需要调试。那么问题来了什么时候用FPGA逻辑解串什么时候用外部芯片我的经验是这样的。如果项目只有一路LVDS输入且板上空间紧张、成本敏感那么用FPGA逻辑解串是划算的。如果项目有多路LVDS输入或者接口速率已经超过FPGA普通IO的能力上限那么购买专用解串芯片更稳妥。还有一个折中方案FPGA自带的ISERDES硬核它介于两者之间——有一点调试工作量但省了外部芯片性能也足够。成本差异也要算细账。外部解串器芯片的采购成本加上PCB面积成本在量大的项目中相当可观。FPGA逻辑解串的隐性成本则是研发调试时间特别是相位对齐和数据对齐这一部分开发周期可能要多个一两周。如果项目量产规模大摊薄后的开发成本被稀释FPGA方案的优势就出来了。6. 实战经验与问题排查我在项目中踩过的坑6.1 约束文件与引脚规划要点LVDS 7:1解串工程的成败通常在写UCF或XDC约束的时候就决定了后期的代码反而只是体力活。第一引脚位置必须满足器件手册的Bank规则。所有7个数据通道和1个时钟通道尽量放在同一个Bank内并确保这个Bank的VCCO电压和LVDS电平标准匹配。跨Bank布局会对时钟偏斜控制和区域约束造成很大麻烦。第二差分引脚对必须使用器件手册指定的正负引脚号不能随意指定。很多新手工程编译报错就是因为正负引脚没有配对。第三区域约束要尽早加。使用AREA_GROUP或Pblock把IDDR2、数据重组逻辑、DCM锁定在同一片区域内可以显著缩短布局布线后的路径延迟对采样时序非常有利。第四也是最容易被忽略的对源同步接口的外部建立保持时间要如实约束。7:1 LVDS的发送端芯片手册里会给出时钟到数据的输出偏斜范围这个偏斜要写进XDC约束中工具才能准确计算采样裕量。如果偷懒不写工具默认认为数据和时钟是理想的同源同步关系实际板子上必然翻车。6.2 常见故障现象与排查思路速查表在实际调试中我总结了一份LVDS解串故障排查表遇到问题直接对照定位效率高很多。故障现象可能原因排查动作完全无数据输出差分端接缺失、引脚映射错误、电平标准不匹配示波器差分探头测输入波形确认摆幅和共模检查IBUFDS配置数据偶发错位采样相位偏离bit中心、DCM反馈路径有问题用ChipScope观察采样输出动态扫描DCM相位找误码最低点上电正常但温度升高后花屏采样裕量不足温度漂移后相位越界重新做相位扫描把工作点设在扫描窗口正中颜色分量错乱7位重组顺序错误字节序/位序不匹配核对IDDR2输出到并行数据的映射对照发送端协议时序间歇性丢行/丢帧字边界未锁定缺少数据对齐机制检查DE信号位置确认起始位判断逻辑必要时增加训练图案校准时钟无法锁定DCM/PLL的M/D参数超出范围查器件手册确认CLKFX或者VCO频率范围改动乘除数比例这里要特别说明一下“颜色错乱”这类问题。LVDS发送端的7个串行bit是有既定顺序的比如bit0到bit6分别对应的RGB分量是协议固定的。如果接收端重组顺序不对整幅画面的颜色就是乱的。我遇到过有人在这上面调了一整天最后发现只是IDDR2时钟极性选反了。还有一个小坑LVDS数据通道的标准编号常常从0开始但有些发送芯片从1开始。引脚规划前先查发送端手册的bit编号规则别想当然。6.3 信号完整性相关的几个注意点LVDS拆开看不过是个模拟接口很多数字工程师栽在它身上就是因为忽略了模拟域的信号质量。第一100Ω端接电阻必须靠近接收端引脚走线尽量短。如果端接电阻放得远残桩效应会让信号反射眼图质量直线下降。第二差分对内等长非常重要。7:1 LVDS的时钟频率本身不高但数据率已经到几百Mbps一对差分线内部如果走线长度差超过几个毫米就会在接收端产生共模噪声和时序偏差。我一般要求差分对内等长控制在5mil以内对与对之间控制在50mil以内。第三如果前端信号源输出的是HSCL或者其它类似LVDS的电平标准不能直接简单并联处理。HSCL摆幅更小共模范围和LVDS也有差异直接用LVDS输入缓冲可能采不出有效电平。这种情况需要加交流耦合电容或者用专门的LVDS转接缓冲芯片做电平适配这就是一些方案里会提到的自动电平调整电路的作用。第四电源质量同样会影响采样稳定性。FPGA的Bank供电要加足够的去耦电容DCM/PLL的模拟电源引脚尤其需要干净。之前遇到过一个案例采样偶发误码一直查不出原因最后发现是DCM供电引脚旁边缺了几颗电容补上之后就稳定了。最后再分享一个实用小技巧如果你第一次调XAPP585方案不要一上来就直接用真实数据源调试最好先用带测试图案的LVDS发送端。把发送端配置成输出固定图案比如0x55、0xAA或者递增计数然后接收端用ChipScope抓解串输出对着图案比对。这样可以把时钟相位对齐和数据对齐两个问题分开排查先确保每个bit都能采中再调整字边界和重组逻辑。两步分开走比盲目调参高效得多。这个思路同样适用于其他接口调试。高速接口的问题千奇百怪但归根结底无非是采样点不对、字节序不对、信号质量不对。能把这三种可能性隔离出来调试就已经成功了一半。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门