3

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

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

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

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

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

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

4

2 回答 2

1

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

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

对于标准 PKZIP CRC,64 位常量是0x00000000ffffffff,32 位常量是0x2e448638,并且前置零字节进入 64 位字的底部。

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

于 2017-01-19T15:40:12.790 回答
0

我不能肯定地说,但是如果您可以在数据包的开头而不是结尾填充零,那么您应该得到正确的答案。它确实取决于多项式和初始化程序......

在此处查看此答案当输入为奇数位(不是字节)时生成 CRC8/16 的最佳方法?C 或 Python

于 2017-01-19T06:42:30.400 回答