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

问题描述 投票:0回答:3

我正在使用 Spartan 3E 入门套件,并且我正在尝试通过 100MBit 链路接收以太网帧。

对于那些不知道的人,该板具有 PHY 芯片,暴露了 25MHz 的接收时钟。我(几乎)已经通过缓冲接收到的帧并通过串行链路重新发送它们来验证接收工作正常。

此外,我正在使用来自 outputlogic.com 的 CRC32 生成器。我将接收到的半字节聚合为字节并将它们转发到 CRC。在帧的末尾,我锁存生成的 CRC 并将其与我在以太网帧中找到的 CRC 一起显示在 LCD 上。

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

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

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

我想这一定是一些或多或少微不足道的事情。 我把接收过程贴在这里。我把所有不必要的东西都脱掉了。通过串行捕获输出时,我添加了一个 fifo(Xilinx 现成的单元),它与 CRC 生成器同时锁存,以获得完全相同的字节。

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

vhdl ethernet crc32
3个回答
6
投票

我不久前开始研究以太网 MAC,虽然我一直没有时间完成它,但我确实有一个可以使用的 CRC 生成器,您可以在这里使用:

CRC.vhd

它基于 IEEE 802.3 CRC 上的 Xilinx 应用说明,您可以在此处找到它。

CRC 在以太网接收组件中实例化,如果您查看 ETH_RECEIVE_SM 过程,您可以看到 FCS 是如何加载到检查器中的。

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

编辑:

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

enter image description here

你可以在最后看到残留的C704DD7B,尝试用你自己的CRC检查器做同样的事情,看看你会得到什么。


3
投票

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

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


0
投票

我可以评论一下,我认为相关的 IEEE 802.3 标准没有精确详细说明计算方法,这绝对是可耻的。这种遗漏对于公共标准来说是不可接受的。这并不是标准中唯一缺失的东西......有很多漏洞有时很难恢复

我是否应该补充一点,这是自愿完成的,目的是阻止小实体开发自己的东西,煽动他们使用后门 IC 或 IP。

© www.soinside.com 2019 - 2024. All rights reserved.