FIFO的控制本来应该比较简单,只是我们的系统中需要将FIFO读空,同时又要防止读空的FIFO。所以这里所谓的“读空”有两层含义。
为了将FIFO读空,所以逻辑判断一旦FIFO的空标志empty为0,就立即产生一个FIFO读有效信号rdreq。
前面笔者另一篇博文里有介绍,如果仅安照上述方法控制FIFO的读,就有可能会错误地读一次“空”的FIFO。笔者在那篇博文介绍了如何防止读空的FIFO的方法,即在产生FIFO读有效信号的条件是empty为0的同时usedw要大于1。但是经过实际调试发现这样控制FIFO读的后果是FIFO里总是有一个数据无法读出,所以就达不到项目要求的将FIFO读空的目的了。
所以通过判决usedw大于1是无法读空FIFO的,所以正确的方法只能采取那篇博文介绍的第三种方法。即:
第一步根据空标志“empty”信号产生一个读操作的中间信号(其实就是将empty取反打一拍);
第二步是将此中间信号和empty的反相与产生最终的读信号。
-------------------------------------分割线2013.06.18----------------------------------------------
其实这个问题的根源是为了解决这样两种情况:
第一种情况:假如FIFO里有很多数据,比如一个已满的FIFO,这时候FIFO一段时间没有数据需要写入,只是需要将FIFO里的所有数据读出,注意这里只是假设一种极端情况,就像电影里的慢放一样。那么当读到FIFO只剩下一个数据的时候,上述第二种方法能确保将这最后一个数据读出后不会再误发一个读,即读空的FIFO这样误操作。
第二种情况:系统上电后FIFO必然是空的,假如这时候有一个数据满足条件被写入到了FIFO,但是后面很长时间没有满足条件的数据了,我们的系统要求,一旦FIFO里有数据就得立即将数据读出来。如果是这种情况那么上述第二种方法是不会产生读FIFO的控制的,因为控制条件是需要usedw大于1,而这时候usedw=1,不符合条件。所以为了及时将FIFO读空,就需要使用第三种方法。
coyoo 2015-8-21 08:53
用户452520 2015-8-20 23:47
coyoo 2013-6-20 11:39