CRC循环冗余校验详解及Verilog代码自动生成

CRC循环冗余校验编码想必大家在工作中都有所接触,它作为一种验证数据传输完整性的方法广泛应用于以太网(CRC-32)、SDcard(CRC7&CRC16)、USB3.0(CRC-32)等传输协议中。本文将为大家详细讲解CRC的原理并介绍一种CRC编码对应Verilog代码生成的在线工具。

1.CRC简介

CRC(循环冗余校验,Cyclic Redundancy Check)是一种基于多项式运算的差错检测编码技术,广泛应用于数据通信和存储领域,用于验证数据传输或存储后的完整性。其核心原理是将待传输的数据视为一个二进制多项式,通过预先设定的生成多项式进行模2除法运算,将计算得到的余数(即CRC校验码)附加到原始数据末尾。接收方在获取数据后,使用相同的生成多项式重新计算CRC值,若与接收的校验码不一致,则表明数据在传输过程中可能发生了错误。

2.CRC原理介绍

CRC(循环冗余校验)的原理基于多项式除法与二进制运算的结合,通过生成冗余校验码来检测数据传输或存储中的错误。以下是其核心原理的详细分步解析:

2.1数据与多项式的对应

二进制数据转多项式:将被传输的二进制数据视为一个多项式的系数。

例如,二进制数据101101对应多项式:

2.2生成多项式(Generator Polynomial)

定义:收发双方预先约定一个生成多项式G(x),其阶数为r(最高次项为xr)。

常见的生成多项式G(x)标准:

2.3计算CRC校验码的步骤

(1)数据预处理

在原始数据末尾附加r个0(r 为生成多项式的阶数),即将原始数据左移r位,得到扩展后的数据D′(x)。

例如,若原始数据为101101,生成多项式阶数r=3,则扩展后为101101000。

(2)模2除法运算

模2运算规则:所有加减法均为异或(XOR)操作,不产生进位或借位。用扩展后的数据D′(x)除以生成多项式G(x),得到余数R(x)。

操作示例:

数据:1101001,生成多项式:1011(对应x3+x+1)

除法过程:

1101001(数据)÷1011(生成多项式),余数为001(即CRC校验码)。

(3)附加校验码

将余数R(x)(即CRC校验码)附加到原始数据末尾,形成最终的传输数据帧:

2.4接收端验证

接收方对收到的数据T′(x)执行以下操作:

用相同的生成多项式G(x)对T′(x)进行模2除法。若余数为0,则数据无误;若余数非0,说明传输过程中发生错误。

为了更直观的说明循环冗余校验码的生成过程、校验过程,以8位的有效信息数据串和4位的循环冗余校验码并在一起传输为例。

(1)假设要发送的数据串序列为11011101。自定义的生成多项式G(x)=x4+x3+x+1其中k=4,相对应的序列为11011。

(2)把待发送的数据串序列向左移动4位,后面补0,从而得到新的数据串序列为110111010000。

(3)使用模2除法,用生成多项式序列去除新生成的数据串序列。即:

这样得到了余数多项式R(x)对应序列为1010。

(4)将余数多项式R(x)对应序列并到新数据串序列后面,得到带有循环冗余校验码的数据串序列:110111011010。

校验过程:假如信息传输正常,接收到的带有循环冗余校验码的数据串序列必定可以被在发送端所自定义的生成多项式整除,也就是:

3.CRC校验Verilog代码在线生成

最后介绍一个非常方便的CRC校验Verilog代码在线生成小工具:Generator for CRC HDL code

网站界面如下使用工具生成的一个CRC-6的参考代码:简单写个tb验证一下:

用vcs跑一跑看看结果

十分正确!!!大家放心使用!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值