作者:饿狼传说,来源: FPGA的现今未微信公众号
注:本文由作者授权转发,如需转载请联系作者本人
在最近的工作中,又遇到了丢包逻辑的设计。突然想到在FPGA设计中,这是一个非常常见的功能,所以做一个简单的总结。那么什么是丢包逻辑呢?有一个常见的场景就是收到一个数据单元(比如一帧图像,一个网络报文等)后,经过检测,发现这是一个错误的数据单元,故需要丢弃。如下图所示:

那如何高效地丢弃该数据单元呢?这里介绍2种常用的方法供参考。
方法一:FIFO法
该方法的核心思想是将数据单元写入fifo中,并记录错误标记。在从fifo中读出数据的时候,根据错误标记丢弃错误的报文。如下图所示:数据单元写入到一个fifo中,同时经过检测电路判断该数据单元是否有错误,将对应的标记写入到另一个fifo中,形成cmd_data fifo的结果。在读的时候,先读标记fifo中的数据,再读data fifo中的数据,如果标记fifo指示该报文错误,则把data fifo中读出的数据丢弃。
该方法用一个fifo存放标记,可以是一个非常小的分布式fifo,甚至采用一个简单的移位寄存器都可以实现。

方法二:RAM覆盖法该方法又分为2种方案,写入覆盖法和读出丢弃法。
写入覆盖法的核心思想是将数据单元先写入到RAM中,然后利用下一个数据单元将错误的数据单元覆盖。如下图所示,该方案中,需要锁存每一个数据单元的首地址。假设第二个数据单元(黄色部分)是错误的,第三个数据单元本应该从地址11开始写入,但是因为第二个数据单元是错误的,所以第三个数据单元继续从地址5开始写入,达到覆盖错误数据单元的目的。

读出丢弃法,该方法不覆盖错误数据,每当检测到数据单元是错误的后,将错误标记写入该数据单元的首地址处。在读数据的时候,在每个数据单元的首地址处,如果读出的数据有错误标记,则直接丢弃该数据。该方法和fifo法类似,但是使用fifo无法在在数据单元的首个地址写入错误。
上述3种方法,从复杂度来看,fifo法还是相对比较简单,不容易出错,建议采用这种方案来实现丢包。