riple

Stay Hungry, Stay Foolish.

FPGA时序问题一例——电磁干扰和引脚驱动电流约束

0
阅读(3858)

一、出问题的接口电路介绍

在该例中,与FPGA连接的是一颗协议转换芯片,该芯片把并行ATA协议转换为串行ATA协议,FPGA驱动该芯片的并行传输协议接口。

二、时序问题的表现

该时序问题的表现是正常的传输会突然停止,并且无法自动恢复,直到手工给该芯片复位。

该时序问题的另一表现是传输停止的时刻有一定的规律,即传输某一地址范围的数据时问题反复出现,在传输其他地址范围的数据时,问题不出现。

该FPGA接口电路在直接与主板的并行ATA接口连接时没有该问题出现,可以正常连续运行。

三、时序问题的定位

导致该问题定位困难的原因有以下两点:

1. 缺乏对该芯片内部运行状态的了解和观测方法。
2. 缺乏对芯片另一侧的串行传输状况的有效观测方法。芯片另一侧的串行传输速率达到1.5Gb/s,而且由于是低压差分信号,无法用逻辑分析仪观察。

该问题的定位用去了近一个月的时间。这是相当令人困惑和苦恼的一个月,在此期间,我一直假设问题的出现是逻辑错误导致的,试图抓取问题出现时FPGA内部逻辑中的非正常现象。但是这一假设是错误的。

在此期间,我对可能导致该问题的逻辑原因进行了多种假设和实验。其中有几次实验结果似乎支持我的假设,而且短期测试都可以观测到问题加剧或问题消失的现象,但是最终这些假设和改进方法都被长期测试失败证伪了。

随着实验数据的积累,我逐步把“路灯下能找的地方都找遍了”。在此期间也逐步对问题的“脾气”有了一些了解。

在某几次实验过程中,我有意或者无意地把用来测试的高速并行接口协议换成了另外一种速度较低的传输协议,偶尔会出现一些异常现象,但是当我试图重现时,异常现象又不出现了。所以我又回到了高速传输协议的实验上,因为在这种情况下,原有问题出现的最为频繁。但是后来证明,这几次实验出现的异常现象并不是偶然的。

在尝试了我能想到的所有方法后,我不得不承认走到了“山穷水尽”的地步。和领导协商后,我决定放弃该接口的高速传输协议,改用低速传输协议,以换取稳定性。问题就在此时“柳暗花明”起来。

在低速传输协议的稳定性测试过程中,随着实验力度的加大和实验数据的积累,我发现,该问题在低速传输协议的接口上也会出现,只是出现的频率下降了许多,表现形式有一些差异。这些表现形式和出现频率上的差异导致我没能在先前的实验中很快地识别出该问题。在短期测试中表现为偶然的现象,在长期测试中表现为必然。

走到这一步,我翻回头去把先前积累的实验数据和现象总结了一下,发现了如下规律:

1. 传输停止的时刻有一定的规律,即传输某一地址范围的数据时问题反复出现,在传输其他地址范围的数据时,问题不出现。通过外部逻辑分析仪观察并行传输接口,出错时的传输时序与正常时的传输时序没有显著差异。
2. 该FPGA接口电路在直接与主板的并行IDE接口连接时没有该问题出现,可以正常连续运行。
3. 在采用高速或低速数据传输协议时,该问题都会出现。
4. 系统出现异常之前的几次传输速度显著下降,并且呈现速度递减的趋势,直到传输中止。

正是这第三条规律给前面两条规律增添了新的内涵,指引我对前面两条规律做出了新的推测。

由于高速和低速传输协议的接口时序差别很大,二者唯一的共同点就是数据总线和地址总线。地址总线在传输过程中没有变化,不会是导致问题的原因,所以导致问题唯一可能的原因是数据总线。

由于问题的出现与主机访问的硬盘地址有关,开始我曾经怀疑过不同的地址对于主机命令的响应时间不同会导致问题的出现,后来通过加入可控的命令延时恶化延时因素,结果证明与此无关。现在看来,是不同地址对应的不同数据内容导致了问题的出现。那么,数据内容是怎样影响到接口的呢?

数据内容的变化反映到接口就是数据总线的跳变。如果是某种模式的数据总线跳变导致了接口的异常,那么为什么我没有在逻辑分析仪捕获的波形中观察到协议异常呢?为什么直接与主板连接的方式不会导致异常呢?而且在ATA协议的UDMA传输方式中针对接口数据传输错误专门有检错机制,数据错误不是导致异常的原因。并行接口的数据跳变并不会影响到自身。

比较主机直连的方式与通过芯片转换连接的方式,二者的差异在于串行协议的存在。在接口电路板上,串行接口有专门的模拟地,并且在并行接口的数字地与串行接口的模拟地之间有磁珠隔离,并行接口的数据总线跳变对串行接口的干扰没有直接的传播媒介。那么可能的干扰传播媒介就是电磁场,该干扰应该是电磁干扰(EMI)。(另外的干扰传播途径可能是电源和芯片衬底,见下注)

串行ATA协议(SATA)采用的物理信号是LVDS低压差分信号,具有一定的抗共模干扰的能力。并行接口对串行接口的干扰应该是共模干扰,而且强度达到了串行接口的承受极限,系统处于临界状态。(注:这一分析可能有误,差分信号的抗共模干扰能力非常强。所以不应该是直接干扰,应该是SSN对电源的干扰。可以参考ARM IQ的一篇文章:Meeting The High-Speed Serial Link Challenge - Volume 5, Number 2, 2006)

由此我得到了如下推测:特定地址的访问会产生特定的数据总线跳变模式;并行接口的数据总线EMI对串行接口产生了干扰,在特定的数据模式下,EMI强度最大,该干扰导致串行传输协议出现数据传输错误;由于串行传输协议的链路层存在检错和出错重传机制,串行接口发生重传,某些重传可以成功,但是会导致传输速度下降;某些重传仍然会受到并行接口EMI的影响,重传反复发生,传输速度进一步下降;该过程形成正反馈,最终导致串行传输协议传输层或更上层的协议发生错误,传输中止。这一推测也解释了该问题出现前传输速度下降的现象(上述规律四)。

四、时序问题的解决

确认了EMI问题,下一步就是怎样解决的问题。EMI的发生需要三个条件:干扰源、传播媒介、易受干扰的受害者。在当时的情况下,这三个条件中,唯一可控的就是干扰源——FPGA驱动的数据总线。

我查阅了Cyclone芯片的数据手册,找到了信号跳变与EMI的联系:信号边沿的上升和下降时间,时间越短,EMI越强。影响FPGA输出信号的上升时间的因素有三个:

1. I/O标准(I/O Standard),因标准而异。
2. 驱动电流强度(Current Strength)。电流越大,上升速度越快。电流从24mA到4mA不等。
3. 信号坡度(Slew Rate),分为快慢两种。
4. 输出延时(Output Delay),加入延时可以减缓上升速度。

在Assignment Editor中对上述因素进行了设置,采用3.3V LVTTL + 4mA + Slow Slew Rate + Output Delay设置方式,使信号上升时间达到最大,产生的EMI最小,问题也就解决了。

下面是采用示波器观察到的信号上升时间比较。

Fast Slew Rate + 24mA + no Output Delay = 2.25ns上升时间

Slow Slew Rate + 4mA + Output Delay = 4.65ns上升时间

硬盘的上升时间 = 8.85ns

从上面的比较看来,即使采用了最佳的约束,FPGA的输出信号上升时间仍然与硬盘驱动的信号存在很大的差距,这也是IDE硬盘与转接电路板连接不会出现问题的原因。硬盘的接口芯片应该采取了专门的处理,在芯片的制造工艺上采取了措施。这一点无从考证。

五、避免和解决该问题的方法归纳

1. ATA协议中规定了传输信号的转换速率,这一点在设计电路板时应加以考虑和处理,在FPGA的约束上也要加以注意。
2. EMI问题的定位比较困难,尽量在设计阶段解决,不要遗留到调试阶段。
3. 特定数据模式或特定地址传输导致的问题,需要考虑接口的EMI问题。因为接口是没有智能的,不会识别和挑剔数据内容。
4. FPGA的引脚驱动能力会影响EMC,在某些情况下导致EMI问题。当发生EMI问题时,约束电流强度是一种可行的解决方法。
5. 在调试过程中,对于小概率发生的事件可以采用多个实验并行进行的方式缩短实验时间。
6. 对实验现象的解释需要大胆猜测,小心论证。

参考资料:解决高速串行连接面临的挑战pdf

Input Signal Edge Rate Guidance

Jitter and EMC

Baidu
map