感谢您阅读本文以及所有帮助。无论如何......我正在尝试用verilog中的多项式x ^ 16 + x ^ 12 + x ^ 5 + 1实现crc16。我遇到的问题是我不能在一个时间点获得整个数据包。我一次得到一个32位字,字数是动态的,但至少是4个字,可以高达16384个字或更高。时间不是问题,因为我运行的是150 MHz clk,输入最多是33 MHz clk但可能是10 MHz。这对我没有影响,因为我首先通过FIFO接受数据。
我一直在尝试开发FSM,但确实遇到了障碍。一个想法是让我等待所有数据然后只输入整个数据包作为一个大数据包;然而,这似乎效率很低,我认为我不需要这样做。此外,它可能会占用宝贵的资源。我玩的另一种方式是输入第一个单词并进行XOR操作。然后,当输入数据只剩下1到2位未被xored(不确定是否正确)时,我会输入下一个字。在输入时,我将继续计算CRC,然后是另一个输入,直到最后一个字被插入到模块中。
使用这种方法,我需要以某种方式实现计数器或移位寄存器。无论如何,任何帮助都会很好。这将进入命令解析器/数据包解析器。非常感谢你的帮助。
答案 0 :(得分:0)
CRC计算不需要一次1位地串行完成。你基本上可以"展开"计算得出并行CRC发生器的每个位的各个方程。这样,您就可以创建一个CRC生成器,一次处理32位输入数据,与您的数据路径宽度相匹配。这应该简化您的设计并使其具有更高的性能(无论如何,串行处理每个位都不会满足您的吞吐量要求,除非您不介意在hw生成CRC时保持输入数据)。