一、出问题的接口电路介绍 riple
在该例中,与FPGA连接的是一颗协议转换芯片,该芯片把并行ATA协议转换为串行ATA协议,FPGA驱动该芯片的并行传输协议接口。 riple
二、时序问题的表现 riple
该时序问题的表现是正常的传输会突然停止,并且无法自动恢复,直到手工给该芯片复位。 riple
该时序问题的另一表现是传输停止的时刻有一定的规律,即传输某一地址范围的数据时问题反复出现,在传输其他地址范围的数据时,问题不出现。 riple
该FPGA接口电路在直接与主板的并行ATA接口连接时没有该问题出现,可以正常连续运行。 riple
三、时序问题的定位 riple
导致该问题定位困难的原因有以下两点: riple
该问题的定位用去了近一个月的时间。这是相当令人困惑和苦恼的一个月,在此期间,我一直假设问题的出现是逻辑错误导致的,试图抓取问题出现时FPGA内部逻辑中的非正常现象。但是这一假设是错误的。 riple
在此期间,我对可能导致该问题的逻辑原因进行了多种假设和实验。其中有几次实验结果似乎支持我的假设,而且短期测试都可以观测到问题加剧或问题消失的现象,但是最终这些假设和改进方法都被长期测试失败证伪了。 riple
随着实验数据的积累,我逐步把“路灯下能找的地方都找遍了”。在此期间也逐步对问题的“脾气”有了一些了解。 riple
在某几次实验过程中,我有意或者无意地把用来测试的高速并行接口协议换成了另外一种速度较低的传输协议,偶尔会出现一些异常现象,但是当我试图重现时,异常现象又不出现了。所以我又回到了高速传输协议的实验上,因为在这种情况下,原有问题出现的最为频繁。但是后来证明,这几次实验出现的异常现象并不是偶然的。 riple
在尝试了我能想到的所有方法后,我不得不承认走到了“山穷水尽”的地步。和领导协商后,我决定放弃该接口的高速传输协议,改用低速传输协议,以换取稳定性。问题就在此时“柳暗花明”起来。 riple
在低速传输协议的稳定性测试过程中,随着实验力度的加大和实验数据的积累,我发现,该问题在低速传输协议的接口上也会出现,只是出现的频率下降了许多,表现形式有一些差异。这些表现形式和出现频率上的差异导致我没能在先前的实验中很快地识别出该问题。在短期测试中表现为偶然的现象,在长期测试中表现为必然。 riple
走到这一步,我翻回头去把先前积累的实验数据和现象总结了一下,发现了如下规律: riple
正是这第三条规律给前面两条规律增添了新的内涵,指引我对前面两条规律做出了新的推测。 riple
由于高速和低速传输协议的接口时序差别很大,二者唯一的共同点就是数据总线和地址总线。地址总线在传输过程中没有变化,不会是导致问题的原因,所以导致问题唯一可能的原因是数据总线。 riple
由于问题的出现与主机访问的硬盘地址有关,开始我曾经怀疑过不同的地址对于主机命令的响应时间不同会导致问题的出现,后来通过加入可控的命令延时恶化延时因素,结果证明与此无关。现在看来,是不同地址对应的不同数据内容导致了问题的出现。那么,数据内容是怎样影响到接口的呢? riple
数据内容的变化反映到接口就是数据总线的跳变。如果是某种模式的数据总线跳变导致了接口的异常,那么为什么我没有在逻辑分析仪捕获的波形中观察到协议异常呢?为什么直接与主板连接的方式不会导致异常呢?而且在ATA协议的UDMA传输方式中针对接口数据传输错误专门有检错机制,数据错误不是导致异常的原因。并行接口的数据跳变并不会影响到自身。 riple
比较主机直连的方式与通过芯片转换连接的方式,二者的差异在于串行协议的存在。在接口电路板上,串行接口有专门的模拟地,并且在并行接口的数字地与串行接口的模拟地之间有磁珠隔离,并行接口的数据总线跳变对串行接口的干扰没有直接的传播媒介。那么可能的干扰传播媒介就是电磁场,该干扰应该是电磁干扰(EMI)。(另外的干扰传播途径可能是电源和芯片衬底,见下注) riple
串行ATA协议(SATA)采用的物理信号是LVDS低压差分信号,具有一定的抗共模干扰的能力。并行接口对串行接口的干扰应该是共模干扰,而且强度达到了串行接口的承受极限,系统处于临界状态。(注:这一分析可能有误,差分信号的抗共模干扰能力非常强。所以不应该是直接干扰,应该是SSN对电源的干扰。可以参考ARM IQ的一篇文章:Meeting The High-Speed Serial Link Challenge - Volume 5, Number 2, 2006) riple
由此我得到了如下推测:特定地址的访问会产生特定的数据总线跳变模式;并行接口的数据总线EMI对串行接口产生了干扰,在特定的数据模式下,EMI强度最大,该干扰导致串行传输协议出现数据传输错误;由于串行传输协议的链路层存在检错和出错重传机制,串行接口发生重传,某些重传可以成功,但是会导致传输速度下降;某些重传仍然会受到并行接口EMI的影响,重传反复发生,传输速度进一步下降;该过程形成正反馈,最终导致串行传输协议传输层或更上层的协议发生错误,传输中止。这一推测也解释了该问题出现前传输速度下降的现象(上述规律四)。 riple
四、时序问题的解决 riple
确认了EMI问题,下一步就是怎样解决的问题。EMI的发生需要三个条件:干扰源、传播媒介、易受干扰的受害者。在当时的情况下,这三个条件中,唯一可控的就是干扰源——FPGA驱动的数据总线。 riple
我查阅了Cyclone芯片的数据手册,找到了信号跳变与EMI的联系:信号边沿的上升和下降时间,时间越短,EMI越强。影响FPGA输出信号的上升时间的因素有三个: riple
在Assignment Editor中对上述因素进行了设置,采用3.3V LVTTL + 4mA + Slow Slew Rate + Output Delay设置方式,使信号上升时间达到最大,产生的EMI最小,问题也就解决了。 riple
下面是采用示波器观察到的信号上升时间比较。 riple
Fast Slew Rate + 24mA + no Output Delay = 2.25ns上升时间 riple
Slow Slew Rate + 4mA + Output Delay = 4.65ns上升时间 riple
硬盘的上升时间 = 8.85ns riple
从上面的比较看来,即使采用了最佳的约束,FPGA的输出信号上升时间仍然与硬盘驱动的信号存在很大的差距,这也是IDE硬盘与转接电路板连接不会出现问题的原因。硬盘的接口芯片应该采取了专门的处理,在芯片的制造工艺上采取了措施。这一点无从考证。 riple
五、避免和解决该问题的方法归纳 riple
参考资料:解决高速串行连接面临的挑战 riple
Input Signal Edge Rate Guidance
用户1703049 2014-12-3 08:34
用户377235 2014-12-2 16:18
牛逼
wangsuiyun2010_769594014 2012-9-25 10:51
用户1122702 2010-3-8 10:41
用户1359586 2009-8-10 14:59
用户1143941 2007-8-30 14:36
好厉害,我正想看怎么分析延时,到现在也没弄明白。
用户64245 2006-11-2 22:14
说的很有理哦!
用户1092765 2006-10-26 11:06
很好,我早看过咯
用户936143 2006-10-26 08:29