ARTICLE DETAIL

资讯详情

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

SLVS-EC v2.0封包结构详解:ECC与CRC校验机制及FPGA调试实战

SLVS-EC v2.0封包结构详解:ECC与CRC校验机制及FPGA调试实战 1. 从一根MIPI线缆说起为什么需要搞懂SLVS-EC的封包结构做工业相机、机器视觉或者高端影像设备的朋友大概率都绕不开Sony的CMOS传感器。而只要用到Sony的高端传感器SLVS-EC这个接口协议就一定会出现在你的BOM和调试清单里。SLVS-EC全称Scalable Low Voltage Signaling with Embedded Clock是Sony为自家高像素、高帧率传感器量身定制的一套高速串行接口。它和MIPI CSI-2最大的区别在于SLVS-EC把时钟嵌入到了数据通道里不需要单独的时钟差分对同时单通道速率可以拉到很高通道数还能灵活扩展。但问题来了。MIPI CSI-2有公开的规范文档网上资料一大把协议栈也成熟。SLVS-EC是Sony的私有协议公开资料极其有限很多做FPGA接收端的朋友拿到传感器之后对着示波器上的波形一脸茫然——数据是出来了但怎么解析封包结构长什么样ECC和CRC分别校验什么为什么有时候CRC一直报错但图像看起来又是对的我自己在做一个多目视觉项目的时候用Xilinx的FPGA接Sony IMX系列传感器走的就是SLVS-EC v2.0。从最开始抓波形到最终稳定出图中间踩了无数坑。这篇文章就把SLVS-EC v2.0的数据封包结构从头到尾拆一遍重点讲清楚ECC和CRC这两个校验机制到底怎么工作、在什么位置、出错了怎么排查。不管你是FPGA工程师、嵌入式驱动开发者还是做相机模组集成的只要你的链路里有SLVS-EC这些内容应该都能帮你省下不少调试时间。2. SLVS-EC v2.0的物理层与链路层先搞清楚数据是怎么过来的2.1 物理层的基本形态SLVS-EC的物理层采用差分信号传输每个Lane是一对差分线。和MIPI D-PHY不同SLVS-EC没有单独的时钟Lane接收端需要从数据流中恢复时钟。这就意味着接收端的CDRClock Data Recovery电路非常关键。SLVS-EC v2.0支持的Lane速率范围比较宽常见的有几种档位具体取决于传感器型号和配置。在实际硬件设计中有几件事必须注意。第一差分对的阻抗控制要严格通常要求100欧姆差分阻抗误差控制在10%以内。第二走线长度要尽量等长Lane与Lane之间的偏斜skew要控制在很小范围内否则接收端很难对齐。第三SLVS-EC的信号摆幅比MIPI要小所以对PCB材料和走线质量的要求更高。我见过不少项目因为走线没做好导致高速率下CRC错误率飙升的情况。2.2 链路层的帧结构概览SLVS-EC v2.0的数据传输以帧Frame为单位每帧包含若干个Packet。整个链路层的结构可以粗略分为三层最底层是Lane层负责字节对齐和Lane间同步中间是Packet层负责把有效数据打包成不同类型的Packet最上面是Frame层把多个Packet组织成一帧完整的图像数据。每个Packet都有一个HeaderHeader里包含了Packet类型、长度、地址等信息。Header之后是Payload也就是实际的数据内容。Payload后面跟着的是校验字段包括ECC和CRC。这里要注意ECC和CRC的作用范围是不一样的后面会详细展开。Lane的分配方式也值得说一下。SLVS-EC支持多Lane并行传输数据会按照一定的规则分配到各个Lane上。接收端需要先把各个Lane的数据收集齐然后按照相同的规则重新组装。如果Lane之间的同步没做好重组出来的数据就会错位导致后续所有解析都失败。2.3 为什么时钟恢复这么关键前面提到SLVS-EC没有独立时钟Lane接收端要从数据中恢复时钟。这个过程依赖于数据流中的跳变沿。如果数据长时间不变CDR电路可能会失锁。SLVS-EC协议里通过编码方式保证了足够的跳变密度但实际调试中如果发现接收端偶尔失锁往往和信号完整性有关而不是协议本身的问题。我在调试的时候就遇到过一次FPGA的CDR偶尔会失锁导致整帧数据丢失。后来用示波器看眼图发现是某一段走线的阻抗不连续导致的反射。重新做了阻抗匹配之后问题就消失了。所以如果你在调试SLVS-EC时遇到间歇性的数据错误先别急着怀疑协议解析代码用示波器看看信号质量往往更有效。3. Packet类型与Header结构数据封包的核心骨架3.1 SLVS-EC v2.0定义了哪些Packet类型SLVS-EC v2.0的Packet类型比较丰富常见的有以下几种Frame Start Packet标记一帧的开始包含帧号等信息。Frame End Packet标记一帧的结束。Line Start Packet标记一行数据的开始。Line End Packet标记一行数据的结束。Embedded Data Packet携带传感器嵌入的数据比如曝光时间、增益等寄存器信息。Pixel Data Packet实际的有效像素数据。Standby Packet空闲状态下发送的填充Packet。Register Read/Write Packet用于读写传感器寄存器。每种Packet的Header结构略有不同但基本都包含Packet类型标识、Payload长度、以及一些控制字段。理解这些Packet类型是解析数据流的第一步因为接收端需要根据Header来判断当前Packet是什么类型然后决定怎么处理Payload。3.2 Header的字节布局SLVS-EC v2.0的Header通常是固定长度的具体字节数取决于配置。Header里最关键的几个字段包括字段名称位宽说明Packet Type若干位标识Packet类型Payload Length若干位Payload的字节数Frame Number若干位帧号用于检测丢帧Line Number若干位行号用于检测丢行Reserved若干位保留位通常填0Header的解析看起来简单但实际调试中有几个容易出错的地方。第一位序问题。SLVS-EC的位序可能是MSB first也可能是LSB first取决于具体配置搞反了就会解析出完全错误的Packet类型。第二Header本身也有ECC保护如果ECC校验失败说明Header在传输过程中出错了这个Packet应该被丢弃。第三Payload Length字段如果解析错误会导致后续所有数据的偏移都错位整个数据流就乱了。3.3 Payload的组织方式Payload的组织方式和Packet类型有关。对于Pixel Data PacketPayload就是一行像素数据按照传感器的输出格式排列。比如RAW10、RAW12等格式每个像素占用的字节数不同打包方式也不同。对于Embedded Data PacketPayload通常是一组寄存器值需要按照传感器的寄存器映射来解析。这里有一个实际经验在处理Pixel Data Packet时一定要注意字节对齐和像素打包方式。有些传感器会把多个像素打包到一个字节流里比如RAW10格式下4个像素占5个字节。如果接收端没有按照相同的规则解包出来的图像就会出现规律性的条纹或者颜色错误。我刚开始调试的时候就因为这个问题折腾了好几天图像总是有周期性噪点后来发现是RAW10的解包方式搞错了。4. ECC校验Header的守护者4.1 ECC在SLVS-EC中的位置和作用ECCError Correcting Code在SLVS-EC v2.0中主要用于保护Header。每个Packet的Header后面都会跟着ECC校验位。ECC和CRC最大的区别在于ECC不仅能检测错误还能纠正一定数量的错误位。在SLVS-EC中ECC通常采用汉明码Hamming Code的变种能够纠正单比特错误并检测双比特错误。为什么Header要用ECC而不是CRC因为Header非常关键如果Header解析错了整个Packet就没法正确处理。ECC的单比特纠错能力可以在一定程度上容忍传输过程中的偶发错误提高链路的鲁棒性。而Payload数据量大用ECC的话开销太大所以用CRC做错误检测就够了。4.2 ECC的计算原理ECC的计算基于汉明码的原理。简单来说就是把数据位按照一定的规则分组每组计算一个校验位最终得到一组校验位。接收端收到数据后用同样的规则重新计算校验位然后和收到的校验位比较。如果比较结果不为零说明有错误根据比较结果的模式可以定位到具体是哪一位出错然后翻转该位即可纠正。在SLVS-EC v2.0中ECC的保护范围通常覆盖整个Header。具体的ECC位数和生成矩阵取决于协议版本和配置。实际实现时FPGA端需要按照Sony的规范来实现ECC的计算和校验逻辑。这里要注意ECC的计算是按位进行的不是按字节所以实现的时候要特别小心位序和分组方式。4.3 ECC校验失败的排查思路如果你在调试中发现ECC校验频繁失败可以从以下几个方面排查第一检查信号完整性。ECC失败说明Header在传输过程中出现了位错误最常见的原因就是信号质量不好。用示波器看眼图检查是否有过冲、振铃、反射等问题。第二检查Lane同步。如果多个Lane之间的同步没做好Header可能会错位导致ECC校验失败。可以尝试降低Lane速率看看ECC失败率是否下降。如果降速后问题消失说明是时序余量不够。第三检查ECC实现逻辑。如果信号质量没问题Lane同步也没问题那就要怀疑ECC的计算逻辑是否正确。可以构造已知的Header数据手动计算ECC然后和FPGA的输出对比。提示ECC校验失败不一定意味着数据不可用。如果ECC能够成功纠正错误Header仍然可以被正确解析。但如果ECC检测到不可纠正的错误这个Packet就应该被丢弃。5. CRC校验Payload数据的完整性保障5.1 CRC在SLVS-EC中的覆盖范围CRC在SLVS-EC v2.0中主要用于保护Payload数据。每个Packet的Payload后面都会跟着CRC校验值。CRC的覆盖范围通常包括Header和Payload但具体范围取决于协议配置。CRC是一种循环冗余校验通过多项式除法来计算校验值。接收端用同样的多项式对收到的数据进行除法运算如果余数为零说明数据没有错误。CRC和ECC的分工很明确ECC保护HeaderCRC保护Payload。这样设计的原因是Header短小但关键适合用ECC做纠错Payload数据量大用CRC做检错更经济。5.2 CRC多项式和计算方式SLVS-EC v2.0使用的CRC多项式是特定的具体值需要参考Sony的规范。常见的CRC多项式有CRC-16、CRC-32等SLVS-EC用的可能是其中一种或者自定义的多项式。计算方式通常是逐位或者逐字节进行具体取决于实现。在FPGA中实现CRC计算时可以用LFSR线性反馈移位寄存器的方式也可以用查找表的方式。LFSR方式资源占用少但速度可能受限查找表方式速度快但需要更多的存储资源。实际选择取决于你的速率要求和资源预算。这里有一个容易踩的坑CRC的初始值和最终异或值。不同的CRC标准有不同的初始值和最终异或值如果搞错了计算出来的CRC就会完全不对。SLVS-EC的CRC初始值和异或值需要严格按照规范来设置。我在第一次实现的时候就因为初始值搞错了导致CRC一直报错查了好久才发现问题。5.3 CRC错误的常见原因和排查方法CRC错误是SLVS-EC调试中最常见的问题之一。根据我的经验CRC错误的原因可以归纳为以下几类错误类型可能原因排查方法偶发CRC错误信号完整性问题检查眼图、阻抗匹配规律性CRC错误Lane同步问题检查Lane对齐逻辑持续性CRC错误CRC实现逻辑错误用已知数据验证CRC计算特定Packet类型CRC错误Payload长度解析错误检查Header解析逻辑高速率下CRC错误时序余量不足降低速率测试偶发CRC错误通常和信号质量有关。如果CRC错误率很低比如每几万帧才出现一次那可能是信号余量不够可以通过调整均衡参数或者改善PCB走线来解决。规律性CRC错误往往和Lane同步有关比如某个Lane的数据总是偏移一个字节导致CRC计算范围错位。持续性CRC错误基本可以确定是逻辑实现问题需要仔细检查CRC计算代码。还有一种情况值得单独说有些朋友会发现CRC错误很多但图像看起来没什么问题。这是因为CRC错误的Packet可能只占很小一部分而图像数据有一定的容错性少量错误不会导致明显的视觉异常。但这并不意味着可以忽略CRC错误因为在高可靠性应用中任何数据错误都可能导致严重后果。6. 实战调试从抓波形到稳定出图的完整链路6.1 调试工具和环境准备调试SLVS-EC最基本的工具是一台高带宽示波器最好带差分探头。带宽要足够覆盖SLVS-EC的最高速率否则看到的波形会失真。除了示波器还需要一个协议分析仪能够抓取SLVS-EC的数据流并解析出Packet结构。如果没有专用的协议分析仪可以用FPGA的ILAIntegrated Logic Analyzer来抓取内部信号。在FPGA端建议先把接收链路搭起来包括CDR、字节对齐、Lane同步、Packet解析、ECC校验、CRC校验等模块。每个模块都要有调试接口能够输出内部状态和错误计数。这样在调试的时候可以快速定位问题出在哪个环节。6.2 逐步排查的完整流程我的调试流程通常是这样的第一步确认物理层信号质量。用示波器看差分信号的眼图检查幅度、上升时间、过冲、振铃等指标。如果眼图不好先解决硬件问题。第二步确认CDR锁定。检查FPGA的CDR模块是否能够稳定锁定锁定指示是否持续有效。如果CDR偶尔失锁检查参考时钟质量和信号跳变密度。第三步确认字节对齐。SLVS-EC的数据流需要先做字节对齐找到Packet的起始边界。通常协议里会有同步字或者特定的对齐模式。如果字节对齐没做好后续所有解析都会错位。第四步确认Lane同步。多Lane情况下需要确保各个Lane的数据能够正确对齐和重组。可以发送已知的测试图案检查重组后的数据是否正确。第五步验证ECC和CRC。用已知的Packet数据手动计算ECC和CRC和FPGA的输出对比。如果一致说明校验逻辑正确如果不一致检查计算逻辑。第六步检查Packet解析。确认各种Packet类型能够被正确识别Payload长度解析正确帧号和行号连续。第七步检查图像数据。如果前面都没问题图像应该能够正常输出。如果图像有异常检查像素解包逻辑和格式转换。6.3 几个真实踩坑案例案例一图像出现周期性横纹。这个问题困扰了我很久图像每隔几行就会出现一条暗纹。后来发现是Line Start Packet的解析有问题导致某些行的数据偏移了一个字节。修复了Line Start Packet的解析逻辑后问题消失。案例二CRC错误率随温度升高而增加。这个问题的根源是时序余量不足。在常温下CRC错误率很低但温度升高后信号延迟变化导致采样点偏移CRC错误率飙升。解决方法是在FPGA端调整IDELAY值增加时序余量。案例三ECC偶尔报错但图像正常。检查后发现是Header中的保留位被传感器填了非零值而我的ECC计算逻辑假设保留位为零。修正后ECC不再报错。这个案例说明实现ECC和CRC时一定要严格按照规范不能想当然。7. 写给正在调试SLVS-EC的你一些实用建议如果你正在调试SLVS-EC我有几个建议可以帮你少走弯路。第一先搞定硬件再搞软件。很多看起来是协议解析的问题根源其实是信号完整性问题。花时间把PCB走线、阻抗匹配、电源滤波做好后面调试会顺利很多。第二用好FPGA的调试资源。ILA和VIO是非常强大的工具可以实时观察内部信号。把关键信号都接到ILA上出问题的时候可以快速定位。第三从低速开始调试。先把Lane速率降到最低确认整个链路能够正常工作然后逐步提高速率。这样可以把速率相关的问题和逻辑相关的问题分开。第四保留详细的错误日志。ECC错误计数、CRC错误计数、丢帧计数、丢行计数这些统计信息对于定位问题非常有帮助。我在项目里专门做了一个错误统计模块把各种错误计数通过寄存器暴露出来调试的时候一目了然。第五多和传感器厂商的FAE沟通。SLVS-EC是私有协议很多细节不会写在公开文档里。Sony的FAE手里通常有更详细的规范和应用笔记遇到搞不定的问题找他们支持往往比自己在网上搜资料更有效。最后说一个我自己的体会SLVS-EC的调试过程确实比较磨人但一旦把链路跑通稳定性还是很好的。关键是要有耐心一步一步排查不要跳过任何一个环节。很多时候问题就藏在那些你觉得“应该没问题”的地方。
返回列表