目录
1、CRC calculation 非常棒的在线CRC计算网站,可以设定初始值,可以配置位正反;(CRC calculation)
2、CRC Generator 非常不错的CRC FPGA代码生成网站 OutputLogic.com » CRC Generator
一、CRC原理。
CRC校验的原理非常简单,如下图所示,通过下图大家可以通过手算即可求解出CRC校验结果。
![](https://i-blog.csdnimg.cn/blog_migrate/93530f220aa00bdfdb717e7b439b4704.png)
其中,生成多项式是利用抽象代数的一些规则推导出来的,而模2加(也就是异或),是对应于有限域的除法。
二、CRC算法。
通用的算法有比特型算法和字节型算法,我见到的FPGA实现方法多为后者字节型算法。
1、比特型算法。
![](https://i-blog.csdnimg.cn/blog_migrate/4feafc08168e9fa6134121520b662edc.png)
这种算法,跟手算的差不多,一个时钟周期处理一个bit,速度慢,但消耗的面积小。
可能你会有疑问,本来是第15位(对应于x^15),再移位就是第16位,怎样把第16位转化成低于16位的数?
利用生成多项式就可以了,crc16 : 1+x^2+x^15+x^16,类似于小学数学的约分。
下图为关键的代码。
![](https://i-blog.csdnimg.cn/blog_migrate/00c3957820a814ecbfd825df7c138112.png)
2、字节型算法。(好理解也好用,实际中采用这种)
原理是把上面比特型的算法展开,一次性把8个bit的情况都列出来,化简,如下图所示,下图为关键的代码。
字节型算法的使用方法跟比特型类似,只是一次处理8个bit,算出来的crc,也要留在寄存器里面(LSFR)。
![](https://i-blog.csdnimg.cn/blog_migrate/b367f7fc75a195086193785d21c9252b.png)
三、CRC参数模型
网上可以下载到多种CRC计算器,右侧有详细的CRC参数模型标识,在使用时,不仅要选择对多项式的类型,也要关注右侧模型信息。
![](https://i-blog.csdnimg.cn/blog_migrate/cd17a3dcad688fddca27688a6ee36393.png)
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)的举例说明
![](https://i-blog.csdnimg.cn/blog_migrate/bafc91bb41239fd3c77f458e67a3c7a6.png)
XorOut:执行完RefOut之后,异或全0或者全1,(图中为异或全0)。
搞懂CRC参数模型,才算是真正搞懂CRC,而不像书本上说的那么肤浅。
其中有的CRC寄存器初始值设置为全1,如以太网的CRC32,目的就是为了能检测出数据前面的0的个数。1234算出来的CRC,跟01234算出来的,不一样,这就能应对前面带0的数据了。
此外,CRC的生成多项式,也有可能倒置,所以必须以参数模型中Poly的值为准。
四、常用工具(重点来了)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6e4db6662d76821f5c865e6c7f1d1d30.png)
勾选reverse data bytes,代表 输出CRC结果之前,把CRC寄存器倒置;
勾选reverse crc result before fianal xor 注意是最后一次,before Final XOR,中间的还需要再反回去。
下图为配置完的截图,01 41 71 中间要用%隔开,计算完的结果为F8。
![](https://i-blog.csdnimg.cn/blog_migrate/2eaf2bfb9e802f79a21ff604250af13e.png)
利用CRC计算器计算出的结果为:同样为F8。
![](https://i-blog.csdnimg.cn/blog_migrate/30fa280f0bf656f954141476d8c2ae6f.png)
2、CRC Generator 非常不错的CRC FPGA代码生成网站 OutputLogic.com » CRC Generator
下图为非常使用的FPGA代码生成工具,可以生成Verilog,也可以生成VHDL。
第一步:选择数据和多项式位数:
![](https://i-blog.csdnimg.cn/blog_migrate/9b54bf9f7f790efbab73cd3392ca9ad6.png)
第二步:以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;
![](https://i-blog.csdnimg.cn/blog_migrate/94a306f8b190453f7c0fc42468510963.png)
没有勾选reverse data bytes,代表CRC寄存器不倒置;
没有勾选reverse crc result before fianal xor;
![](https://i-blog.csdnimg.cn/blog_migrate/506ade16056958f32b73a305d6ee41ec.png)
第三步:实际中我需要下图的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;
![](https://i-blog.csdnimg.cn/blog_migrate/b7ec656e9a37d83c4a4d5167de82583d.png)
以下为完整代码:
![](https://i-blog.csdnimg.cn/blog_migrate/c75d30114a10fae1d90105992df0ae3e.png)