关注公众号FPGA开源工坊获取更多FPGA相关内容
交流群:838607138
异步FIFO的空和满是准确的吗
在我们关于两级同步器电路那篇推文里面提到了异步FIFO中格雷码进行同步的时候是允许漏采的,那么这个漏采会出问题吗,这篇推文我们就来讨论一下这个问题。
首先来说明一下异步FIFO的空满信号是怎么产生的
满信号是将读指针同步到写时钟域后进行判断产生的
空信号是将写指针同步到读时钟域后进行判断产生的
既然是异步FIFO,那么读写时钟域肯定是不一样的,最常见的一种情况就是读写时钟一个快一个慢的这种情况。另外一种情况是虽然读写时钟频率一样,但是不是由同一个时钟产生的,这样两个时钟也是异步时钟域。
那么既然有一个时钟快,一个时钟慢。就会产生以下两种情况
- 快时钟域去采样慢时钟域下的信号
- 慢时钟域去采样快时钟域下的信号
当快采慢的时候一般是不会出问题的,但是慢采快的时候就可能出现漏采的现象。
比如快时钟域下一个数字的变化为0,1,2,3,4,5,慢时钟域下去采样这个信号就可能只采到数字0,2,3,5等数字,也就是漏采的情况。
那么漏采会不会让异步FIFO的读写产生问题呢,下面仍然分两种情况来进行讨论。
读慢写快
进行满信号判断的时候是将慢时钟域下的读指针同步到比较快的写时钟域下,所以不会出现漏采的情况。但是由于同步是需要时间的,所以满信号可能会提前出现,不过这个不会对FIFO产生读写错误,因为满信号提前产生只会造成FIFO里面还有空间的时候,写不进去数的情况,也就是FIFO的利用率降低的情况。
进行空信号判断的时候需要将快时钟域下的写指针同步到比较满的读时钟域下,所以有可能出现漏采的情况。但是出现漏采会产生影响吗。比如FIFO的深度是10,那么写指针的循环范围就是0到9,假如说漏采了3,4,5这几个信号,读时钟域直接采到了6这个信号,这个时候还在往FIFO里面写数,写指针也在一直变化,这个时候只会让FIFO的空信号可能还是拉高的,但是FIFO还一直在进数,所以只会造成一种FIFO里面不是空的,但是空信号还拉高的情况,这种情况也不会对FIFO的读写逻辑造成任何的错误,只会造成FIFO在读的时候延迟了几个时钟周期。比如实际上第二个时钟周期就把数写进了FIFO,但是第五个时钟周期读端口才反应过来FIFO里面不是空的了。
读快写慢
进行空判断的时候需要将满时钟域下写指针同步到比较快的读时钟域下,所以不会出现漏采的情况。但是同步也是需要时间的,所以空信号可能会提前出现,也就是并不是真正的读空了,这个情况也不会造成FIFO的读写逻辑出现错误。
进行满判断的时候就需要将较快时钟域下的读指针同步到较慢时钟域下进行判断了,这个时候就可能出现漏采的情况。这个时候如果出现漏采,那么就会出现一种情况就是一个数据已经被读出去了,但是同步的时候没有被采样到,导致写时钟域下去判断满信号的时候认为这个时候FIFO满了,所以会出现假满的情况,但是这个也不会影响FIFO的读写正确性。
结论
也就是说FIFO的读写指针可能会产生漏采,但是这个漏采只可能导致FIFO的性能下降,而不会产生读写数据的错误。另外就是FIFO的空满信号可能会出现假空假满的情况。
标签:异步,漏采,读写,FIFO,信号,准确,时钟 From: https://www.cnblogs.com/A1112day/p/18450182