异步 FIFO 设计管理论文 摘要:使用 FIFO 同步源自不同时钟域的数据是在数字 IC 设计中常常使用的方法,设计功能正确的 FUFO 会遇到很多问题,探讨了两种不同的异步 FIFO 的设计思路。两种思路都能够实现功能正确的 PIFO。 关键词:异步 FIFO 握手同步二进制格雷码 本文所讨论的 FIFO,从硬件的观点来看,就是一块数据内存。它有两个端口,一个用来写数据,就是将数据存入 FIFO;另一个用来读数据,也就是将数据从 FIFO 当中取出。与 FIFO 操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。FIFO 控制器通过外部的读写信号控制这两个指针移动,并由此产生 FIFO 空信号或满信号。 对于异步 FIFO 而言,数据是由某一个时钟域的控制信号写入 FIFO,而由另一个时钟域的控制信号将数据读出 FIFO。也就是说,读写指针的变化动作是由不同的时钟产生的。因此,对 FIFO 空或满的推断是跨时钟域的。如何根据异步的指针信号对 FIFO 的满状态或空状态进行正确的推断是本文讨论的重点。此外,设计过程中的一些细节问题也将在文中涉及到。 1 指针以及满空信号的产生 为了更好地说明问题,先探讨一下同步 FIFO 指针移动以及满空信号的产生过程。对于同步 FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。在 FIFO 非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。假如 FIFO 处于空的状态,下一个读动作将会导致向下溢出(underflow),一个无效的数据被读人;同样,对于一个满了的 FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示 FIFO 处于满状态,对满信号复位表示 FIFO 非满,还有空间可以写入数据;对空信号置位表示 FIFO 处于空状态,对空信号复位表示 FIFO 非空,还有有效的数据可以读出。 当读指针和写指针相等也就是指向同一个内存位置的时候,FIFO 可能处于满或空两种状态。可以通过不同的方法推断或区分FIFO 究竟是处于满状态还是空状态,也就是究竟是写指针从后赶上了读指针,还是读指针从后赶上了写指针。本文所应用的方法是设置一个额外的状态位,指针由它的地址位以及状态位组成。地址位随着相应的操作递增,指...