用动态数据包长度在verilog中实现CRC16

Implementing CRC16 in verilog with dynamic data packet length

感谢您阅读本文并提供所有帮助。无论如何......我正在尝试在verilog中用多项式x ^ 16 + x ^ 12 + x ^ 5 + 1实现一个crc16。我遇到的问题是我没有在某个时间点获取整个数据包。我一次得到一个 32 位字,字数是动态的,但至少是 4 个字,可以高达 16384 个字或更高。时间不是什么大问题,因为我在 150 MHz 时钟上 运行 并且输入最多进入 33 MHz 时钟,但可能是 10 MHz。这并没有真正影响我,因为我首先通过 FIFO 接受数据。

我一直在尝试开发 FSM,但确实遇到了障碍。一个想法是等待所有数据,然后将整个数据作为一个大数据包输入;但是,这似乎效率很低,我只是认为我不需要这样做。此外,它可能会占用宝贵的资源。我玩的另一种方法是输入第一个单词并进行异或运算。然后,当输入数据只剩下 1 到 2 位未进行异或运算时(不确定措辞是否正确),我将输入下一个单词。根据输入,我将继续计算 CRC,然后是另一个输入,直到最后一个词被输入模块。

使用这种方法,我需要以某种方式实现计数器或移位寄存器。无论如何,任何帮助都会很好。这进入命令 parser/packet 解析器。非常感谢您的帮助。

CRC 计算不需要一次一位地连续进行。您基本上可以 "unroll" 计算得出并行 CRC 生成器的每一位的单独方程。有了它,您可以创建一个 CRC 生成器,一次处理 32 位输入数据,匹配您的数据路径宽度。这应该会简化您的设计并使其具有更高的性能(无论如何,串行处理每一位都不能满足您的吞吐量要求,除非您不介意在硬件生成 CRC 时阻止传入数据)。