ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

FPGA LVDS高速传输自动校准:IDELAY2与BITSLIP实战

FPGA LVDS高速传输自动校准:IDELAY2与BITSLIP实战 先说个我自己的经历。去年做一块基于FPGA的LVDS采集板平时Debug时用50Mbps低速模式跑得稳如老狗结果切到700Mbps高速档位后板子开始随机冒误码偶尔整帧丢数据。刚开始我怀疑是后端接的RK3566那边MIPI转LVDS配置有问题翻了一整天驱动最后才发现问题出在前端LVDS接收链路上——ISERDESE2的采样点根本没有落在眼图中心BITSLIP也在错误的位置上找字边界。这件事让我彻底明白一个道理LVDS高速传输不是把ISERDESE2和OSERDESE2例化上就完事真正决定成败的是IDELAY2的延迟校准和BITSLIP的位滑动对齐。这篇就专门写这个——如何用一套自动校准机制让ISERDESE2和OSERDESE2在LVDS链路上跑得稳、跑得准顺便把IDELAY2和BITSLIP的配合逻辑讲透。1. LVDS接收为什么这么难调ISERDESE2和OSERDESE2只是起点很多做过LVDS接口的工程师都有这种体验设计参考原理图时看着挺简单FPGA引脚上拉个100欧匹配电阻差分对直连进去代码里例化一个ISERDESE2做解串完事。但真正跑起来才发现时序问题全藏在细节里。1.1 眼图窗口是怎么被一步步吃掉的LVDS链路上发送端OSERDESE2把并行的8位数据转成串行比特流经过PCB走线到接收端ISERDESE2。理想情况下每个比特的窗口宽度就是1/数据率。比如700Mbps单bit宽度大约是1.43ns。但实际链路上会有几个损耗源PCB走线长度差差分对内正负线长度不匹配会产生相位偏移。LVDS通常要求对内等长控制在5mil以内但实际板厂签核时经常差个几十mil。别小看这几十milFR4板材上信号传播速度大约是6mil/ps30mil的差异就是5ps的偏移高速时能明显吃掉眼高。器件批次差异发送端驱动器的上升沿速率不一致不同批次的LVDS Driver特性差异会导致相同的PCB设计呈现不同的时延。温度与电压漂移这个最讨厌。板子刚上电和跑半小时后FPGA内部逻辑延迟、IOB延迟、IDELAY2的tap单位延迟都会随温度电压变化。校准如果只做一次运行一段时间后可能就偏出眼图中心了。这些误差累积下来接收端ISERDESE2的采样时钟沿很可能就没有落在数据的稳定区域而是在数据跳变沿附近徘徊。这时候误码的随机性就体现出来了时好时坏很难复现。1.2 为什么需要IDELAY2和BITSLIP两个维度来校准这是我当时最大的认知误区以为采样点不对就调延迟延迟调完就万事大吉。实际上LVDS接收对齐要解决两个完全不同层面的问题第一个层面是bit级的相位对齐。ISERDESE2在高速时钟沿采样串行数据我们要确保采样时刻落在每个bit的眼图中心。这个由IDELAY2来调整它可以对输入信号插入可编程的延迟精度通常是一个tap约78ps7系列。调整IDELAY2相当于在时间轴上左右平移采样点。第二个层面是word级的字边界对齐。ISERDESE2把串行数据转成并行数据时并行输出的起始位置是任意的。比如1:8模式下发送端发送的8-bit并行数据为D0~D7但接收端解出的并行数据可能是D3~D0再拼接上后面的D7~D4总之是旋转错位的。BITSLIP就是干这个的通过滑动并行数据的位序来找到正确的字边界。这两个维度缺一不可。只调BITSLIP而不调IDELAY2的话如果采样点不在眼图中心就算字边界对了还是会有bit采样错误。只调IDELAY2而不调BITSLIP的话每个bit都采得很准但并行字节还是对不齐。所以自动校准机制的完整流程必然是先扫IDELAY2找眼图中心再滑BITSLIP找字边界。这个逻辑想通之后整个自动校准框架就清晰了。下面先拆解每个原语的具体职责再讲状态机的完整实现。2. 原语角色拆解这四个家伙在链路里各管什么事有很多刚接触LVDS接收的同学搞混ISERDESE2和IDELAY2的关系其实两者完全不在一个层次上。ISERDESE2是解串器负责把串行bit流变成并行数据IDELAY2是延迟链负责对单个bit的采样时刻进行微调OSERDESE2是发送端的并串转换器BITSLIP是ISERDESE2内部的一个功能端口负责字对齐。2.1 ISERDESE2与OSERDESE2的收发通道搭建先看完整的收发链路。发送端FPGA内部并行数据进入OSERDESE2在高速时钟驱动下按bit顺序发出去接收端ISERDESE2用DDR模式在时钟上下沿分别采样把串行数据拼成并行数据输出。ISERDESE2有几个关键端口需要特别注意。D是串行数据输入OCLK是高速采样时钟通常等于线路速率CLK是并行域时钟OCLK除以并行宽度CE是时钟使能RST是复位。在DDR模式下1:8配置意味着每个CLK周期输出8位并行数据。例化时有个容易踩的坑NUM_CE和INTERFACE_TYPE必须匹配。如果用INTERFACE_TYPENETWORKINGNUM_CE只能等于1如果设成2综合时会报错。另外DATA_RATEDDR时CLKDIV的频率必须是OCLK频率的1/8对应1:8模式这个比例必须严格满足否则并行数据会出现错位采样的现象。OSERDESE2相对简单一些把并行数据在OCLK的上下沿依次发送出去。有一点值得注意OSERDESE2的T_OUT端口用来控制三态输出普通LVDS数据发送直接固定为0即可但如果是双向总线就需要动态控制。我之前做过一次LVDS双向传输忘记把T_OUT拉低结果发送端一直被三态隔离信号根本出不去。2.2 IDELAY2的配置模式选择为什么自动校准必须用可加载模式IDELAY2有几种工作模式选择错误会让自动校准机制根本无法实现。模式延迟值可否动态修改适用场景FIXED否综合时固定时延已通过仿真约束确定不需要调整VARIABLE可以通过CE和INC动态增减需要运行时微调但校准逻辑较复杂VAR_LOAD可以通过CNTVALUEIN直接加载任意值自动校准推荐支持跳变到指定tapVAR_LOAD_PIPE带流水线寄存器的VAR_LOAD需要多个延迟值同时更新的高速场景我推荐自动校准用VAR_LOAD模式原因很直接扫描眼图时需要在不同tap值之间快速跳变VARIABLE模式的移位加减操作要一个一个tap地走扫描32个点要32个时钟周期虽然也不慢但控制逻辑不直观而VAR_LOAD模式直接把目标tap值写到CNTVALUEIN端口一个周期就能跳到目标位置状态机写起来干净利落。IDELAY2的tap分辨率在7系列上大约是78ps这是由参考时钟频率通常是200MHz和工艺参数决定的。一个UIUnit Interval即1bit宽度在700Mbps下约1428ps也就是说一个bit窗口大约覆盖18个tap。假设你扫到tap12到tap22之间误码率都不高说明眼图中心大致在tap17附近那最佳采样点就设在这个区间中点这个逻辑后面在扫描状态机里会用到。2.3 BITSLIP到底是怎么滑动的BITSLIP是ISERDESE2的一个特殊功能输入端口。当BITSLIP信号在CLKDIV的上升沿被拉高一个周期输出的并行数据会向左移动一位也就是把数据宽度范围内的bit整体偏移1bit等效于把串行输入流的采样起始点推进一个bit。举个具体例子1:8模式下如果当前并行输出是{D7,D6,D5,D4,D3,D2,D1,D0}拉高一次BITSLIP后变成{D8,D7,D6,D5,D4,D3,D2,D1}注意这里的D8是下一个串行bit。所以每次BITSLIP操作相当于让并行数据的字边界向后错一位。这意味着什么在1:8模式下连续执行8次BITSLIP操作并行输出又会回到原来的位序因为8bit一循环。所以在字对齐检测逻辑中最多滑动8次就能找遍所有可能的字边界。这也是为什么训练模式不能太短至少要能保证在这8次滑动中能检测到对齐成功。一个工程经验BITSLIP不要在数据有效传输期间随意触发否则当前并行输出会瞬间错位导致后端FIFO或状态机收到脏数据。BITSLIP应该只在训练模式下使用正常数据阶段必须保持BITSLIP端口为低电平。3. 自动校准状态机设计从眼图扫描到BITSLIP字对齐的完整流程接下来是这篇的核心。自动校准机制看起来复杂其实拆开就是一台状态机加两个子模块眼图扫描模块和字对齐模块。整体流程是发散训练序列接收端先扫IDELAY2找到最佳采样点然后锁定延迟值再通过BITSLIP找到字边界最后进入锁定状态。3.1 校准状态机的状态定义与转换我习惯把校准状态机设计成5个状态状态定义如下。状态名称主要操作S0IDLE等待校准时序空闲时链路保持复位S1DELAY_SCAN发送训练序列扫描IDELAY2 tap值S2DELAY_LOCK锁存最佳tap值准备字对齐S3BITSLIP_ALIGN维持最佳tap循环滑动BITSLIPS4LOCKED校准完成切换正常数据模式状态转换条件也很明确IDLE收到校准使能信号后进入DELAY_SCANDELAY_SCAN扫描完整个tap范围并计算出最佳值后进入DELAY_LOCKDELAY_LOCK把最佳tap值写入IDELAY2等待延迟链稳定后进入BITSLIP_ALIGNBITSLIP_ALIGN检测到字对齐成功或者滑动次数超过阈值1:8模式下最多8次后进入LOCKEDLOCKED状态下如果误码率持续超过门限回到DELAY_SCAN重新校准。这个状态机看起来简单但一个关键点是状态转换时机的控制。尤其是在DELAY_SCAN切换到DELAY_LOCK、以及BITSLIP_ALIGN切换回数据模式时不能简单地在某个cycle后直接跳转而是要和发送端有一个握手协议。具体做法是发送端和接收端之间设置一个训练使能信号和训练完成信号二者配合完成模式切换。3.2 眼图扫描模块不是简单找第一个无错点DELAY_SCAN状态下的操作是纯粹的扫描统计。核心思路是外部控制模块通过寄存器接口写入一个起始tap值然后触发扫描接收端对每个tap值统计固定窗口长度内的误码情况扫描完成后把统计结果通过寄存器总线回传。这里的难点在于固定窗口长度怎么选。太短了偶发误码会被平均掉导致误判太长了整个扫描时间会特别久。以700Mbps为例如果每个tap统计8K字节约91us32个tap全扫完大约2.9ms这个时间可以接受。如果链路速率更低统计时间会等比拉长可以考虑动态调整统计长度。扫描得到的结果是一组误码率数据需要注意的坑是不要选误码率最低的单点作为最佳tap值。因为单点无错可能是偶然而且实际工作环境会漂移选在窗口边缘很容易跑飞。正确做法是找出连续的、误码率为0的tap区间通常叫无错窗口然后取窗口中心作为最佳tap值。如果窗口宽度不足4~5个tap约300ps说明信号质量或PCB设计可能有问题这时候即使校准成功长期稳定性也堪忧。这个窗口取中心的逻辑在设计上可以用一个简单的比较器加寄存器组实现。对每个扫描点记录误码数如果连续N个点误码数为0就记录窗口起点找到所有连续零误码窗口后选最宽的一个取中点。3.3 字对齐模块BITSLIP循环滑动与对齐检测当IDELAY2的延迟锁定后进入BITSLIP_ALIGN状态。发端继续发送训练序列接收端的任务是通过BITSLIP操作找到正确的字边界。最直接的做法是接收端先拉高BITSLIP一次滑动1bit然后连续接收并比对训练序列。如果比对失败再滑动一次再比对直到对齐成功。因为1:8模式最多滑动8次必然回到初始位置最多尝试8轮。这里有个提速技巧不需要每次对比完整个训练序列。可以先对比前几个字节如果前2字节都匹配不上直接进入下一次滑动。一个典型的检测逻辑如下always (posedge clk_div or posedge rst) begin if (rst) begin slip_cnt 3d0; align_done 1b0; end else if (state BITSLIP_ALIGN !align_done) begin if (align_check_fail) begin slip_cnt slip_cnt 1b1; bit_slip_pulse 1b1; end else if (align_check_pass) begin align_done 1b1; bit_slip_pulse 1b0; end end end注意bit_slip_pulse只能拉高一个CLKDIV周期不能一直保持高电平否则ISERDESE2会每周期都滑动一位永远对齐不上。训练序列选择也有讲究。不能用全0、全1或者周期太短的pattern比如01010101这种因为这种pattern在滑动1bit后看起来和原来一样对齐检测根本区分不出来。推荐使用类似0x1F、0xE0交替的pattern或者直接用PRBS序列。PRBS的优点是随机性接近真实数据但检测逻辑稍复杂固定pattern简单可靠建议先从固定pattern开始调通再换成PRBS做压力测试。3.4 校准总线接口与上层交互一套自动校准机制要真正可用必须能给外部CPU比如ARM或上位机提供控制与状态接口。通常做法是挂一组寄存器几个关键寄存器如下偏移名称读写功能描述0x00CAL_CTRLRW校准使能、启动校准、模式选择0x04CAL_STATUSRO校准状态、锁定标志、错误计数0x08IDELAY_VALUERW手动或自动模式下的tap值0x0CSCAN_RESULTRO最优tap值、无错窗口宽度0x10ERROR_CNTRO校准后的累计误码数软件侧的流程是写启动位然后轮询状态位等校准完成后读取结果。这套接口我前后做过两个版本第一个版本只做了自动校准没有开放手动模式结果调试PCB信号质量时很痛苦每次想固定一个tap值看波形都做不到后来加了IDELAY_VALUE寄存器支持手动覆盖Debug效率大幅提升。所以强烈建议自动校准模块务必保留手动读写延迟值和手动触发BITSLIP的调试后门。4. 训练序列、误码统计和时序细节决定校准成败的隐藏因素前面把状态机和模块结构讲清楚了但这套机制能不能稳定工作还取决于一些很容易被忽略的细节。这章专门把这些隐藏因素翻出来晒一晒。4.1 训练序列模式的设计选择训练序列在自动校准中承担两个任务一是提供误码统计的参考pattern二是作为字对齐检测的基准。因此对训练序列有两条硬性要求误码统计时训练序列要有足够的随机性不能周期太短否则部分bit的翻转频率过低误码无法暴露。说白了就是20101010这种pattern只会锻炼到第0和第1bit的采样其他bit采错也发现不了。字对齐检测时训练序列在滑动1~7bit之后必须明显失配否则对齐检测会得出多个假阳性结果。推荐的做法是让训练序列由两级组成先发一段固定训练头比如连续发送0x1F、0xE0交替pattern用于识别字边界再发一段PRBS15序列用于精确的误码统计。字边界一旦锁定接收端就进入PRBS校验状态通过本地同样产生PRBS15序列做比对就可以得到精准的误码率。PRBS生成在FPGA中实现非常简单一个15级LFSR就够了。关键是要保证发送端和接收端的PRBS初始状态一致否则误码统计会误报。最简单的方案是在训练头中约定一个同步时刻比如接收端检测到连续4个正确的0x1F、0xE0后按固定的时序关系去复位本地PRBS生成器这样两端PRBS就能对齐。4.2 误码统计窗口参数的工程取值误码统计不能全凭感觉设要根据期望的误码率量级来反推。工程上通常要求校准后的误码率低于1e-12量级但校准过程中不可能统计那么多数据一般做到1e-9的判定水平就够了所以统计窗口就按这个标准算。以700Mbps为例并行数据宽度8bit并行时钟87.5MHz。如果统计1M字节耗时约11.4ms。1M字节中有8M个bit允许出现1个误码相当于误码率1.25e-7如果期望判据更严格可以统计4M字节允许1bit误码对应误码率3e-8。这个时间长度对于上电初始化来说是可以接受的。要注意的是训练期间的误码统计窗口和正常工作时的误码监控窗口应该分开设置。正常工作时的监控不宜过于敏感否则温度小幅波动引起的一两个误码就会触发重新校准反而影响用户体验。我一般把运行时的误码监控阈值放宽到训练时的10倍并且连续超过阈值才触发重校准。4.3 校准阶段的跨时钟域与复位处理再有就是状态机模块和ISERDESE2所在的时钟域问题。ISERDESE2输出的是并行时钟域CLKDIV的数据而校准状态机通常也跑在CLKDIV域这个没问题。但寄存器总线往往是慢速的APB或AXI-Lite总线时钟域从总线域到状态机域的控制信号需要做打拍同步和脉冲转换。这里必须提醒一个我曾经吃过大亏的点复位释放顺序。IDELAY2和ISERDESE2的复位释放不能和状态机复位同时进行。我实测中发现如果IDELAY2的复位释放过早延迟链可能还没稳定这时候写入的CNTVALUEIN值会丢失或者错乱。正确做法是先释放IDELAY2复位等待至少16个参考时钟周期确认IDELAY2锁定正常后再释放ISERDESE2复位最后才允许状态机启动校准流程。还有一个细节是BITSLIP的时序关系。BITSLIP只在CLKDIV的上升沿采样有效所以触发BITSLIP的脉冲必须和CLKDIV对齐。如果状态机是纯组合逻辑产生脉冲可能会出现亚稳态。稳妥的做法是在CLKDIV域内打一拍确保脉冲宽度正好一个CLKDIV周期。5. 上板实测与调试验证怎么判断一个校准机制是否真的好用仿真通过的自动校准机制上板后往往会暴露一堆问题。这一章没有任何代码都是实打实的硬件调试经验。分享一下我的实测流程和数据判断方法。5.1 自回环测试最简单的链路自检方法在正式对接远端设备之前先让FPGA自发自收。把OSERDESE2的串行输出直接通过PCB回环走线短接或FPGA内部IOB回环到ISERDESE2的输入然后跑一遍完整的自动校准流程。回环测试能验证哪些东西首先验证校准状态机本身的逻辑正确性其次能大致看出板级信号质量。如果回环测试都要扫描很长时间才能锁定或者锁定的无错窗口非常窄那大概率不是算法问题而是单板硬件设计有缺陷。我会记下回环测试时的最佳tap值和无错窗口宽度。比如700Mbps下回环测试的最佳tap值是tap14窗口宽度12个tap约936ps说明板级设计良好。后续对接远端设备时如果最佳tap值偏离超过4~5个tap就要怀疑连接器、线缆或者对端驱动能力有影响。5.2 扫描数据怎么解读一个典型的实测表格下面是一组我实测的IDELAY2扫描数据700Mbps每个tap统计4K字节不同tap值对应的误码情况如下Tap值误码数说明0~6持续误码采样点落在数据跳变沿之前70进入无错窗口80窗口内90窗口内100窗口内110窗口内120窗口内130窗口内140窗口内150窗口内160窗口内170窗口内180窗口内190窗口内200窗口内但接近边界212边缘不稳定22~31持续误码越过窗口采样点进入相邻bit这个数据里无错窗口从tap7到tap20宽度14个tap约1.09ns占700Mbps下bit宽度的76%说明信号质量非常好。最佳tap值取窗口中心也就是tap13或tap14附近留出的裕量两边各约7个tap这个裕量足以应对温度和电压漂移。如果实测数据出现窗口宽度只有2~3个tap甚至没有连续无错点不用怀疑先回去查硬件。最常见的几个原因LVDS差分对走线过长而没有做端接匹配、连接器接触不良、接收端差分端接电阻值不对LVDS需要100欧跨接在差分对上。5.3 运行中的稳定性监控校准完成后并不是一劳永逸。前面说过温度和电压漂移会导致采样点偏移所以实机运行时要加一个轻量级的误码监控模块。我的做法是正常数据模式中如果数据使能有效每收到N个字节就计算一次CRCCRC错误计到错误计数器。当错误计数器在100ms内超过了阈值状态机自动触发重新校准。重新校准不需要整个链路离线可以先暂停数据通路拉高训练使能让对端进入训练模式跑完校准流程后再恢复数据。这个过程中要处理好一个问题重新校准期间到达的数据怎么处理。我的方案是让后端FIFO保持读使能拉低并把FIFO写指针恢复到校准前的快照位置等校准完成后再继续接收新数据。如果对端数据是连续流无法暂停就只能退而求其次用滑窗的方式边校准边接收但这会显著增加复杂度。实际项目中大多数LVDS链路都支持短时间的训练握手这取决于对端设备是否配合。5.4 一个差点漏掉的坑BITSLIP成功后的第一个字最后分享一个调试中最难发现的bug。理论上BITSLIP对齐成功后ISERDESE2并行输出应该是连续正确的训练序列。但我当时遇到的情况是检测到对齐成功后训练头的前两个字节是正确的第三个字节开始偶尔错位而且是隔一段时间才出现一次。排查了整整一天最后用逻辑分析仪抓ISERDESE2内部信号才发现对齐成功的那一刻并行输出数据本身是好的但输出使能信号OFB和Q输出与数据之间有一个固定延迟差。后端逻辑看到使能就立即开始采数据实际上数据还没稳定导致采到了前一个并行数据的尾巴。解决方式是在使能信号和采样数据之间加一级流水线延迟让数据经过一级寄存器后再输出到后端。简单说使能打一拍数据也打一拍保证时序对齐。这种问题在仿真中几乎不会暴露因为仿真模型没有实际的IOB延迟差。这个经验让我明白一个道理凡是涉及硬件原语的数据通路使能信号和数据信号一定不能出现管理延迟和物理延迟的不一致否则就会有随机偶发的错位数据。6. 项目落地经验从原型验证到多通道并行校准的扩展方案如果前面说的都是单个LVDS通道的自动校准实现最后这部分聊一下怎么把它扩展到一个实际项目中。因为在真实产品里比如FPGA做MIPI转LVDS桥接或者RK3566主板外接LVDS屏幕往往不止一对差分线而是4对数据线加1对时钟线每一对都要独立做校准还需要保证通道间字节对齐这不是简单复制4份逻辑那么简单。6.1 逐通道校准与整体握手的配合多通道LVDS接收的自动校准有两种思路。一种是4个通道独立校准每个通道各自完成IDELAY2扫描和BITSLIP对齐然后以时钟通道为基准做跨通道对齐。另一种是选定一个主通道先校准然后把主通道的校准结果分发给其他通道做微调。实际推荐前一种因为不同通道的走线长度、连接器接触电阻、对端驱动器的通道间偏差都不完全一样强行让所有通道使用同一个tap值只要有一路偏了整个链路就挂了。独立校准的好处是每一路都能拿到自己的最佳tap值同时保证字边界对齐在各自通道上完成。跨通道对齐是在所有通道都完成BITSLIP匹配后做的。因为BITSLIP滑动是整字节级别的严格说是整字级别的操作不同通道的并行数据边界虽然各自对上了但彼此之间可能还差几个并行时钟周期的相位差。做法是以CLK通道的帧同步信号为参考对每个数据通道的并行FIFO做相位补偿通过调整FIFO读指针实现。6.2 校准参数的归档与回滚量产环境里校准机制的可靠性直接关系到直通率。如果你的产品每台单板在出厂前都要跑一遍自动校准那校准模块必须有参数归档能力。具体做法是把每台单板校准出来的最佳tap值、无错窗口宽度、误码统计值、校准耗时通过寄存器接口读出来写入单板的存储介质比如EEPROM或eMMC并存到产测系统里。这些参数有两大用处。第一如果后续单板在客户现场出现不稳定可以把历史校准数据和当前实时校准数据做对比判断是器件老化还是温度漂移导致的问题。第二通过观察大批量单板的校准参数分布可以反推PCB来料质量的一致性如果某批板子的最佳tap值分布方差突然变大说明PCB制造环节大概率出了问题。6.3 向其他FPGA平台迁移的注意点最后说一句迁移问题。这套方案基于Xilinx 7系列的ISERDESE2/OSERDESE2/IDELAY2原语如果你后续换到UltraScale系列原语名称会变为ISERDESE3、OSERDESE3和IDELAYE3配置参数有差异。比如UltraScale的IDELAYE3的tap分辨率不再是固定的78ps而是可以通过参考时钟频率配置的延迟步进更细校准精度可以更高但状态机的扫描范围和控制逻辑也需要相应调整。对于从7系列往UltraScale迁移的项目建议先把原语封装层抽离只暴露通用的tap设置、BITSLIP脉冲、数据输入输出接口这样底层原语替换时上层校准状态机可以完全复用。封装层的设计要预留好参数化配置的余地。我在一个项目里就是靠这层封装只花了不到两天时间就把整套校准机制从7系列迁移到了UltraScale平台而更早的版本里所有原语直接裸写在业务代码中光是找替换点就花了一周。LVDS高速传输的自动校准机制做到这一步基本就完整了。回过来看整套系统的核心并不复杂用IDELAY2找到正确的采样相位用BITSLIP找到正确的字节边界再用一个状态机把这两个动作自动串起来。难的是想清楚每一步在链路中解决什么问题、统计窗口如何设定、异常情况如何处理、以及如何在量产中保证可维护性。换一个链路速率、换一个FPGA平台这套思路是通用的。希望这些实战经验能帮你少走一些弯路尤其是文中提到的那些时序细节和隐藏的坑当年要是有人能提前告诉我我能省下好几个通宵。
RELATED READING

延伸阅读

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