ARTICLE DETAIL

资讯详情

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

FPGA LVDS调试实战:SelectIO、bitslip与IDELAY时序对齐

FPGA LVDS调试实战:SelectIO、bitslip与IDELAY时序对齐 1. 为什么LVDS调试值得单独拎出来讲LVDSLow-Voltage Differential Signaling在FPGA项目里出现的频率极高尤其是涉及图像采集、高速ADC数据回传、长距离板间通信的场景。很多新手第一次接触LVDS往往是在摄像头模组或者显示屏接口上——比如3路RGB接口转LVDS、MIPI转LVDS这类需求背后都绕不开LVDS的收发调试。但LVDS调试有个特点硬件上看起来只是几对差分线软件上看起来只是几个IO引脚可一旦跑起来不亮、花屏、数据错位排查起来就非常头疼。因为它不像SPI、I2C那样低速容错LVDS的时序窗口很窄采样点偏一点数据就全乱。我做过几个带LVDS接口的FPGA项目踩过的坑包括差分对极性接反、bitslip没做、时钟相位不对、SelectIO的IDELAY没调、PCB走线不等长导致眼图闭合。这些问题在实验室常温下可能勉强能跑一到现场温度变化就挂。所以LVDS调试不是“接上线就能通”的事它需要一套系统的方法论。这篇内容适合两类人一是刚入门FPGA、需要调LVDS接口的工程师二是已经能跑通低速接口但遇到LVDS数据错位、花屏、不稳定问题的开发者。我会从设计思路、SelectIO原语使用、bitslip机制、IDELAY校准、Verilog代码实现、常见问题排查几个维度展开尽量把每个“为什么”讲清楚。提示LVDS调试的核心不是“写代码”而是“对齐时序”。代码只是手段理解采样窗口和位对齐才是目的。2. 整体设计思路与方案选型2.1 LVDS接收的基本链路一个典型的FPGA LVDS接收链路包括差分输入缓冲、串并转换ISERDES、位对齐bitslip、字对齐word align、数据缓存FIFO。发送链路则相反并行数据、并串转换OSERDES、差分输出驱动。在Xilinx 7系列及以上的FPGA中这些功能大多由SelectIO资源实现。SelectIO包含ILOGIC、OLOGIC、ISERDES、OSERDES、IDELAY、ODELAY等原语。Intel FPGA对应的资源叫LVDS SERDESAltera的文档里也有类似机制。为什么用SelectIO而不是自己写逻辑因为LVDS速率通常在几百Mbps到1Gbps以上普通FPGA逻辑根本跑不到这个频率。必须用专用的SerDes硬核配合IDELAY做精细相位调整。2.2 时钟方案的选择LVDS接收通常有两种时钟方案一是随路时钟source synchronous即数据伴随一个时钟对一起传输二是系统时钟system synchronous即收发共用同一个参考时钟。随路时钟更常见因为长距离传输时时钟和数据走线延迟接近能跟踪PVT变化。但随路时钟进入FPGA后需要经过BUFIO/BUFR或ISERDES的CLK输入这里就涉及时钟域的处理。我一般推荐数据用ISERDES采样时钟用BUFIO驱动ISERDES的CLK同时用BUFR分频后给逻辑使用。这样能保证采样时钟和逻辑时钟同源减少跨时钟域问题。2.3 bitslip的必要性LVDS串行数据进入ISERDES后会先做1:8或1:4的串并转换。但ISERDES不知道哪一位是字的边界所以输出的8位数据可能是错位的。bitslip就是用来滑动这个边界直到找到正确的对齐位置。没有bitslip数据永远是乱的。很多新手调LVDS时看到数据在跳但不对第一反应是“时序不对”其实往往是bitslip没做或者做错了。2.4 IDELAY的作用IDELAY用于调整输入数据的延迟让采样点落在数据眼图的中心。LVDS的眼图通常很窄尤其是PCB走线不等长时采样点偏一点就误码。IDELAY可以以78ps左右的步进调整延迟配合眼图扫描找到最佳采样点。在7系列FPGA中IDELAY有31个tap每个tap约78ps具体值取决于参考时钟。通过IDELAYE2原语可以动态调整。2.5 方案对比方案优点缺点适用场景纯逻辑采样简单速率低不稳定100MbpsISERDESbitslip速率高可对齐需要理解原语200Mbps~1GbpsISERDESIDELAYbitslip采样点可调稳定调试复杂500Mbps或长距离使用MIPI/LVDS IP核省事灵活性差可能收费标准协议我一般选第三种因为可控性最强出了问题能定位到具体环节。3. 核心细节解析与实操要点3.1 ISERDES原语配置ISERDESE2是7系列FPGA的串并转换原语。关键参数包括DATA_RATE设为“DDR”或“SDR”。LVDS通常是DDR。DATA_WIDTH设为4、6、8、10、14。常用8。INTERFACE_TYPE设为“NETWORKING”或“MEMORY”。LVDS用NETWORKING。IOBDELAY设为“IFD”或“BOTH”表示使用IDELAY。一个典型的ISERDESE2例化如下ISERDESE2 #( .DATA_RATE(DDR), .DATA_WIDTH(8), .INTERFACE_TYPE(NETWORKING), .IOBDELAY(IFD), .NUM_CE(1), .SERDES_MODE(MASTER) ) iserdes_master ( .Q1(q[0]), .Q2(q[1]), .Q3(q[2]), .Q4(q[3]), .Q5(q[4]), .Q6(q[5]), .Q7(q[6]), .Q8(q[7]), .SHIFTIN1(), .SHIFTIN2(), .SHIFTOUT1(), .SHIFTOUT2(), .BITSLIP(bitslip), .CE1(1b1), .CE2(1b1), .CLK(clk_serdes), .CLKB(~clk_serdes), .CLKDIV(clk_div), .D(d_in), .DDLY(d_delay), .RST(rst), .OCLK(), .OFB() );注意如果是1:8 DDR模式需要两个ISERDES级联MASTER和SLAVE因为单个ISERDES最多支持1:8 SDR或1:4 DDR。级联时SHIFTIN/SHIFTOUT要连起来。3.2 bitslip机制详解bitslip的作用是滑动串并转换的边界。每次bitslip脉冲ISERDES的输出会左移一位或右移取决于模式。对于1:8 DDR模式通常需要最多7次bitslip才能找到正确对齐。怎么知道对齐了通常靠训练序列。比如发送端发送固定的同步字如0x55或0xAA接收端不断bitslip直到收到同步字。always (posedge clk_div) begin if (rst) begin bitslip 0; state SEARCH; end else begin case (state) SEARCH: begin if (q 8h55) begin state LOCKED; end else begin bitslip 1; state WAIT; end end WAIT: begin bitslip 0; state SEARCH; end LOCKED: begin // 正常接收 end endcase end end注意bitslip脉冲不能连续给两次之间至少间隔一个CLKDIV周期否则ISERDES可能来不及响应。3.3 IDELAY校准IDELAYE2的配置IDELAYE2 #( .IDELAY_TYPE(VAR_LOAD), .IDELAY_VALUE(0), .REFCLK_FREQUENCY(200.0), .DELAY_SRC(IDATAIN) ) idelay_inst ( .IDATAIN(d_in), .DATAOUT(d_delay), .CNTVALUEOUT(cnt_out), .CNTVALUEIN(cnt_in), .CE(ce), .INC(inc), .LD(ld), .C(clk), .REGRST(rst), .CINVCTRL(1b0), .LDPIPEEN(1b0) );校准方法发送端发送已知图案如PRBS接收端扫描IDELAY的31个tap记录每个tap的误码率找到误码率最低的tap。通常眼图中心在误码率最低点附近。我一般会写一个简单的扫描状态机自动找到最佳tap并锁定。3.4 时钟域处理ISERDES输出的数据是CLKDIV域逻辑处理也是CLKDIV域所以不需要跨时钟域。但bitslip控制信号需要同步到CLKDIV域。如果数据要送到其他时钟域如系统时钟需要用异步FIFO。FIFO的深度取决于数据速率和时钟频率差。3.5 PCB走线要求LVDS差分对要求等长误差通常控制在5mil以内。差分阻抗100欧姆。走线尽量短避免过孔。如果走线不等长IDELAY可以补偿一部分但补偿范围有限31个tap约2.4ns。提示PCB设计阶段就要注意LVDS走线不要等调试时才发现走线差太多IDELAY补不回来。4. 实操过程与核心环节实现4.1 硬件准备与连接先确认硬件FPGA板卡、LVDS发送端可以是另一块FPGA或摄像头模组、示波器可选但推荐、万用表。连接时注意差分对极性。LVDS的P和N不能接反否则数据会反相。有些FPGA的SelectIO支持极性反转但最好硬件上就接对。供电和参考时钟要稳定。LVDS对电源噪声敏感建议用LDO供电。4.2 工程搭建与约束在Vivado中新建工程添加Verilog源文件。约束文件里要定义set_property PACKAGE_PIN AA1 [get_ports lvds_clk_p] set_property IOSTANDARD LVDS_25 [get_ports lvds_clk_p] set_property PACKAGE_PIN AA2 [get_ports lvds_clk_n] set_property IOSTANDARD LVDS_25 [get_ports lvds_clk_n] create_clock -name clk_lvds -period 5.0 [get_ports lvds_clk_p]注意LVDS_25是2.5V标准具体取决于bank电压。1.8V bank用LVDS_18。4.3 发送端设计发送端用OSERDESE2做并串转换。输入8位并行数据输出串行LVDS。OSERDESE2 #( .DATA_RATE_OQ(DDR), .DATA_WIDTH(8), .SERDES_MODE(MASTER) ) oserdes_master ( .OQ(oq), .D1(d[0]), .D2(d[1]), .D3(d[2]), .D4(d[3]), .D5(d[4]), .D6(d[5]), .D7(d[6]), .D8(d[7]), .CLK(clk_serdes), .CLKDIV(clk_div), .OCE(1b1), .RST(rst), .T1(1b0), .T2(1b0), .T3(1b0), .T4(1b0), .T5(1b0), .T6(1b0), .T7(1b0), .T8(1b0), .SHIFTIN1(), .SHIFTIN2(), .SHIFTOUT1(), .SHIFTOUT2(), .TBYTEIN(1b0), .TBYTEOUT(), .TFB(), .TQ() );发送端要发送训练序列比如0x55方便接收端bitslip。4.4 接收端状态机接收端状态机分三个阶段IDELAY扫描、bitslip搜索、数据接收。IDELAY扫描时发送端发PRBS接收端统计误码。找到最佳tap后锁定IDELAY。bitslip搜索时发送端发0x55接收端不断bitslip直到收到0x55。数据接收时正常解析数据。localparam IDLE 0, SCAN 1, BITSLIP 2, RUN 3; reg [1:0] state; reg [4:0] tap; reg [7:0] q; reg [7:0] best_tap; reg [31:0] err_cnt; always (posedge clk_div) begin case (state) IDLE: state SCAN; SCAN: begin if (tap 31) begin state BITSLIP; tap 0; end else begin tap tap 1; // 统计误码 end end BITSLIP: begin if (q 8h55) state RUN; else bitslip 1; end RUN: begin // 正常接收 end endcase end4.5 实测波形与数据分析用ILA抓取ISERDES输出。如果bitslip正确应该能看到稳定的0x55。如果数据在跳说明bitslip没对齐。IDELAY扫描时记录每个tap的误码数。通常中间几个tap误码为0两边误码增加。选中间tap。我实测过一个500Mbps的LVDSIDELAY最佳tap在15左右误码率0。偏到10或20误码率上升。4.6 参数计算示例假设LVDS时钟200MHzDDR数据速率400Mbps。ISERDES 1:8 DDRCLKDIV50MHz。IDELAY tap步进约78ps31个tap覆盖约2.4ns。400Mbps的位周期2.5ns所以IDELAY能覆盖约一个位周期足够调整采样点。如果速率更高比如1Gbps位周期1nsIDELAY覆盖2.4ns仍然够用。5. 常见问题与排查技巧实录5.1 数据全0或全1可能原因差分对极性接反、ISERDES没复位、时钟没进来。排查先用示波器看差分线有没有信号。如果有信号但ISERDES输出全0检查RST是否释放。如果极性反了可以在ISERDES前加反相器或者交换P/N。5.2 数据跳但不对可能原因bitslip没做、bitslip做错、训练序列不对。排查确认发送端发的是0x55接收端bitslip逻辑是否正确。bitslip脉冲宽度要够不能太窄。5.3 偶尔误码可能原因IDELAY没调好、PCB走线不等长、电源噪声。排查扫描IDELAY找最佳tap。检查PCB走线。用示波器看电源纹波。5.4 温度变化后挂掉可能原因IDELAY固定温度变化导致延迟漂移。排查用IDELAY的动态校准定期重新扫描。或者用眼图扫描找更宽的窗口。5.5 常见问题速查表现象可能原因解决方法全0/全1极性反、复位、时钟检查硬件、复位、时钟数据跳不对bitslip加bitslip逻辑偶尔误码IDELAY、PCB扫描IDELAY、检查走线温度挂延迟漂移动态校准花屏字对齐加word align不亮时钟、电源检查时钟、电源提示LVDS调试时先用低速跑通再逐步提速。低速能通说明逻辑对高速不通说明时序有问题。5.6 独家避坑技巧第一bitslip不要连续给间隔至少一个CLKDIV周期。我试过连续给ISERDES直接锁死。第二IDELAY扫描时不要只看一个tap要看连续几个tap的误码。如果只有一个tap误码为0说明眼图很窄不稳定。第三训练序列不要用0x00或0xFF因为bitslip时可能误判。用0x55或0xAA跳变多容易对齐。第四PCB走线尽量等长IDELAY补偿范围有限。我遇到过走线差10mmIDELAY补不回来只能改板。第五电源要干净。LVDS对电源噪声敏感建议用LDO加去耦电容。第六温度变化大的场景IDELAY要动态校准。我做过一个户外项目常温调好冬天挂掉后来加了定期校准才稳定。6. 进阶扩展与项目延伸6.1 多通道LVDS同步如果有多路LVDS比如3路RGB转LVDS需要多通道同步。方法是共用同一个bitslip和IDELAY控制或者用同一个训练序列。多通道同步的关键是时钟同源。如果每路LVDS有自己的随路时钟需要先做时钟对齐。6.2 与图像处理结合LVDS接收后数据通常要送图像处理。比如ISP去马赛克、滑动窗口滤波。这些处理在FPGA里用定点数实现。定点数要注意位宽和精度。我一般用Q格式比如Q8.8表示8位整数8位小数。6.3 与MIPI互转有些项目需要MIPI转LVDS或者LVDS转MIPI。这需要协议转换IP。MIPI速率更高调试更难。如果只是接口转换可以用现成的桥接芯片不一定非要在FPGA里做。6.4 动态校准的Verilog实现动态校准的核心是定期扫描IDELAY找到最佳tap。可以用一个慢速时钟触发扫描扫描时暂停数据接收扫描完恢复。reg [31:0] calib_cnt; always (posedge clk_slow) begin if (calib_cnt 32d1000000) begin calib_cnt 0; start_calib 1; end else begin calib_cnt calib_cnt 1; start_calib 0; end end校准周期取决于温度变化速度。一般几秒到几分钟一次。6.5 眼图扫描的自动化眼图扫描可以用FPGA内部逻辑实现不需要示波器。方法是发送PRBS接收端扫描IDELAY和bitslip的组合统计误码找到最佳组合。这个逻辑稍微复杂但很实用。我做过一个自动扫描的模块上电后自动找最佳tap省去手动调试。7. 个人经验总结LVDS调试这件事说难不难说简单也不简单。核心就三点时钟要对、bitslip要做、IDELAY要调。但每一点都有细节细节没做好就调不通。我刚开始调LVDS时以为接上线就能跑结果数据全是乱的。后来查了XAPP523才明白bitslip和IDELAY的重要性。XAPP523是Xilinx的LVDS应用笔记讲得很详细建议大家都看看。还有一点调试时要有耐心。LVDS不像低速接口错了能看出来。LVDS错了就是花屏、误码得一步步排查。先用低速跑通再提速。先调IDELAY再调bitslip。顺序不能乱。最后分享一个小技巧如果手头没有示波器可以用FPGA内部的ILA抓波形。ILA能抓ISERDES输出、bitslip信号、IDELAY tap值足够定位大部分问题。这个内容后续还可以扩展比如多通道同步的具体实现、动态校准的详细代码、与图像处理结合的案例。如果有需要我可以再写一篇。
返回列表