在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7613|回复: 9

【zhanghe】【挑战笔记1】之CRC循环冗余校验的原理与算法

[复制链接]
发表于 2014-6-26 22:02:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 zhanghe901126 于 2014-6-26 22:13 编辑

~~~~~~~~~~写在前面~~~~~~~~~~~~~
此笔记纯属个人挑战过程的一个简单记录,如果能给大家带来帮助或解决相关问题最好不过了!!!
如果哪里写得不足或有错误,欢迎大家指正!!!请轻喷!!
~~~~~~~~~~华丽分割线~~~~~~~~~~~~~~


今天开始着手挑战项目,项目进行前还是要把CRC校验额原理弄懂,所以先简单记录下CRC的原理和一些基本算法。
一、基本原理
在串行数据流的最有效的检错方案是CRC(Cyclic Redundancy Check)循环冗余检验,CRC循环冗余校验最根本的原理就是将原始数据除以某个固定的数,然后所得的余数就是CRC校验码,根据校验码位数的不同常用的CRC循环冗余校验算法有:CRC8、CRC12、CCITT CRC16、ANSI CRC16、CRC32。这次我只实现了CRC8的算法,至于CRC16或CRC32下次再研究。
对于CRC的基本原理我们可以根据具体的硬件电路图来理解,通常CRC循环冗余校验可以表示为带有反馈的移位寄存器,移位寄存器的阶数就是CRC字节的位数。另一种表示方法是将CRC表示为X的多项式,X的幂次数就是CRC字节相应的位数,系数为“1”表示相对应阶数的寄存器有反馈,系数为“0”表示无反馈。
CRC8.png
计算之前先将移位寄存器全部清零,然后将数据一位一位地串行方式输入移位寄存器,当所要计算的有用数据最后一位输入后,此时移位寄存器中的值就是所输入这段有用数据的CRC8校验值。

我们可以通过CRC8的两个重要性质来验证我们事先CRC8算法的正确性,这两个性质在接下来的仿真过程中要用到:
1)当CRC8的移位寄存器的初始值为八位的数据A时,如果将相同的8位数据A依次输入给移位寄存器,寄存器将清零。也可以说成是A除以A余数为0。
2)当CRC8的移位寄存器的初始值为八位的数据 时,如果我们将 的反码 依次输入给移位寄存器,移位寄存器的结果将是35H,也就是十进制的53。利用该特性可以对CRC8算法进行验证。

二、算法实现
以上所介绍的这种串行移位寄存器的方式主要是帮助我们掌握CRC校验的基本原理,当然实现上也可以用Verilog语言实现这种硬件电路,可想而知这种方式计算起来是相当慢的,要1个clk计算1bit。常用的CRC8算法是查找表算法。
该算法是以一次输入8位数据din为单位的,也就是说一个时钟内并行输入一个字节数据,下一个时钟即可算出CRC8校验字节。利用Verilog语言先定义一个CRC8字节的寄存器,在CRC8寄存器内容的基础上,利用新输入的8位数据计算新的CRC8字节来更新CRC8寄存器。如果CRC8寄存器初始值为0,那么输入8位数据后计算得到的CRC8就有256种可能。因此,定义了一个查找表reg [7:0] CRC8_table[255:0]并初始化为如下所示:
tb.png

下面说下实现该算法的过程:输入的8位数据din即作为查找表CRC8_table的索引i = din,然后执行CRC8 <= CRC8_table语句就得到了该字节的CRC8校验码,然而以上过程的前提是CRC8寄存器初始化为0,若CRC8寄存器不为0,那么查找表的索引i的计算应为当前CRC8与输入数据的异或,即 i = CRC8^din,然后执行语句CRC8 <= CRC8_table就得到了新的CRC8校验码。依次循环处理每个字节。。。。。。

首先定义了个module
module.png
SCLK输入时钟,在上升沿对输入数据din[7:0]采集,使能信号EN, 计算结果CRC8[7:0]
仿真结果:
1)输入数据依次为:8‘h11 8‘h22 8‘h33 8‘h44 8‘h55 8‘h66 8‘h77 8‘h88 在最后一个字节的下一个时钟上升沿得到校验结果为8’h7b
m1.png
2)根据性质一,如果我们继续输入8‘h7b,得到的结果将是8’h00
m2.png
3)根据性质二,8‘h7b的反码是8’h84,如果在1)数据的基础上继续输入8’h84,将得到8‘h35
m3.png

下篇笔记记录下如何封装用户自定义IP~
发表于 2014-7-1 16:25:19 | 显示全部楼层
挺好,非常不错
发表于 2015-1-13 13:57:01 | 显示全部楼层
不错,不错
发表于 2015-10-12 16:41:27 | 显示全部楼层
不错,希望能够更简洁的介绍下,如信息码、crc校验码、余项等与多项式的对应,以及模2除法等的概念和模2除法的例子等,将能够使人更明白
发表于 2015-12-31 14:40:09 | 显示全部楼层
查表法果然简单
发表于 2016-1-1 23:12:56 | 显示全部楼层
很棒的參考資料, 謝謝分享!
发表于 2016-1-5 14:38:59 | 显示全部楼层
还有一种直接把输入数和CRC多项式异或的方法,CRC16用查找表时序面积应该很差吧。
发表于 2016-10-24 10:52:00 | 显示全部楼层
很棒的參考資料, 謝謝分享!
发表于 2021-4-30 11:39:54 | 显示全部楼层

很棒的參考資料, 謝謝分享!
发表于 2024-7-31 11:12:36 | 显示全部楼层
如果数据是256bit,采用CRC8,查找表会非常大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-27 04:04 , Processed in 0.027135 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表