☰
Xilinx FPGA与LVDS高速ADC接口调试:从原语到bitslip对齐
2026/10/6 13:24:39 网站建设 项目流程

前阵子刚调完一块板子,LVDS接口的高速ADC,配合xilinx FPGA做数据采集。项目本身不大,但调试时把LVDS这一整条链路从电平标准到原语例化到bitslip对齐完整过了一遍,中间遇到不少问题。最典型的是刚上板时数据能采到但全是错位的,后来才发现是对齐训练没做对,跟芯片型号、采样率、PCB走线都有关系。

这篇文章我想把整个设计过程和踩坑记录完整写下来。如果你正准备用xilinx FPGA接LVDS高速ADC,或者已经在调但数据老是乱,这篇文章应该能帮你少走不少弯路。会涉及电平标准、时序分析、原语例化、训练对齐,以及PCB阶段就要提前留意的信号完整性问题。

1. 为什么高速ADC接口绕不开LVDS——电平族、端接电阻与常见混淆概念

1.1 LVDS的本质:电流驱动与350mV摆幅

LVDS全称Low Voltage Differential Signaling,低压差分信号,标准定义在ANSI/TIA/EIA-644里。核心是一个约3.5mA的电流源,从驱动端流出,经过接收端一个100Ω终端电阻回到回流路径,在电阻两端产生大约350mV的压差。接收端检测这个差分电压来判断逻辑0和1,而不是靠对地电压。

这个设计的好处很明显:350mV的摆幅比传统单端TTL/CMOS的3.3V或2.5V低一个数量级,高摆率意味着更短的上升时间,非常适合高速传输。而且差分结构天然抑制共模噪声,两个信号线上的噪声如果是共模的,在接收端做差之后就抵消了。对ADC输出这种动辄几百Mbps的信号,LVDS几乎是成本、功耗、性能最平衡的接口方案。

但很多人容易忽略的是,LVDS接收端必须有那个100Ω终端电阻。这个电阻如果没接对,共模偏置和差分摆幅都会出问题。好在xilinx 7系列FPGA的HP bank里有DIFF_TERM选项,可以在片内直接打开这个100Ω终端电阻,省掉外部贴片电阻。但要注意,这个片内端接在某些bank或某些电平标准下不可用,选型时要查手册确认。

1.2 共模电压、差分电压与xilinx的LVDS电平族

LVDS除了摆幅350mV,还有一个重要的直流参数是共模电压,标准规定在1.2V左右。FPGA的接收端要能处理这个共模范围。xilinx在SelectIO里支持多种LVDS变体:LVDS_25是1.2V共模但VCCO需要2.5V供电,LVDS是给1.8V VCCO用的,LVDS_33是3.3V VCCO的版本。

我见过不少新手卡在这里:芯片选完了,VCCO接错了,结果是数据完全读不出来,或者只能在低温下工作。查xilinx的选型手册或者引脚列表的时候,一定要确认你选的那个BANK支持哪种LVDS标准,以及VCCO要求是多少。7系列里HP bank(High Performance)通常支持1.2V到1.8V的VCCO标准,HR bank(High Range)支持1.8V到3.3V,但HR bank里的LVDS性能支持最好确认一下,有些器件在HR bank上布LVDS会有限制。

1.3 HCSL和LVDS到底有什么不同

网上经常有人把HCSL和LVDS混在一起问,这俩虽然都是差分信号,但协议差别很大。HCSL是High-Speed Current Steering Logic,典型应用是PCIe、QPI这类高速时钟分配,输出共模约0.35V,差分摆幅约700mV,每个输出引脚需要50Ω到GND的端接。LVDS共模1.2V,摆幅350mV,端接是跨接在差分对之间的100Ω。

最关键的区别是端接方式和共模电平,这俩接法接错了,轻则信号变形,重则发热甚至损坏器件。如果是ADC输出的LVDS接FPGA,就按LVDS来处理;如果是PCIe时钟源过来的HCSL,就得按HCSL的端接来。虽然xilinx有些HP bank的输入能容忍HCSL的摆幅,但最好不要直接拿LVDS终端电阻的方案去套HCSL信号。

1.4 高速ADC为什么不像DDR那样用单端接口

可能有人问:DDR内存那么快,用的不也是单端吗?为什么ADC偏偏用LVDS?这里有个关键差异:ADC是源同步接口,数据、时钟都从ADC端发出来,而且ADC输出通常是并行多路,一旦速率上来,单端的串扰和同步开关噪声(SSN)会非常严重。差分信号在抗共模噪声方面有明显优势,所以高速ADC普遍把数据位拆成LVDS差分对输出,而且用DDR模式,一个时钟沿能传两位数据,等效减少了一半的引脚数。

2. 动手前必做:数据手册关键页、FPGA选型与引脚规划

2.1 数据手册要逐字读的五个参数

拿到一颗新的ADC,先不要急着写代码,把数据手册里这几个参数看明白再动手:

  • 最大采样率(MSPS),这决定了你的数据位宽和接口速率。
  • 输出数据格式:通常是偏移二进制(Offset Binary)或二进制补码(Two's Complement),采出来是正负电压时这两种编码的解释完全不同。
  • DCO(Data Clock Output)的频率和相位关系:DCO是ADC输出的随路时钟,FPGA用它来同步采样数据。有的ADC输出DCO频率等于采样率,有的等于两倍,还有的是SDR(单沿)和DDR(双沿)模式的区别。
  • FCO(Frame Clock Output)的位置:FCO用来指示每一帧数据的起始,对齐时要靠它。
  • 数据有效窗口(tDV/tDH,setup/hold time):这个参数直接决定你在FPGA里要做什么级别的延迟调整。

这些参数不搞清楚,后面代码写得再漂亮也没用。我调过的一颗ADC,DCO是采样率的2倍,也就是说每个采样周期里DCO会出两个沿,每个沿对应一个bit位,这就是典型的DDR模式。另一颗ADC的FCO是低电平有效,和我想当然的高电平有效刚好相反,结果ILA上看到的帧标志位全是反的,浪费了半天时间。

2.2 FPGA选型:HP bank、VCCO、ISERDESE2资源

xilinx主流的7系列或者Ultrascale系列FPGA,接LVDS ADC一般都会优先用HP bank。HP bank的IO速度快,支持真正的LVDS差分标准,而且内置了100Ω差分终端。如果你用的是HR bank,虽然也能配LVDS,但上拉电阻、端接方式、速度等级都可能受限,高速ADC不推荐用HR bank接LVDS。

同时要关注你选的那颗FPGA里ISERDESE2(7系列)或ISERDESE3(Ultrascale)的资源。每个IO都有对应的ISERDES,用于把高速串行数据转成低速并行数据。比如一颗ADC输出12路LVDS差分数据,DDR模式,加上DCO和FCO,一共14对差分信号,那至少要14个IO和对应的ISERDES资源。这些资源在普通的逻辑资源够用,但IO约束时要注意BANK位置。

还有一个容易忽略的点:每个BANK的BUFIO资源数量是有限的,BUFIO专门把外部随路时钟送到IO逻辑,而DCO分频后要用BUFR把慢时钟送进FPGA内部逻辑。如果你的多路ADC分散在不同BANK,每个BANK都需要独立的BUFIO和BUFR,数量上要提前算清楚,否则综合时会报时钟资源不足。

2.3 引脚分配时的Bank与时钟区域约束

引脚分配不是随便找几个空闲IO就完事。高速LVDS接口的引脚规划有几个硬性规则:

  • 所有数据和随路时钟最好放在同一个BANK,或者至少是相邻BANK,最大程度减少跨BANK引起的偏斜。
  • IO对应的ISERDES使用的BUFIO,必须能覆盖到这些IO所在的时钟区域(Clock Region),如果跨了多个区域,BUFIO的数量和覆盖范围都要核对。
  • DCO和FCO最好放在相邻引脚,FCO对齐各通道的帧边界时,物理引脚距离近一些,偏斜也小一点。

正确的流程是:先看ADC输出引脚定义,再到FPGA器件手册里查可用的BANK和引脚位置,用规划工具或者Excel先排布一版,把数据线、DCO、FCO的位置固定下来,然后才去写约束文件。

一个低成本的判断方法:打开vivado的IO Planning,把同一组数据线放同一个BANK且尽量集中。之后在约束里给同一组LVDS接口加同等的MAXDELAY和系统时序约束,这样综合布线器会尽量帮你平衡内部偏斜。

3. 时序本质:DCO/FCO/Data三条通路与bitslip对齐机制

3.1 源同步接口的三条核心通路

LVDS ADC接口和DDR、MIPI的接收本质是一样的,都是源同步接口。意思是时钟不是FPGA产生的,而是由ADC送过来的DCO随路时钟。数据以DCO为基准,DCO上升沿采样一个bit,下降沿采样另一个bit(DDR模式)。

这三条通路是:

  • Data通道:N对差分信号,承载各路并行数据位。
  • DCO通道:随路时钟,频率通常是采样率的整数倍,DDR模式下每周期传递2bit。
  • FCO通道:帧时钟,用于标记每个采样数据组的起始位置。

FPGA接收端的任务就是:用DCO去采集N路Data,再用FCO找到对各通道的帧边界,最后把所有通道的并行数据拼成一个完整的ADC采样点。

关键点是:DCO、Data、FCO虽然在ADC内部是同步发出的,但它们经过PCB走线、FPGA内部开关矩阵、BUFG等路径后,相互之间会产生偏斜。这个偏斜如果超过数据有效窗口,直接采就会采错。所以这才需要IDELAY和bitslip来校准。

3.2 DDR模式与ISERDESE2的对应关系

先看DDR模式下的直观时序:假设ADC采样率是100MSPS,输出12bit DDR,DCO频率=100MHz,那么一个DCO周期内每个通道要传2bit。12bit数据用6对差分线在DDR下传输,DCO的上升沿采到bit0,下降沿采到bit1,然后在下一个周期又是bit2和bit3,一直循环。

ISERDESE2就是个串并转换器,专门负责把这种DDR高速串行数据转成低速并行数据。比如配置DATA_WIDTH=8,那么每8个串行bit会转成一次8bit的并行数据。ISERDESE2内部包含一组IO寄存器和可选的级联逻辑,时钟由CLK和CLKB提供,实际使用时CLK接DCO,CLKB接DCO的反相,配合成DDR采样。

这个转换逻辑本身不复杂,但它要求你正确设置DATA_WIDTH和DDR/SDR模式,并且确保DCO分频后的低速时钟(CLKDIV)和IDELAY的内容在同一个时钟域内能对上。很多人的数据错位,问题恰恰出在这个分频比对应关系上。

3.3 bitslip对齐与训练pattern

bitslip是ISERDESE2里的一个功能,它的作用是让接收到的并行数据在输出上做“循环移位”。如果并行输出是8bit,每来一次bitslip命令,输出数据就向左移动1bit,最左边那一位循环回到最右边。利用这个机制,就能把ADC发送的串行bit流里“数据从哪里开始”的边界找出来。

为什么需要这个?因为DCO只是告诉ISERDESE2每个bit应该在哪个沿采,但一帧数据的bit0到底是在哪个时钟周期出现的,DCO本身不直接给出。FCO虽然能指出帧边界,但DCO和Data之间的偏斜会导致FCO本身也偏了。所以工程上最常见的做法是:让ADC先发一组已知的训练序列,比如0x70这种具有明显模式特征的pattern,FPGA端不断检查收到的数据是否符合预期,如果不符合就发一个bitslip,直到收到的数据与预期pattern完全匹配。这个匹配的过程就是对齐。

有一个很直观的类比:bitslip相当于在调整密码锁的刻度,DCO负责给你一个稳定的速度转轮,而训练序列就是告诉你密码锁上哪个数字是起始位。只有起始位找对了,后边连续采出来的数据才有意义。别小看这一步,实际项目里最常遇到的数据“全是0”或者“全是F”,十有八九就是这里没对齐。

4. Xilinx原语实现:IBUFDS到ISERDESE2的完整接收链路

4.1 顶层设计与原语例化

xilinx的LVDS输入链路有固定的接法:IBUFDS负责把差分信号转成单端,IDELAYE2负责调整延迟,然后进ISERDESE2做串并转换,这个过程由DCO驱动。DCO本身也要经过IBUFDS,然后通过BUFIO直接驱动ISERDESE2的CLK,再通过BUFR分频,作为后续逻辑的低速时钟。

下面是一段经过实际验证的Verilog例化模板,7系列下可以直接用:

// LVDS差分输入缓冲器 IBUFDS #( .DIFF_TERM("TRUE"), // 使能片内100欧差分终端 .IBUF_LOW_PWR("FALSE") // 关闭低功耗模式,保证高速性能 ) u_ibufds_data0 ( .I (adc_data0_p), .IB (adc_data0_n), .O (data0_raw) ); // 可调延迟单元,由IDELAYCTRL统一管理 IDELAYE2 #( .IDELAY_TYPE("FIXED"), // 先用固定值,调试时可改为VARIABLE .DELAY_SRC("IDATAIN"), .IDELAY_VALUE(0), .REFCLK_FREQUENCY(200.0) ) u_idelay_data0 ( .IDATAIN (data0_raw), .DATAIN (1'b0), .C (clk_div), // 低速时钟域 .CE (1'b0), .INC (1'b0), .CINVCTRL(1'b0), .CNTVALUEIN(5'b0), .CNTVALUEOUT(delay_cnt_out), .LD (1'b0), .LDPIPEEN(1'b0), .REGRST (1'b0), .DATAOUT (data0_delayed) ); // 串并转换核心 ISERDESE2 #( .DATA_RATE("DDR"), .DATA_WIDTH(8), .INTERFACE_TYPE("NETWORKING"), .DYN_CLKDIV_INV_EN("FALSE"), .DYN_CLK_INV_EN("FALSE"), .NUM_CE(2) ) u_iserdese2_data0 ( .D (data0_delayed), .DDLY (1'b0), .CE1 (1'b1), .CE2 (1'b1), .RST (rst_n), .CLK (clk_dco), // BUFIO输出的DCO .CLKB (clk_dco_b), // DCO反相 .CLKDIV (clk_div), // BUFR分频后的低速时钟 .CLKDIVP (1'b0), .OCLK (1'b0), .OCLKB (1'b0), .SHIFTIN1 (1'b0), .SHIFTIN2 (1'b0), .BITSLIP (bitslip_data0), // 对齐控制信号 .Q8 (rx_pdata[7]), .Q7 (rx_pdata[6]), .Q6 (rx_pdata[5]), .Q5 (rx_pdata[4]), .Q4 (rx_pdata[3]), .Q3 (rx_pdata[2]), .Q2 (rx_pdata[1]), .Q1 (rx_pdata[0]), // 注意Q1是最后一位 .SHIFTOUT1 (), .SHIFTOUT2 () );

注意Q1到Q8的映射顺序。ISERDESE2的Q1是并行输出的“最后一位”,Q8是“第一位”,如果不小心把Q1当成了bit0,后面数据全是反的。还有DATA_WIDTH和DCO频率之间的关系,如果DCO频率太高,8bit DDR模式可能撑不住,就得考虑用两个ISERDESE2级联做更宽的并行宽度。

4.2 时钟树构建:BUFIO与BUFR的用途和取舍

在FPGA内部,DCO进来之后有两条支路:一条直接进BUFIO,BUFIO是专门为IO逻辑服务的低延迟时钟缓冲器,直接驱动ISERDESE2的CLK和CLKB;另一条进BUFR,BUFR可以对DCO做整数分频(1/2/4/8),分频后的慢时钟驱动ISERDESE2的CLKDIV和后续的FPGA逻辑。

这里有个非常关键的设计点:ISERDESE2的数据输入虽然走的是IDELAY-E2再进ISERDES,但真正的高频采样动作是发生在IO区域内部的,用的是BUFIO时钟,而CLKDIV是BUFR的输出。这样整个结构就形成了“高频在IO区域处理,低频在内部逻辑处理”的经典架构。

为什么不能用BUFG代替BUFIO?因为BUFG是全局时钟网络,延迟和偏斜较大,不适合直接作为高速IO采样的时钟。BUFIO是直接连接IO输入输出逻辑的专用路径,延迟极小。而BUFR则跨不过太多的时钟区域,如果你的多路ADC和数据线不在同一个时钟区域,需要规划多个BUFR,这又回到了引脚规划那一步。

4.3 IDELAYE2的延迟调整逻辑

IDELAYE2的精度在7系列里是约78ps一个tap,Xilinx会根据参考时钟自动校准每个tap的实际延迟。它需要IDELAYCTRL原语配合,IDELAYCTRL会用一个参考时钟(通常200MHz)来实时修正tap延时,保证温度、电压变化时tap的延迟仍然准确。

调整延迟的核心理由很简单:DCO和Data在PCB走线长度不一致、在FPGA内部路径不一致,到达ISERDESE2时会有一个偏斜。这个偏斜如果落在数据有效窗口之外,DCO的边缘就会靠近数据的跳变点,采样结果时好时坏。这时通过IDELAYE2把数据往“晚”推或者往“早”拉,让DCO采样点正好落在数据眼图的中央。

实际调试时,最笨但有效的方法是:固定DCO不动,把IDELAY从0扫到31,逐个tap记录采到的数据是否稳定,最后取一个“中间稳定区间”的tap值。这个做法本质上就是在数字端扫描眼图。扫的时候可以在Vivado ILA里实时看,也可以写个小状态机在实机里自动扫描,把结果回传。

4.4 训练状态机的实现思路

训练状态机的目的是自动做bitslip对齐。基本流程是:

  1. 进入训练模式,FPGA控制ADC发送训练序列,比如连续发送0x70/0x70,或者根据ADC手册里的推荐表位模式。
  2. FPGA开始按帧接收数据,判断收到的并行数据是否等于预期值。
  3. 如果等于,则认为该通道对齐,进入下一路;如果不等于,给该通道发一个bitslip脉冲,重新采样判断。
  4. 所有通道都对齐后,同时检查FCO是否一致,所有FCO对齐在同一个采样点边界上。
  5. 退出训练模式,进入正常工作。

这里有一个容易踩的坑:bitslip脉冲必须在CLKDIV域内有效,且要满足ISERDESE2的时序要求,通常是一个CLKDIV周期的高电平。如果脉冲时序不对,可能一次挪了好几位,或者根本没生效。

还要提一个细节:训练序列不一定非得从ADC侧主动发。有的ADC支持SPI配置后自动输出测试pattern,有的需要FPGA控制某个引脚使能。具体看数据手册里的“Test Pattern”或“Output Test Mode”章节。有些ADC输出的pattern是自定义的,比如0x00/0xFF交替、prbs伪随机序列等,都适合做对齐。

5. 从“能采数”到“采得准”:调试链路与实测技巧

5.1 用ILA看什么:FCO、数据边界与错位特征

ILA(集成逻辑分析仪)是调试LVDS接口最快的手段。第一次上板之后,先不要急着看数据对不对,先抓三个信号:FCO、并行数据、bitslip训练状态机的状态。

FCO是用来做帧对齐的基准。如果多路ADC的FCO之间有时序偏差,说明PCB走线或FPGA内部路径不一致,这就要靠约束和IDELAY去调。简单的方法是:把各路FCO抓到ILA里,放大看它们上升沿是否对齐到同一个CLKDIV周期内。如果差了一个周期,那么就说明某一路在“帧边界”上已经错位了。

数据错位有几种典型表现:

  • 所有数据全是0或者全F:大概率是LVDS电平没配好,或者端接没开,更可能是串并转换的方向反了(Q1/Q8映射错)。
  • 数据看起来有规律但明显是乱的:比如数值一直在跳,但看不出序列来,可能是DCO频率不对,或者DDR/SDR模式配错。
  • 数据没问题但FCO对不上:后期做多通道数据拼包时会发现通道间错位一个或几个采样点。

用ILA抓数据时,我习惯把火柴头信号同时显示成二进制和十六进制,同时把FCO和训练状态也拉进来,这样可以直观判断到底卡在哪一环。还有一个实用技巧:把IDELAY的CNTVALUEOUT也抓到ILA里,调试时实时看当前延迟在哪个tap。

5.2 眼图扫描与tap值选择的完整过程

眼图扫描的操作分三步:

第一步,固定一个稳定输入条件。给ADC输入端接入一个直流或低频信号,保证ADC输出的是固定pattern,这样可以排除实际信号跳变带来的干扰。

第二步,写一个简单的扫描状态机。从IDELAY=0开始,每步加1,每一步等到数据稳定几百个周期后,把当前采到的数据和IDELAY值记录下来,一直扫到31。将结果回传到上位机或ILA里,画出“tap值-数据是否稳定”的曲线。

第三步,取稳定区间的中点。比如从tap=8到tap=20数据都是稳定的,那么取14或者15作为当前工作点的最佳延迟。如果整个区间里没有稳定点,说明信号质量已经很差,优先检查PCB和电平配置,而不是继续调IDELAY。

要注意的是,这个扫描结果会和温度有关。温度变化会导致PCB走线延时、IO输入延时和片内逻辑延时都发生变化。严谨一点的系统会把扫描放到底层自动执行,例如上电之后每隔一段时间重新训练一次。7系列FPGA的IDELAYE2有VARIABLE模式,可以在运行过程中动态调节,但要注意动态更新时防止亚稳态,最好在低速时钟域里同步控制信号。

5.3 训练序列选择与误码率验证

训练pattern的选择直接影响对齐的成功率。一个理想的训练pattern应该满足:

  • 有明显的标识位,最好是“0101110000”这类模式,既包含长连续0和1,又有高频跳变,能充分检验每个采样点。
  • 所有bit位上都能区分,避免出现多个位置看起来都“正确”的歧义。
  • 手册里若给了推荐pattern,优先用推荐的。

常见的ADC测试pattern有0x70/0x0F交替、0xAA/0x55交替、PRBS等。0xAA/0x55这种交替模式有个问题:对齐时你会发现随便挪一位它看起来还是“像”交替序列,容易陷入歧义。所以一般用0x70这类包含非对称bit序列的pattern,比如二进制01110000,这样移位一次就能明显看到值变化。

训练通过后,下一步是误码率测试。把ADC输入端给一个正弦波或者直流偏置,连续采一段时间,比如10分钟,统计数据的波动范围和是否符合预期。对于高速ADC来说,哪怕有1e-9的误码率,在某些应用里都不可接受。常见做法是:用外部信号源给一个精确的正弦信号,采集FFT后看信纳比和SFDR是否能对上数据手册的指标。如果FFT结果明显差,说明数据在高位或低位上有翻转,得回去查时序余量。

6. PCB阶段就要处理的信号完整性问题——时钟、电源与差分走线

6.1 时钟抖动与电源噪声的三个致命关系

很多人在FPGA里调了又调,发现数据还是偶尔出错,最后查出是PCB布局时埋下的雷。最典型的是时钟抖动问题。ADC的采样时钟如果抖动大,采样点的随机偏移就会转化为ADC输出噪声,并且这个噪声跟接口的LVDS电平完全无关,你调IDELAY也救不回来。

三个PCB布局注意点:

第一,时钟源的位置要跟ADC放近一点,时钟走线要短、要直,禁止用长的过孔切换走线。一个低抖动的时钟源被拉得过远、过孔太多,抖动性能就直接劣化了。

第二,ADC的电源要跟FPGA的数字电源分区处理。ADC模拟电源用LDO供电,并且用磁珠或LC滤波器隔离。开关电源的纹波和开关噪声如果直接串入ADC供电或者参考电压,会直接转化为采样噪声。PCB上要保证ADC下面有完整的模拟地平面,模拟地和数字地点单点连接。

第三,LVDS走线绝对不能跨越电源分割区域。如果差分对跨过地平面切割,回流电流会被迫绕行,引起共模噪声和阻抗突变,轻则时序余量变小,重则直接采不到数据。所有LVDS线尽量走在同一个完整的地平面上,且上下左右用地孔隔离其他高速信号。

6.2 差分阻抗、等长与终端电阻的处理

LVDS标准要求100Ω差分阻抗。在PCB设计时,差分对要控制在100Ω±10%以内,这要靠叠层计算工具和板厂的工艺配合。两线之间等长是常规要求,但优先级低于阻抗匹配。一个经验值是:速率在500Mbps以下时,等长误差控制在±5mil左右就够了;超过1Gbps时,建议控制在±2mil以内,并且做到同层走线。

终端电阻的选择上,如果用了FPGA内部的DIFF_TERM,外部就可以省掉电阻,但要注意这个片内端接的精度不如独立电阻(片内电阻大约±20%),对高速LVDS来说勉强够用。对信号质量要求高的场合,建议外部并联100Ω电阻,片内DIFF_TERM关掉,这样阻抗精度更好,信号反射更小。

有一类常见错误是:设计者把差分对的终端电阻画到了接收端的远端,但同时开了片内DIFF_TERM,导致实际终端电阻变成并联(外部100Ω并内部100Ω=50Ω),LVDS信号直接被削掉一半多幅度,接收端刚好还能工作但余量很差。这个坑在原理图评审阶段就应发现,百密一疏容易漏。

6.3 地孔与回流路径的工程细节

LVDS高速走线旁边最好每隔一段就放一个地孔,但注意地孔不能放得太密形成“地栅栏”,反而阻断回流。一般在差分对两侧各放一排地孔,间距小于信号上升沿对应波长的1/20,就足够提供干净的回流路径。

还有一点容易被忽略:DCO走线比Data走线的优先级更高。DCO是所有数据的基准,它的信号质量决定整个接口的时序裕量。PCB上应尽量让DCO走线短于等于所有Data走线,且DCO不要跟某个Data走线靠得太近,防止时钟串扰到数据上。

多路LVDS并行传输时,相邻差分对之间的耦合也不可忽视。如果两对差分线平行走了很长一段距离,它们之间会产生串扰。常用的做法是走线间距至少大于线宽的3倍,或者用“一对差分线-一根地线-一对差分线”的间隔方式隔开。总之,宁可绕一点路,不要长时间并行紧贴。

最后分享一个我实机调出来的经验:如果整套链路已经可以正常工作,但偶发出现数据错误,可以先大概率排除FPGA逻辑问题,优先量一下DCO和Data在接收端的实际波形。用示波器看DCO上升沿对应Data是否稳定,是最快速判断时序裕量的办法。如果示波器探头的负载会影响信号,至少可以用差分探头在靠近FPGA引脚的位置量。能抓到眼图的话,直接就能看到余量够不够大,比一个个调tap高效太多。

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

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

立即咨询