复杂的Synchronous FIFO设计

  • FIFO,即First Input First Output,是一种先入先出的存储器,其功能是:用户将数据写入该器件进行存储,当用户读数据时,先写入的数据会被先读出,即读出的数据的顺序仍然是写入时的顺序。一般意义的存储器需要用户提供地址和数据两条信息,这样才能进行写入和读取操作。写入时,会写到用户指定的地址,而读取时,也会从用户指定的地址读取,但FIFO不同,数据地址时由内部生成的,用户无须提供地址,只需提供读、写控制线和数据。FIFO有两种典型的应用场景,一种是保序,另一种是缓冲。保序即保持顺序。缓冲应用于顺势写入和读取速度不匹配的场合。
    请添加图片描述
  • 如上图所示,假设上位记的瞬时写入速率为2Mb/s,而下位机的瞬时读取速度只有1Mb/s,说明下位机的额处理速度无法与上位机的数据供给速度想匹配,此时,下位机只能选择丢失数据。如果在上位机和下位机之间插入FIFO,如上图所示,则上位机可以按照自己的速度向FIFO中写数据,而下位机也可以按照自己的速度从FIFO中取数据,只要FIFO的深度够深,即存储空间足够大,就不会出现数据丢失的现象。这里要强调的是作为缓冲的FIFO,只能调节瞬时的速率不匹配现象,不能调节持续性的速率不匹配现象。图中的上位机和下位机,长期来看,两者平均的输入/输出速率是相等的,中间使用FIFO才有效,对于速率长期不相等的情况,FIFO迟早会溢出,即它内部的存储空间会被全部占满,仍然会造成数据的丢失。一般将瞬时性的高速传输称为Burst操作,即多个数据连续传输,中间不间断。大多数传输机制不是匀速的,例如WIFI系统,当有数据需要传输时,就会发起传输,当无数据时,就空闲。长期统计的速率和瞬间的速率是不同的。再例如传输电影等流媒体数据和浏览网页、打游戏的Burst速率是不一样的,流媒体是确定性的大文件,发起传输时报文较长,每个报文之间有均匀的间隔,因为用户播放的速度是确定的,而浏览网页和打游戏是不可预测的操作,用户可能会频繁地操作不同网页或任务动作,而每项操作都对应较短的报文,报文间隔也不确定,因此,上位机和下位机的速率匹配是设计中应该重点关注的问题,特别是有线以太网高速传输领域,传输速度可以达到成百上千Gb/s,一旦发生数据丢失,就会影响到很多用户的上网体验。
  • FIFO一般分为同步FIFO和异步FIFO。同步和异步是根据驱动时钟而言的,当写入数据的时钟与读取数据的时钟为同源时钟时,称为同步FIFO,不同源则为异步FIFO。同步FIFO设计相对简单,而异步FIFO由于需要处理异步时钟的读写,所以相对复杂。
    请添加图片描述
    一个典型同步FIFO的框图如上图所示,它的左边接上位机,即写FIFO的设备,右边接下位机,即读FIFO的设备。 FIFO本质上是一个存储器,存储介质可以是寄存器、 SRAM、DDR等。上位机会对FIFO发起写操作,wr是写使能脉冲,wr_dat是写入的数据,这两个信号是对齐的。上位机在发起写操作前,会读FIFO的满状态指示信号full或almost_full,因为FIFO的存储空间可能被写满,此时再写入数据必然会发生数据丢失现象。full状态信号表示FIFO的存储空间已经被全部占满,而almost_full状态信号表示存储空间并未被全部占满,但已经达到了用户设置的临界点,用户可以用cfg_almost_full配置线设置该临界点。下位机对FIFO发起读操作,rd是读使能脉冲,rd_dat是读出的数据,根据存储介质类型、存储空间的大小的不同、读出数据的延迟也不同,有的是rd发出后一拍输出数据,有的是两拍输出数据,要根据实际情况来定,不能一概而论。下位机在发起读之前,先要采样FIFO的状态信号empty或almost_empty,empty表示FIFO内存全空,因此不支持读取数据,而almost_empty表示虽然FIFO内存中尚存在一些数据,但数据较少,处于用户配置的cfg_almost_empty以下,以此发出警告。fifo_num用于实时反应FIFO内存中的数据数量。
  • almost_full和almost_empty常被称为水线,即将FIFO视为一个水桶,输入数据犹如灌水,读取数据亦如放水。当水位低于almost_empty时,会警告下位机,令其降低放水速度。当水位高于almost_full时,会提示上位机,令其降低灌水速度。原本,FIFOF只需full和empty两种状态信号,但是,在以Burst方式通信时,上位机灌水不是每输入一个数据先看一下full状态,而是只看一下full状态,就往FIFO中连续灌很多数据,此时,almost_full就很有必要了,它会告诉上位记停止以Burst方式灌水。同理,下位机在使用Burst方式读取时,也需要almost_empty提醒它停止Burst读取。两条水线一般设置为稍大于Burst的长度。
  • FIFO的内存形式可以是寄存器、SRAM或DDR,它的制造成本是逐级降低的。寄存器,即常用的触发器,其特点是读写可以同时发生,读出来的是原来的数据,写入的数据在下一拍才进入寄存器中。使用的是寄存器时,代码中才会一个组合逻辑讨论wr和rd的状态。对于SRAM等器件,写和读诗互斥的,因此,当上位机发起写的同时下位机发起读,此种情况被称为访问冲突,必须写一个仲裁机制判断优先读还是优先写,优先顺序不同,最后实现出来的效果也不同,这需要根据系统的实际需要来定。一般,对于深度和位宽较少的FIFO,使用寄存器实现较为方便,而对于深度和位宽较大的FIFO,可以考虑使用SRAM,而深度和位宽特别大诗,应该使用DDR。
  • FIFO的压栈也是高速数据处理中常见的问题。一个FIFO总会有满,上位机写不进去,就必须暂存到本地,那么本地也需要开辟一个FIFO,以缓存这些发不出去的数据,以此类推,一旦后续处理速度跟不上,前级就会层层压栈,直到最后所有的FIFO都满了,系统崩溃。因而数据处理的主要议题就是上位机的速度和下位机速度的匹配,既包括平均速率,又包括上位机的Burst写入速率。当下位机难以承担该速率时,FIFO起到缓冲Burst操作的作用,因此FIFO的基本深度应为一倍的Burst长度,在面积允许的情况喜爱,推荐2到3倍的Burst长度。
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值