在FPGA中基于信元的FIFO设计方法

设计工程师通常在fpga上实现fifo(先进先出寄存器)的时候,都会使用由芯片提供商所提供的fifo。但是,由于其通用性使得其针对性变差,某些情况下会变得不方便或者将增加硬件成本。此时,需要进行自行fifo设计。本文提供了一种基于信元的fifo设计方法以供设计者在适当的时候选用。这种方法也适合于不定长包的处理。

  fifo在数字通讯芯片领域中有两个主要的作用,缓冲数据和隔离时钟。对于fifo的设计,最关键的问题是如何实现ram的读写双方的信息交换。一般情况下,设计者都直接调用厂商为自己的fpga专门打造的fifo核。基本单元是fifo所使用的ram的一次读写操作的最小单元,如一个字节,一个字或者是一个双字。所谓操作粒度,即fifo的读写双方的信息交换是基于这些基本单元。

  atm应用中的fifo设计

  以atm的设计为例,在atm的相关设计中,设计者则更多希望一个fifo对外给出的信息是“现在fifo中还剩下几个信元”。要实现这一功能通常有两种方法:

  1. 调用厂商提供的以操作粒度为基本单元的通用fifo,然后在这个fifo的外面再加上一个“套子”。这个套子里面设计一些计数器,根据计数内容对外提供相应的信息。

  2. 设计操作粒度为信元的定制fifo。这样对外直接提供设计者最希望得到的信息,即fifo中还有多少个信元。

  设定fifo最多可以存放4个信元。基本单元为字节,因此ram的数据宽度为8位,一个信元的长度为53字节。

  把ram分成4个信元区域,读写地址的高二位指明信元区域,低六位指明信元区域内的字节地址,这样组合成8位读写地址。读写双方的信息交换是互相通知对方还有多少个信元在fifo中。读写双方都拥有自己的记分牌(scoreboard),这个记分牌可以由一个四位的寄存器来实现,每一位对应一个信元区域。当一个信元区域中有一个完整的信元的时候,记分牌的相应的寄存器被设置为‘1’,否则为‘0’。读出方读出一个信元,修改自己记分牌的动作叫做清位。写入方写入一个完整信元,修改自己记分牌的动作叫置位。

  从逻辑上说,只需要读出方把自己的记分牌的信息(清位信息)传送给写入方,同时写入方把自己的记分牌的信息(置位信息)传送给读出方就可以了,即只要构成两条逻辑通道就可以满足需求。但是,在硬件上的实现却要比这种只从逻辑上的思考要复杂。由于读写双方有可能处在不同的时钟域,所以当读写双方交换信息的时候就需要处理信号采样的亚稳态情况。我们使用下面的方法来处理信号亚稳态。

  消除信号亚稳态

  在读、写入方之间建立下面的四条单向数据通道:传送写入方到读出方的置位信息(wr2rdset);写入方到读出方的清位信息(wr2rdrst);读出方到写入方的清位信息(rd2wrrst);读出方到写入方的置位信息(rd2wrset)。由于读出方只发生清位信息,而写入方只发生置位信息,所以信息本身只有两个。四条通道可以被划分为两个信息组:一个组(rd2wrrst和wr2rdrst)传递清位信息,叫清位信息组;一个组(wr2rdset和rd2wrset)传递置位信息,叫置位信息组。读出方使用清位信息组,写入方使用置位信息组。这样做的目的是为了建立起一个稳定的握手机制。在读出方设置一个专门的发送电路,当此发送电路通过rd2wrrst发出了清位信息后,等待写入方通过wr2rdrst通道送回关于这个信息被接收的确认。当收到这个信息的确认后,读出方发送电路复位。同样的,写入方也有一个发送电路,操作过程同读出方一致,无非是使用置位信息组。这两个发送电路都各由四个寄存器组成,一位对应一个信元区域。

  为了解决rd2wrrst进入写入方时引起的信号亚稳态,需要在写入方设置一个专门消除亚稳态的电路模块。根据rd2wrrst和rd2wrset特点不一样,这个模块有多种设计方法,但是其宗旨都是使用连续两次采样的方式。

  这里介绍一种比较简单的方法。在设计的时候,把rd2wrrst和rd2wrset的信号都设计为电平方式,即当读出方要发送一个信元区域的清位信息的时候,就把rd2wrrst信号通道里对应的信元区域位设置为‘1’。这个‘1’电平一直保持到写入方的确认到达。当这个‘1’电平被写入方采样的时候,由于‘1’同步于读出方的时钟,所以很有可能会产生写入方第一次采样为一个不确切

  • 在FPGA中基于信元的FIFO设计方法已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计