0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

荐读:基于FPGA 的CRC校验码生成器

FPGA学习交流 来源:互联网 作者:佚名 2018-06-13 11:18 次阅读

大家好,又到了每日学习的时间了,今天我们来聊一聊基于FPGA 的CRC校验码生成器。下面咱们就来具体看看,欢迎大家一起交流学习。

1.概述
CRC即Cyclic Redundancy Check,循环冗余校验,是一种数字通信中的常用信道编码技术。其特征是信息段和校验字段的长度可以任意选定。

2.CRC校验的基本原理:
CRC码是由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如:(7,3)码:110 1001,前三位110为信息码,1001为校验码。

3.校验码的生成规则:
1)将原信息码左移r bit,右侧补零,如 110--> 110 0000;
2)用110 0000除以g(x) (注意,使用的是模2除法,见下文),得到的余数即为CRC校验码;
3)将校验码续接到信息码的尾部,形成CRC码。

4.关于生成多项式g(x)
在产生CRC校验码时,要用到除法运算,一般来说,这是比较麻烦的,因此,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:
102707v1usnbr9mmc6cc29.png

所有二进制数均被表示为一个多项式,x仅是码元位置的标记,因此我们并不关心x的取值,称之为码多项式。(我没研究过CRC代数推理过程,没体会到用多项式计算的方便之处,这里要学会的就是给出生成多项式g(x),能写出对应的二进制即可)

常见的生成多项式如下:
102707znkdf1twu1rqth1q.png

5.关于模2除法

模2运算就是加法不考虑进位,减法不考虑借位,

1)加法运算:

0+0=0 0+1=1 1+0=1 1+1=0

例如0101+0011=0110,列竖式计算:

0 1 0 1

+ 0 0 1 1

──────

0 1 1 0

2)减法运算:

0-0=0 0-1=1 1-0=1 1-1=0

例如0110-0011=0101,列竖式计算:

0 1 1 0

- 0 0 1 1

──────

0 1 0 1

3)乘法运算

0×0=0 0×1=0 1×0=0 1×1=1

多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算:
102708cgy44pc48hpazafg.png

4)除法运算:

0÷1=0 1÷1=1

多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义 的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:
102708xbq7qbq7c944h13p.png


掌握了上面的运算规则,您可以尝试计算一个复杂一点的,如下:
102709k6gyjgvcgchje8xs.png


如果得到的余数结果正确,您掌握的东西就够用了。

6.CRC-CCITT的硬件实现

CRC-CCITT的生成多项式为:
102709lpbt3bvhb3at703t.png


对应的二进制数就是上面复杂运算中那个除数。由刚才的计算可知,对于8 bit的数据 0xaa,它的CRC校验码为0001 0100 1010 0000,下面用verilog来实现,看能否得到这个结果:

要实现这一过程,仍然需要LFSR电路,参看《FPGA产生基于LFSR的伪随机数》中关于该电路特性的介绍,如果您不需要了解原理,直接略过即可;有所改进的地方就是,可以将伪随机数发生器看作一个Moore型状态机,它的输出只与当前的状态有关;而此时利用LFSR电路,需要引入数据输入端,输出不仅取决于当前的状态,还取决于输入信号,相当于Mealy型状态机,如下图:
102709mygb577773w7wg7k.png

注意对比与伪随机数产生器中该反馈支路的区别!

反馈项gr+1gr……g0为生成多项式的系数,依然是1代表存在反馈,0代表不存在反馈;此电路可以完成上述的模2除法操作,若我们要求0xaa的CRC校验码,则从高位到低位顺序输入0xaa共8 bit后,D15……D0中的数据即为所要求的余数,即CRC校验位。

7.verilog描述
如果用时序电路串行实现,则8 bit数据要移位8次,就需要8个clk,效率低下,为了能在一个时钟周期输出结果,必须采用组合电路,当然,这是以空间换时间的方法,由于使用了for循环8次,直观的讲电路规模将扩大8倍。

module CRC_GEN(
input rst, /*async reset,active low*/
input clk, /*clock input*/
input [7:0] data_in, /*parallel data input pins */
input d_valid, /* data valid,start to generate CRC, active high*/
output reg[15:0] crc
);

integer i;
reg feedback;
reg [15:0] crc_tmp;
/*
*sequential process
*/
always @(posedge clk or negedge rst)
begin
if(!rst)
crc <= 16'b0;          /*触发器中的初始值十分重要 */
else if(d_valid==1'b0)
crc <= 16'b0;
else
crc <= crc_tmp;
end

/*
* combination process
*/
always@( data_in or crc)
begin
crc_tmp = crc;
for(i=7; i>=0; i=i-1)
begin
feedback = crc_tmp[15] ^ data_in;
crc_tmp[15] = crc_tmp[14];
crc_tmp[14] = crc_tmp[13];
crc_tmp[13] = crc_tmp[12];
crc_tmp[12] = crc_tmp[11] ^ feedback;
crc_tmp[11] = crc_tmp[10] ;
crc_tmp[10] = crc_tmp[9];
crc_tmp[9] = crc_tmp[8];
crc_tmp[8] = crc_tmp[7];
crc_tmp[7] = crc_tmp[6];
crc_tmp[6] = crc_tmp[5];
crc_tmp[5] = crc_tmp[4] ^ feedback;
crc_tmp[4] = crc_tmp[3];
crc_tmp[3] = crc_tmp[2];
crc_tmp[2] = crc_tmp[1];
crc_tmp[1] = crc_tmp[0];
crc_tmp[0] = feedback;
end
end

endmodule

仿真结果如下:得到的是数据0xaa和0xf0的CRC校验码,为验证结果的正确性,您可以按照模2法则手工计算一下^.^
102710oaj7a9jjv33pwefx.png


8.同样给出一个4 bit信息位,5 bitCRC码的(9,4)码的程序和仿真结果,程序的流程与上述流程完全一样:
102710e8q11f8xfd2x21fa.png

112006x6h59yatxsx2dyzd.png

102710bsse8lf8pp1zsfh2.png

后记:细心的读者可能发现,本文对LFSR电路能完成模2求余操作的原因避而不谈,不是因为不告诉你,是因为我也不是很清楚,工科背景对数学推理实在是有点不知所云,尤其是看到国内教材那好几页的公式的时候,如果您有深入浅出的讲解LFSR电路由来与应用的文章,注意是深入浅出的,请您大力推荐,在此感谢!

今天就聊到这里,各位,加油。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1601

    文章

    21296

    浏览量

    593069
收藏 人收藏

    评论

    相关推荐

    如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码

    在“使用IAR Embedded Workbench和MCU的CRC模块来检查代码的完整性”一文中,介绍了如何在IAR Embedded Workbench中配置生成对应代码区域的CRC校验码
    的头像 发表于 10-27 11:49 851次阅读
    如何在IAR Embedded Workbench中配置<b class='flag-5'>生成</b>对应代码区域的<b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>

    crc校验码生成工具下载-crc生成工具

    crc校验码生成工具下载-crc生成工具[此贴子已经被作者于2008-5-30 9:23:38编辑过]
    发表于 05-20 11:16

    实用资料——CRC校验码生成算法

    同样方法进行计算,只是计算的内容不要包括最后两个字节,然后比较生成CRC校验码和数据帧中的是否相同即可。如果发送方交换CRC校验码的高低8
    发表于 01-11 21:10

    实用资料——CRC校验码生成算法

    同样方法进行计算,只是计算的内容不要包括最后两个字节,然后比较生成CRC校验码和数据帧中的是否相同即可。如果发送方交换CRC校验码的高低8
    发表于 02-14 19:45

    CRC校验码算法的研究与实现

    CRC校验码算法的研究与实现
    发表于 08-06 11:09

    labview CRC16位校验码生成程序

    输入任意长度的16进制字符串,输出CRC校验码高字节和低字节。参考了“mao525159“这位用户的程序
    发表于 05-23 11:00

    怎么用verilog HDL或VHDL去实现CRC校验

    一种校验码、循环(通信),简称,是常用的具有错误、错误能力的校验码,在早期中使用。和计算机同步通信的数据校验CRC存储过程后除了,在接收
    发表于 06-24 17:11

    8位CRC校验码表格生成及高速校验子程序

    8位CRC校验码表格生成及高速校验子程序
    发表于 05-16 13:49 108次下载

    循环冗余校验码---CRC

    循环冗余校验码---CRC码   二进制信息位串沿一条信号线逐位在部件之间或计算机之间传送称为串行传送。CRC(Cyclic Redundancy c
    发表于 10-13 16:52 6987次阅读
    循环冗余<b class='flag-5'>校验码</b>---<b class='flag-5'>CRC</b>码

    CRC-16校验码生成

    C#编写的CRC校验码生成小程序,简洁明了,如果有需要的话,大家可以下载了。
    发表于 05-06 15:06 8次下载

    补充: FPGA产生基于LFSR的伪随机数

    大家好,又到了每日学习的时间了,上一篇《荐读:基于FPGACRC校验码生成器》文中,提到了要实现这一过程,仍然需要LFSR电路,参看《FPGA
    的头像 发表于 06-13 11:21 7407次阅读
    补充: <b class='flag-5'>FPGA</b>产生基于LFSR的伪随机数

    CRC校验码并行计算的FPGA实现

    了按字节并行计算 CRC 校验码的 原理 ,并以常见的 CRC - 16 和 CRC - CCITT 为例 ,用 VHDL 语言进行了可综合设计。结果表明这种实现方法在速度和占 用资源
    发表于 03-28 09:34 30次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验码</b>并行计算的<b class='flag-5'>FPGA</b>实现

    FPGA产生基于LFSR的伪随机数概念

    大家好,又到了每日学习的时间了,上一篇《荐读:基于FPGACRC校验码生成器》文中,提到了“要实现这一过程,仍然需要LFSR电路,参看《FPGA
    的头像 发表于 04-02 16:33 2153次阅读
    <b class='flag-5'>FPGA</b>产生基于LFSR的伪随机数概念

    9 位奇/偶校验生成器/校验器-74HC_HCT280

    9 位奇/偶校验生成器/校验器-74HC_HCT280
    发表于 02-15 19:53 0次下载
    9 位奇/偶<b class='flag-5'>校验</b><b class='flag-5'>生成器</b>/<b class='flag-5'>校验</b>器-74HC_HCT280

    工控常用LRC XOR累加和CRC校验工具校验码自动生成软件多计算方式

    CRC校验工具 校验码自动生成软件支持十几种CRC计算方式,包括MODBUS协议的CRC-16
    的头像 发表于 11-25 14:27 2519次阅读
    工控常用LRC XOR累加和<b class='flag-5'>CRC</b><b class='flag-5'>校验</b>工具<b class='flag-5'>校验码</b>自动<b class='flag-5'>生成</b>软件多计算方式