自己在看Vijay A.Nebhrajani关于异步fifo结构文章时,存在的两个疑惑,在这里记录一下.
困惑:读写时钟肯定会有快慢关系的存在,而用格雷码同步后的信号,发送到慢时钟一端,也有可能会采不到,需不需要做一个展宽处理?但是,做展宽处理,你就必须知道时钟快慢关系,这样,设计的异步fifo是不是不具有通用性. 困惑:例如读慢写快的fifo,会不会因为做同步的关系,导致写地址同步到读数据一端,有可能会造成遗漏,影响空满判断?
思路:我们用格雷码做同步,相邻只有1bit会发生变化,这样,其他的几位是可以保证百分之百被慢时钟采到的(前提是这几个位恰好被慢时钟采到),那么我们采到的位。例如:0110和0010,0110是0010后面的地址.
0110是满足full条件的地址,如果发生亚稳态,0110变成0010,这样,意味着full会晚一点到来,不会有错误产生.
首先,要理解空满条件
满,是当同步过来的读地址等于当前的读地址,这是一个近乎满的条件;因为实际的读地址是滞后同步过来的读地址的,实际的读地址可能早已发生了变化.
读慢写快,要达到空条件的一个隐含条件是读追写,写要很长时间才写一个,或者停下.
读慢写快,写地址肯定会被遗漏下的.如果,写停下了,读追上写的话,那么写停下的地址不会发生变化,肯定会被采到,这样判断空条件没有一点问题。
如果,读到了写同步的地址是4,写立刻就又开始写入数据了,下一时刻,读的地址是4,但写的地址可能是8,10之类的,但也不会发生空标志的满足条件了。
读慢写快着重于full条件的判断,即可。判断空条件,因为遗漏的写地址不会造成空标志判断错误,所以不需担心.