一、出问题的异步接口介绍 riple
下图是主机(PC机)以MDMA的方式访问IDE硬盘设备的时序图,这里采用FPGA设计的是设备端的接口。 riple
DIOR-/DIOW-信号由主机驱动,“读/写”数据在“DIOR-/DIOW-”信号的上升沿被“主机/FPGA”采样。注意,DIOR-/DIOW-信号是用负逻辑表示的,图中下降沿对应物理信号的上升沿。 riple
图中tD=70ns,tK=25ns,tG和tH分别是20ns和10ns。 riple
该接口看似简单,读出数据时由FPGA对主机的控制信号DIOR-和片选信号译码后驱动,采用组合逻辑实现;写入数据被FPGA在DIOW-上升沿采样,用于数据输入。时序问题就出现在数据写入接口上。 riple
数据写入接口的处理是这样的: riple
这样一来,采用“先暂存,再写入”的方式,原本与FPGA片内50MHz时钟异步的数据就变为同步的了。 riple
二、时序问题的表现 riple
该接口的问题表现为数据错误,即采用“先写后读”方式进行连续的1个扇区数据传输校验会出现读写数据不一致的现象。 riple
通过察看出错时存储介质上的数据,发现数据错误出现在写入阶段,读出阶段没有问题。 riple
该数据错误有三个显著的特点: riple
举个例子:原本是15、16、17、18的数据序列(1),出错后变成15、17、17、18数据序列(2)。 riple
这里有一个问题,同样是数据重复,可不可以认为序列(2)的错误模式等同于15、16、16、18数据序列(3)的错误模式呢?不可以。 riple
其实,序列(3)和序列(2)是截然不同的。序列(3)的错误模式是已经出现的数据16覆盖了将要出现的数据17,导致16、16、18的不连贯;序列(2)的错误模式是将要出现的数据17覆盖了已经出现的数据16,导致15、17、17的不连贯。 riple
所以,序列(2)模式是该时序问题的第三大特点。 riple
由于我最初认为错误模式是序列(3)类型的,找错了方向,没能找到导致问题出现的原因。 riple
三、时序问题的定位 riple
我的一名同事发现并指出了序列(2)与序列(3)错误模式的差异,并指出这样一个矛盾:在数据写入过程中,接口电路只有“预知”将要写入的数据才会出现序列(2)的错误模式,而“预知”是不可能出现在数字电路中的。 riple
在此基础上,我反复思考了导致“预知”现象背后的原因。 riple
首先,“预知”是不可能发生的,在这个不合理的现象背后一定有合理的原因。其次,这样一个成熟的接口电路在逻辑上不会出现“预知”现象,一定是我对该接口进行的处理导致了该现象。再次,该现象随机出现,而且孤立,所以不可能是逻辑问题,应该是接口时序问题,而且是偶然事件导致的。 riple
那么,是什么样的偶然事件在怎样的时序下导致一个正常的电路出现不正常的行为呢?先定义两个概念。 riple
从总线数据被暂存到暂存的数据被写入FIFO存在一定的时间间隔——数据暂存时间。暂存时间的长度由两级同步电路的形式唯一确定,取值为2~3个同步时钟周期。 riple
从DIOW-的上升沿到上升沿的时间间隔——采样周期。Write DD(15:0)在DIOW-的上升沿被采样,采样周期由MDMA协议规定,但是实际电路运行时会出现“不遵守”规定的现象,毛刺就是一种违规现象。 riple
理论上,采用“先暂存,再写入”的方式是没有问题的。这样处理本质上是流水线方式,只要暂存时间小于采样周期即可保证电路正确运行,即使总线数据在采样时刻之后很快发生变化,电路也不会出错。在本例中采用周期为20ns的时钟对DIOW-进行两级同步,暂存时间为40~60ns,而采样周期是100~120ns,符合上述要求。 riple
但是,如果在某些情况下采样周期发生了变化,缩小到小于暂存时间(40~60ns),那么暂存的数据就会被更新,如果此时总线上的数据已经被下一个采样周期的数据驱动,就会出现“预知”数据的现象。 riple
由于采样周期仅决定于FPGA看到的DIOW-的上升沿,造成采样周期变小的可能原因是DIOW-信号的毛刺。这样看来,该数据采样电路的数据正确性对DIOW-的毛刺是敏感的。 riple
那么,毛刺有没有可能符合上述条件:发生在DIOW-上升沿之后的40~60ns之内,并且恰好同时总线上的数据已经被新数据驱动了呢? riple
我们回到先前对该接口处理的说明上来。由于各个南桥芯片的设计不同,该接口给出的时序图与真实情况有些差异,特点如下: riple
根据特点1,只要毛刺出现在DIOW-的上升沿之后20ns到40~60ns的时间范围内,就会确定发生“预知数据”的时序问题;根据特点2,在这一时间间隔内,唯一可能引发DIOW-信号毛刺的事件是发生在DIOW-的上升沿之后25~30ns处的DIOW-信号的下降沿跳变。 riple
上图是该电路的时序仿真波形,在两个时间光标之间的波形就是暂存数据受到DIOW-信号下降沿毛刺影响后改变的情况,该毛刺最终导致数据序列(2)错误模式的发生。 riple
四、时序问题的解决 riple
解决该问题可以从两方面入手: riple
在跨时钟域信号处理中,对DIOW-信号进行两级同步处理是可靠和标准的做法,代价是2~3个时钟周期的延时。当同步时钟周期为20ns时,40~60ns的时延是不可避免的。只有当时钟周期小于6.67ns时,同步带来的时延才会小于20ns,才能消除不安全的数据暂存时间。 riple
所以,解决该问题的根本方法是采用150MHz(6.67ns)的时钟进行第一次数据同步,在暂存数据的安全时间内把暂存数据转存到150MHz时钟域内,然后把转存的数据同步到50MHz的时钟域内。 riple
用150MHz的时钟对DIOW-信号进行采样会导致同一时间间隔内获得更多的采样点,增加了采样到DIOW-信号毛刺的概率,采样到的毛刺会被同步电路放大成同步脉冲,该脉冲仍然会导致错误的数据被同步到50MHz时钟域内。 riple
所以,采用150MHz时钟进行第一次采样需要增加滤除毛刺的电路,使采样到的毛刺不能通过该滤波电路,从而消除毛刺的影响。 riple
修改后的电路如下图: riple
时序仿真波形如下图。可以看到,虽然DD_temp被DIOW-下降沿处的毛刺破坏了,但是同步到150MHz和50MHz时钟域的数据没有受到影响;从图中还可以看出毛刺滤除电路的作用,和高频时钟更容易把毛刺放大的现象: riple
五、避免和解决该问题的方法归纳 riple
用户562928 2009-12-7 12:36
用户1088969 2009-8-21 10:51
ash_riple_768180695 2009-2-4 13:56
用户203913 2009-2-4 10:16
用户203913 2009-2-4 10:15
ash_riple_768180695 2009-1-17 22:00
用户203913 2009-1-16 13:41
用户1454104 2008-11-27 09:26
用户131284 2008-4-19 14:57
用户119502 2007-8-30 14:43