在vhdl中计算(并验证)以太网FCS(crc32)

时间:2012-09-19 15:12:47

标签: vhdl ethernet crc32

我正在使用Spartan 3E Starter Kit,我正试图通过100MBit链接接收以太网帧。

对于那些不知道的人,该主板采用PHY芯片,接收时钟为25MHz。我(几乎)通过缓冲接收的帧并通过串行链接重新发送来验证接收是否正常。

此外,我正在使用CRC32 generator from outputlogic.com。我将收到的nybbles聚合为字节并将它们转发给CRC。在帧结束时,我锁存生成的CRC并将其与在以太网帧中找到的CRC一起显示在LCD上。

然而,(正如您可能已经猜到的)这两个数字不匹配。

527edb0d  -- FCS extracted from the frame
43a4d833  -- calculated using the CRC32 generator

第一个也可以通过pythons crc32函数运行包来验证,包括wireshark捕获的帧和通过串口从FPGA捕获和检索的帧。

我想它一定是或多或少都是微不足道的。 I pasted the receiving process over here。我剥掉了一切不必要的东西。当通过串行捕获输出时,我添加了一个fifo(来自Xilinx的容易制造的单元),它与CRC生成器同时锁存以获得完全相同的字节。

有没有人知道这有什么问题?

2 个答案:

答案 0 :(得分:6)

我一开始就开始使用以太网MAC了,虽然我从来没有完成它,但我确实有一个可用的CRC生成器,你可以在这里使用:

CRC.vhd

它基于关于IEEE 802.3 CRC的Xilinx应用笔记,您可以找到here

CRC在ethernet receieve component中实例化,如果查看ETH_RECEIVE_SM过程,您可以看到FCS如何加载到检查器中。

希望你能通过与我的代码比较来发现你的错误。

编辑:

我从fpga4fun获取示例以太网帧并将其传递给CRC检查器,请参阅下面的模拟屏幕截图(右键单击,复制URL并在新浏览器选项卡中查看以获得完整分辨率):

enter image description here

你可以在那里看到剩余的 C704DD7B ,尝试使用你自己的CRC检查器,看看你得到了什么。

答案 1 :(得分:3)

您使用的生成器可能无法预处理和后处理数据。如果该生成器采用一串零并产生零crc,那就是问题所在。一串零不应该产生零。 (它产生的内容取决于零的数量。)

以太网crc的处理是反转crc,然后应用crc算法,然后再次反转crc。