CRC循环冗余校验码

循环冗余校验

"冗余"为什么能检验?

  • 数据传输过程中不能保证所有的位数都是正确的,由于电磁干扰会产生错误,假设传输过程中最多只有1位是传输错误的,并且不需要检验出具体哪一位出现错误,只需要考虑检验数据存在错误即可

不添加校验码

  • 最简单的情况是发送方只发送了一位数据,接收正确为1,接收错误为0
  • 接收方接收到1,可能是发送发送1,被正确接收或者是发送方发送0,出现错误
  • 接收方接收到0,可能是发送发送0,被正确接收或者是发送方发送1,出现错误
  • 怎么进行判断数据传输错误? 增加一位不含信息的数据进行辅助校验

添加校验码

  • 发送方想要发送1,此时添加一位校验位1,发送方会发送11
  • 接收方接收到10,01都表示出现错误

循环如何进行检验?

  • 前面知道校验的可行性,将发送1位数据扩展到n位如何进行考虑检验?
  • 不恰当的想法:发送一个数据的时候,发送两遍,第一遍表示数据,第二遍进行检验,但是这样在发送大量数据的时候,会浪费很多空间

模2除法

  • 首先取与除数相同的位数,看首位是不是够减,够减写1,不够减写0

检验方法

  • 事先通过网络协议规定好一个除数(比如11001),通过待校验的数据除以除数,用得到的余数进行校验;余数为0表示传输正确,余数不为0表示传输错误

例题

CRC计算示例1

CRC keywords

  • 信息码 - 校验的码值,原编码 101001
  • 生成多项式 - G(x) = x3+x2+1
  • 校验位 - 是CRC的长度,根据G(x)最高次幂确定,这里最高位为3,所以校验位是3
  • 多项式对应的二进制数 - 多项式会生成一个二进制数,将其中的每一项,从高次到低次进行排列,将每一项的系数进行提取,就是多项式的二进制数
  • 余数 - 经过除法取模之后得到数,作为真正的校验位

求解过程

  • 找到CRC keywords
  • 余数 - 联合校验位对于信息码进行拼接,拼接三位校验位(用0补充),对多项式二进制数进行除法运算
  • 这里得到的余数是1,真正的余数是001
  • CRC校验码就是(信息码+余数):101001001

CRC 计算实例2

  • 知道多项式二进制数10011和信息码10101011,求CRC?
  • 反推出多项式,得到校验位是4
  • 进行拼接,比较,异或运算

参考视频:https://www.bilibili.com/video/BV1tZ4y117Lj/?spm_id_from=333.337.search-card.all.click&vd_source=96e5e43be309416df48eb06a75ad2f96
CRC verilog代码生成工具:http://outputlogic.com/?page_id=321

posted @ 2024-01-13 12:32  Icer_Newer  阅读(97)  评论(0编辑  收藏  举报