首页 > 编程知识 正文

异步fifo优点,同步fifo和异步fifo的区别

时间:2023-05-06 03:36:27 阅读:60268 作者:494

由FIFO操作的时钟字段分为同步/异步FIFO。 同步FIFO是指读时钟和写时钟在相同的时钟沿暂时同时发生读/写。 异步FIFO的读写时钟不一致,读写相互独立。 读写指针的结构读取指针:始终指向下一个要读取的单元格,复位时指向第一个单元格(编号0 );

写入指针:始终指向当前读取的数据,复位时,指向第一个单元格(编号0 );

FIFO“空/满”检测FIFO设计关键:生成可信的FIFO读/写指针和生成FIFO的“空/满”状态标志。

很明显,当FIFO满了,就不能写新数据了。 否则,会导致数据溢出。 空状态,即最近写入的数据已经读取完毕,无法重新读取。 否则,读取的数据将变为无效数据。

1.读空信号(rd_empty)

一般来说,读写指针相等时,表示FIFO为空。 这在复位操作时、读取指针读取FIFO的最后一个字后追赶写入指针时有效。

如下图所示。

2.写满信号(wr_full)

读写指针再次相等时,表示FIFO已满。 这是因为,当写入指针旋转一周后返回时,wrapped around赶上了读取指针,如下图所示。

上述FIFO的读写状态基于读写指针的比较,但问题是两者的判断条件是读写指针相等。 区别在于,写入指针写满一圈后,会再次赶上读取指针。 这个应该怎么标注呢?

怎么区分是满状态还是空状态呢?

3.FIFO读写状态的判断方法

有以下两种方法。

(1)extra bit

一般而言,深度为N=2^n的FIFO中,地址的位宽为n,其读写地址的位宽也为n。 有n个存储单元,如果数据位宽为w,则其FIFO的容量为n*w位。

添加到指针的位(extra bit,即地址的MSB )现在是n 1位。 此extra bit用于指示写入指针是否递增并超出最后一个FIFO地址。 如果超过,则MSB加1,其他位将被清除。 对读取指针也执行同样的操作。 深度为8的FIFO时,作为折回标志必须采用3 1位(0000-1000、1001-1111 ),作为折回标志必须采用MSB,作为地址指针必须采用后3位。

判断机制如下:

*如果两个指针的MSB不同,则写入指针将比读取指针多折回一次。 例如,r_addr=0000,且w_addr=1000。

*如果两个指针的MSB相同,则两个指针的折回次数相同。 另外,剩下的位相等(表示FIFO为空)。

(2)设置数据计数器

设置data_counter,并在启用写入时每次写入data计数器时同时递增1; 此计数器在读取操作期间每次读取一个data时递减1。 这样,如果data_counter为0,则FIFO为空,如果data_counter被计数到FIFO深度deep,则指示FIFO已满。

由于计数器会消耗额外的资源,因此如果FIFO较大,FIFO的读取/写入速度可能会降低。

读写指针表示读写指针的代码有很多种,但上述指针以二进制代码形式表示。

1. 二进制FIFO指针

使用二进制计数器,将计数值从一个时钟同步到另一个时钟时容易出现问题,因为所有位都可能同时发生变化。 在同一时钟下同步多个信号时,会发生准稳定性问题。 因为只有更改一位才使用格雷码,所以在两个时钟字段之间同步多个位没有问题。 因此,需要将地址值转换为对应的gray代码,将该gray代码与其他时钟字段同步进行比较,作为空闲状态检测的二进制到gray代码的转换电路。

2. gray码表示指针

使用格雷码解决了一个问题,但也带来了另一个问题。 格雷码怎么判断天空和满足?

空的判断

两者仍然完全相等(包括MSB );

满的判断

如下图所示,gray码除了MSB以外具有镜像对称的特征,因此如果读取指针指向7,写入指针指向8,则除MSB以外的其余比特都相同,不能说都满。 因此,不能简单地检测到最高位,如果gray代码判断为已满,则必须同时满足以下三项。

与wptr同步的rptr的MSB不相等。 因为wptr必须比rptr多折返一次;

wptr和rptr的顺序不相等上图中的位置7和位置15将转换为二进制数。 是0111和1111。 MSB根据说明多折回一次,111表示相同的位置。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。