非常实用FPGA实现CRC校验介绍和代码生成工具

2 篇文章 0 订阅
1 篇文章 0 订阅

一、CRC原理。

 CRC校验的原理非常简单,如下图所示,通过下图大家可以通过手算即可求解出CRC校验结果。
其中,生成多项式是利用抽象代数的一些规则推导出来的,而模2加(也就是异或),是对应于有限域的除法。

二、CRC算法。

    通用的算法有比特型算法和字节型算法,我见到的FPGA实现方法多为后者字节型算法。

1、比特型算法。

这种算法,跟手算的差不多,一个时钟周期处理一个bit,速度慢,但消耗的面积小。

可能你会有疑问,本来是第15位(对应于x^15),再移位就是第16位,怎样把第16位转化成低于16位的数?

利用生成多项式就可以了,crc16 : 1+x^2+x^15+x^16,类似于小学数学的约分。
下图为关键的代码。

2、字节型算法。(好理解也好用,实际中采用这种)

  原理是把上面比特型的算法展开,一次性把8个bit的情况都列出来,化简,如下图所示,下图为关键的代码。
  字节型算法的使用方法跟比特型类似,只是一次处理8个bit,算出来的crc,也要留在寄存器里面(LSFR)。

三、CRC参数模型

网上可以下载到多种CRC计算器,右侧有详细的CRC参数模型标识,在使用时,不仅要选择对多项式的类型,也要关注右侧模型信息。
       Name:CRC名称。
       Width:CRC寄存器的位宽。
       Poly:生成多项式(这里用8进制表示)。
       Init:CRC寄存器初始值(图中为全0)。
       RefIn:True代表每个输入的字节都倒置(原本是bit0的,换成bit7;原本是bit1的,换成bit6)。False代表不倒置。
       RefOut:True代表在输出CRC结果之前,把CRC寄存器倒置。False代表不倒置。(注意是最后一次,before Final XOR,中间的还需要再反回去)
      下图为网站: CRC calculation)的举例说明
       XorOut:执行完RefOut之后,异或全0或者全1,(图中为异或全0)。
       搞懂CRC参数模型,才算是真正搞懂CRC,而不像书本上说的那么肤浅。
       其中有的CRC寄存器初始值设置为全1,如以太网的CRC32,目的就是为了能检测出数据前面的0的个数。1234算出来的CRC,跟01234算出来的,不一样,这就能应对前面带0的数据了。
       此外,CRC的生成多项式,也有可能倒置,所以必须以参数模型中Poly的值为准。

四、常用工具(重点来了)

以下是可以让大家事半功倍的好工具:主要有2个 CRC calculation  和 CRC Generator除了可以计算crc以外,有的还 可以自动生成c、verilog、vhdl代码

1、CRC calculation  非常棒的在线CRC计算网站,可以设定初始值,可以配置位正反;(CRC calculation

优点:可以利用这个在线工具计算任何形式的CRC,不像其他的crc计算器,只能计算特殊的集中。
详细介绍:
CRC oder:多项式阶数(支持1-64),图中选为8阶;
CRC polynom:CRC校验多项式,07代表x^8+x^2+x+1;
initial value: CRC寄存器初始值(图中为全FF);更有意思的计算方法:单步计算法,首先选中direct,然后初始值可以为上次计算的结果,用于单步调试非常棒;
Final XOR value: 执行完RefOut之后,异或全0或者全1,(图中为异或全0);
勾选reverse data bytes,代表 输出CRC结果之前,把CRC寄存器倒置;
勾选reverse crc result before fianal xor 注意是最后一次,before Final XOR,中间的还需要再反回去。
下图为配置完的截图,01 41 71 中间要用%隔开,计算完的结果为F8。
利用CRC计算器计算出的结果为:同样为F8。

2、CRC Generator   非常不错的CRC FPGA代码生成网站 OutputLogic.com » CRC Generator

下图为非常使用的FPGA代码生成工具,可以生成Verilog,也可以生成VHDL。
第一步:选择数据和多项式位数:
第二步:以X^8+X^5+X^4+1多项式为例:下图画圈的地方为关键代码。
首先,下图生成的CRC代码仅为固定CRC参数模型下的,我们需要根据自己的需求做修改,如何正常的改成自己想要的,非常关键。
通过分析,下图的模型参数具体如下:
CRC oder:多项式阶数为8阶;
CRC polynom:CRC校验多项式x^8+x^5+x^4+1;
initial value:CRC寄存器初始值为全FF;
Final XOR value:执行完RefOut之后,异或全0;
没有勾选reverse data bytes,代表CRC寄存器不倒置;
没有勾选reverse crc result before fianal xor;
第三步:实际中我需要下图的CRC参数模型:
1)输入数据取反:
d:=data_in(0)&data_in(1)&data_in(2)&data_in(3)&data_in(4)&data_in(5)&data_in(6)&data_in(7);  
2)输出数据取反:
r:= crc_out(0)&crc_out(1)&crc_out(2)&crc_out(3)&crc_out(4)&crc_out(5)&crc_out(6)&crc_out(7);
3)修改后的样式
        --x8+x5+x4+1
        crcout(0) :=  r(0) xor r(3) xor r(4) xor r(6) xor d(0) xor d(3) xor d(4) xor d(6);
        crcout(1) :=  r(1) xor r(4) xor r(5) xor r(7) xor d(1) xor d(4) xor d(5) xor d(7);
        crcout(2) :=  r(2) xor r(5) xor r(6) xor d(2) xor d(5) xor d(6);
        crcout(3) :=  r(3) xor r(6) xor r(7) xor d(3) xor d(6) xor d(7);
        crcout(4) :=  r(0) xor r(3) xor r(6) xor r(7) xor d(0) xor d(3) xor d(6) xor d(7);
        crcout(5) :=  r(0) xor r(1) xor r(3) xor r(6) xor r(7) xor d(0) xor d(1) xor d(3) xor d(6) xor d(7);
        crcout(6) :=  r(1) xor r(2) xor r(4) xor r(7) xor d(1) xor d(2) xor d(4) xor d(7);
        crcout(7) :=  r(2) xor r(3) xor r(5) xor d(2) xor d(3) xor d(5);
4)最后输出格式reverse crc result before fianal xor;
        crcout_invert :=crcout(0)&crcout(1)&crcout(2)&crcout(3)&crcout(4)&crcout(5)&crcout(6)&crcout(7);
        return crcout_invert;
以下为完整代码:

五、感谢

  • 4
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icekoor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值