芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 活动
查看: 236|回复: 0

关于小梅哥以太网例程中CRC32校验的问题以及我的个人见解

[复制链接]
  • TA的每日心情
    开心
    4 天前
  • 4

    主题

    11

    帖子

    91

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    91
    发表于 2019-9-2 22:28:42 | 显示全部楼层 |阅读模式
    本帖最后由 xiaoxiao 于 2019-9-3 19:04 编辑

    最近在学习小梅哥提供的基于AC620的百兆以太网开发例程。在看到自动CRC校验的时候,自己编写testbench文件对该段代码进行仿真验证,发现了以下现象。

    一、仿真得到的CRC结果与计算器得到的CRC结果并不相符,最高位有所差别,而正确的CRC校验结果则是CRC输出结果的低7位和上一时钟周期CRC结果的最高位的拼接结果。即{CRC_eth_pre[7],CRC_eth[6:0]}(注:CRC_eth_pre表示CRC校验结束前的一个周期的CRC值,CRC_eth表示CRC最终的结果)。
    例如,要校验0x43253686,计算器得到如下结果:0x1BA41BA4,换算成以太网数据发送格式为4ab14ab1

    CRC校验结果

    CRC校验结果


    而程序仿真得到的结果如下:

    47)YX}R[SC4JPO`}~%WPK{Q.png Q1R]_R5S(6G)JI(KW@QJLCX.png      CRC_eth_pre=44889c16;     CRC_eth=aab14ab1;  {CRC_eth_pre[7],CRC_eth[6:0]}=4ab14ab1与预期相符  正确的CRC校验值是两个值的组合。如果是这样,那么以太网发送CRC的最终输出值就是错的,呢么PC段进过检验后也会出错。但是拿小梅哥的例程跑一遍PC端却能正常接收数据,这又是为什么呢?

    于是我对整个工程做了一次仿真,发现了一些端倪。如下图:CRC_eth_pre=484da1b1,  CRC_eth=77cd4619, {CRC_eth_pre[7],CRC_eth[6:0]}=47cd4619;而mii_tx_data=47cd4619,两者恰好相等。所以说以太网工程发送的校验码是正确的,且发送的校验码就是上文提到的组合方式得到的。

    使用时序逻辑发送数据,触发条件会慢一拍,检测到cnt=46时CRC输出值还是484da1b1,此时发送最高位“4”,下一时钟上升沿到来,检测到cnt=47,CRC输出值为77cd4b1a,依次发送低七位的“7cd4b1a”.从而最终PC端接收到的CRC校验值为“47cd4b1a”。


    总结一句话就是PC端接收到的并不是CRC校验最后一个时钟周期输出的校验值,因为CRC校验采用了LFSR,所以它的输出是动态的;即最后PC接收到的是最后两个时钟周期CRC输出值的耦合(前者最高位和后者低7位拼接而成)。

    二|、关于input [0:3]和input [3:0],试了下不同的输入方法,仿真得到的结果不同。所以因该是通过input [0:3]输入的数据高低位颠倒了。


    目前想说的就这么多,欢迎大家提出想法相互交流!





    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|手机版|Archiver|芯路恒电子技术论坛  

    GMT+8, 2019-9-23 22:19 , Processed in 0.124444 second(s), 11 queries , File On.

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表