并行Crc-32计算以太网10GE MAC

时间:2017-01-19 05:42:54

标签: vhdl ethernet crc32 data-link-layer

我用VHDL生成了以太网10GE MAC设计。现在我正在尝试实施CRC。我有一个VHDL的64位并行CRC-32发生器。

规格:
- 数据总线为64位
- 控制总线为8位(验证数据字节)

问题:
假设我的传入数据包长度为14字节(假设没有填充)。

在一个时钟周期内计算前8个字节的CRC,但是当我尝试在剩余的6个字节上计算CRC时,由于附加了零,结果是错误的。

有没有办法可以使用64位并行CRC生成器为任何长度的字节数据包长度生成CRC?

我尝试了什么:
我使用了不同的并行CRC生成器(8位并行CRC,16位并行CRC生成器等)。但这会消耗大量的FPGA资源。我想使用64位并行CRC生成器来节省资源。

2 个答案:

答案 0 :(得分:1)

从一个恒定的64位数据字开始,将有效的CRC寄存器带到全零。然后使用零字节前置消息,而不是附加它们,将这些零放在首先处理的64位字的末尾。 (您没有提供CRC定义,因此这取决于CRC是否被反射。如果反映了CRC,则将零字节放在最低有效位位置。如果没有反映CRC,则将它们放入在最重要的位位置。)然后使用32位常数的异或结果。

因此,对于该示例,您将首先向并行CRC生成器提供64位常量,然后在第一个字中提供两个零字节和六个字节的消息,然后在第二个字中提供八个消息字节。然后使用32位常数进行异或或结果。

对于标准PKZIP CRC,64位常量为0x00000000ffffffff,32位常量为0x2e448638,前置零字节位于64位字的底部。< / p>

如果您控制CRC生成器的实现,那么您可以修改它以在重置生成器时将有效CRC寄存器初始化为全零,从而无需提供64位常量。

答案 1 :(得分:0)

我不能说肯定,但如果您可以在数据包的 start 而不是最后填充零,那么您应该得到正确的答案。它取决于多项式和初始化器......

请在此处Best way to generate CRC8/16 when input is odd number of BITS (not byte)? C or Python

查看此答案