多片FPGA级联通信 —— 数据流缓冲FIFO的深度如何选择

                    多片FPGA级联通信 —— 数据流缓冲FIFO的深度如何选择

0  背景

        最近接触的项目中,涉及到多片FPGA级联模式下,数据流的收发如何进行合理的缓存是需要重点考虑的。由于多片FPGA之间的通信接口均采用相同的传输速率1.25Gbps,故理论上在接收端采用缓冲FIFO即可将数据流完整的接收,并保存在本地SDRAM中。

         由于上一级和后一级的FPGA传输接口速率相同,理论上缓冲FIFO的深度可以趋近于单帧数据流的数据量即可。本项目数据帧的数据载荷为512,故在实际项目设计时,我设置的FIFO深度为512*2=1024,从理论上讲,该缓冲FIFO的存储深度满足要求。

多片FPGA级联模式为: FPGA0 <==>  FPGA1 <==>  FPGA2... ...

 

1  仿真测试&板级测试

        收发链路组成为:FPGA0将自产生的512帧数据流通过Aurora协议的GTX硬核接口发送给后一级的FPGA1,FPGA1每接收到单帧数据流写入缓存FIFO后,便触发FIFO 相关标志信号,于是FPGA1将该帧数据发送给后一级的FPGA2。单帧数据流的数据量为512,缓存FIFO的深度设定为1024,FIFO标志信号设定为读数据量rd_cnt >= 512。

        收发链路实际测试结果见下图:

        由上图1所示,tx_fram_cnt为FPGA0发送的数据帧计数器,tx_rowcnt为FPGA1将接收的FPGA0数据帧转发给FPGA2的帧计数器。tx_tvalid_o为数据帧数据有效使能信号。

        理论上,FPGA0发送第1帧数据后,FPGA1接收并缓存该帧数据,然后转发给后一级的FPGA2,故FPGA0的发送数据帧计数器数值应该始终比FPGA1数据帧计数器多1,不能>1或者<1。

       由实际仿真测试和板级测试可知,图1所示,FPGA0和FPGA1的发送数据帧计数器二者差值为1,与理论相吻合。但是随着发送数据帧的帧数的累加,当整个收发链路发送的数据帧超过一定时,数据帧计数器二者的差值为2,不等于1。参见上图2所示。

        于是,经过实际测试可以推断,FPGA1发送数据帧的平均传输速率略小于FPGA0的发送速率。由于缓存FIFO的深度为单帧数据量的2倍,理论上当FPGA0发送速率比FPGA1发送速率快时,只要二者累计发送数据量相差不超过FIFO富裕的存储深度:1帧数据量时,是完全满足前后两级之间数据流的缓存的。

      经实际测试发现,虽然FPGA0与FPGA1与FPGA2均采用完全相同的收发链路和通信速率,但由于芯片级之间的传输过程中,各个基于Aurora协议的收发接口之间的数据流传输效率还是存在细微差异,随着帧数的累计,该细微的差异会不断累加,造成超出缓存FIFO的富裕容量,从而造成数据流传输拥堵,造成丢帧现象。当然,如果前一级的传输速率≤后一级的传输速率,则不会造成FIFO富裕容量不足引起的数据流的拥堵现象。

 

2  解决方法

       上述测试发现该问题:由于前后两级的数据传输速率细微差异的累积效应,造成后一级缓存FIFO的溢出现象,从而造成数据流拥堵而产生数据帧的丢失。

       该问题我也是经过测试才发现的,因为当初理想的认为,缓存FIFO的深度设定为缓存数据帧数据量的2倍,且前后级的数据传输速率理论相同,应该足以保证数据流的缓存,但是却忽视了传输速率细微差异的累积效应。板级测试结果见下图:

        由上图板级测试结果可知:rx_rowcnt为FPGA1接收到FPGA0发送的512帧数据,已全部接收。tx_rowcnt_o为FPGA1发送给后级的FPGA2的数据帧仅为511帧,二者相差1帧数据,表明因FIFO缓存富余量不足,已有1帧接收到的数据帧因FPGA1来不及发送造成FIFO溢出而丢失。

 

        为解决该问题,常见的有两种方法:

        (1)通过人为增加数据传输速率快的FPGA0端的单帧数据发送的冗余时间,使得FPGA0端的传输速率降低为<后级FPGA1的传输速率;

       优点:无需增加缓存FIFO的深度;    缺点:人为增加冗余时间的合适量如何设定,即增加多少合适,这个需要实际板级反复迭代测试。也会降低数据流传输的有效速率。

        (2)最简单的方法:通过实际测试,当发送完全部的数据帧后,通过对比二者数据帧计数器的差值,即可间接得出,缓存FIFO深度的富裕容量需要增加到多少。

        本项目经过测试,当链路单次发送完全部的512帧数据后,二者的差值为2,故缓存FIFO的富裕容量应该>2帧数据量。因此,缓存FIFO的存储深度由原来的1024增加到2048,富余量为3帧数据量,故理论上满足要求。修改之后,经过测试,发现全部512帧数据均被完整的发送给后级FPGA,问题得到很好地解决。程序修正后的板级测试结果见下图。

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值