您好,请问您异步FIFO的溢出操作时怎么样判断的?
1个回答
展开全部
一般情况下FIFO的长度为2的n次方,这样地址位可以全部使用上,有利于FIFO的循环使用。判断溢出和读空的方法有很多,网上也有介绍,我只在这里说一下我认为比较好的一个方法,就是FIFO的地址位设为n+1位(如:{n+1, n}),这样地址的低n位指向FIFO的实际空间,最高的那个n+1位可以做判断用。初始化时读地址和写地址都清空,设为相等值,读时读地址+1,写时写地址+1,如果读写地址完全相同,表示FIFO为空,此时禁止读;如果低n位相同,但是n+1位相反,表示FIFO为满,此时禁止写,如果不禁止的话就是溢出了(如果地址转换成格雷码,那么FIFO的状态比较就要参考高2位地址信息了)。另外异步FIFO要注意信号的跨时钟域同步问题,一般采用双锁存器同步法,可靠性适中,方法简单。
always @ (posedge Wr_CLK) //注意是写时钟频率信号
begin
Rd_Addr2 <= Rd_Addr1; //Rd_Addr2就是同步到写时钟频率上的读地址
Rd_Addr1 <= Rd_Addr; //Rd_Addr就是在读时钟频率上的读地址
end
当然用三寄存器锁存的方法可靠性更高,但是性能会受到影响。
always @ (posedge Wr_CLK) //注意是写时钟频率信号
begin
Rd_Addr2 <= Rd_Addr1; //Rd_Addr2就是同步到写时钟频率上的读地址
Rd_Addr1 <= Rd_Addr; //Rd_Addr就是在读时钟频率上的读地址
end
当然用三寄存器锁存的方法可靠性更高,但是性能会受到影响。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询