备忘录--基于FPGA的CRC校验

本文介绍了循环冗余校验(CRC),它是对数字信号编码的技术,原码与多项式模2除法得校验码。阐述了其串行和并行实现原理,串行用线性反馈移位寄存器,并行基于FPGA特性。还给出用CRC - 16检验8位数据的代码,最后提供自定义多项式规则、生成代码及校验结果的网站。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、CRC概述

已经有大量的文章中解释了CRC的原理实现,稍作赘述只是为了自己遗忘。

1.概念

Cyclic Redundancy Check,循环冗余校验,是一种对数字信号进行编码的技术或者过程,特点是有效数据和检验数据的长度可以自定义。

2.原理

原码和某一多项式(一组二进制位串)进行模2除法,得到一组校验码,检验码续到原码后面组合成CRC信息。
简单来说,就是原数据和一固定的01字符串不停的进行异或运算,最后剩下的余数就是我要求的数据。

3.常见CRC应用

名称多项式应用场景
CRC-8x^8 + x^2 + x^1 + 1ATM…
CRC-16x^16 + x^15 + x^2 + 1USB…
CRC-32x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1Ethernet…

二、实现原理

1.串行原理
LFSR,Linear Feedback Shift Register,线性反馈移位寄存器,用于通信加扰解扰。
其过程是在 移位寄存器 中上一时刻状态的输出,当做此刻状态的输入;由于移位寄存器的的运算是固定的,而且其位宽也是确定的,所以最终的结果肯定是可控的;也就是说,在若干的时刻后,每一个移位寄存器中的当下的值,取决于上一位的数据和初始移位寄存器中的值。
我们自行推导模2除法的过程,可明白其过程和LFSR是一样的,数据和多项式的异或运算中,逢1变换,逢0移位。
IE
2.并行原理
FPGA本身是用空间换时间,我们明白在LFSR的过程后,自然会想到,刚开始的数据遍历完所有的移位寄存器后,最后几个还在走的路上,而最后几位数据完成,之前的数据无非是向前平移而已。
据此我们可以推算出,对于任意一组数据,在最终时刻下,他的移位寄存器中的剩余值,或者说校验中CRC的值是,完全取决于初始数据各个位宽的值和移位寄存器各个初始值。

三、代码实现

我们用CRC-16检验8位位宽的数据,其公式是x^16 + x^15+ x^2 + 1。
其二进制字符串是1100 0000 0000 0101.

命名定义初始值
c上一状态移位寄存器的值(一般也就是上一时刻crc的校验值)crc[15:0]
d此刻要检测的数据data[7:0]
newcrc此刻生成的新的crc的值newcrc[15:0]

以下代码是化简了过程,其过程是对应的二进制字符串中的0和1进行异或运算

newcrc[0] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
newcrc[2] = d[1] ^ d[0] ^ c[8] ^ c[9];
newcrc[3] = d[2] ^ d[1] ^ c[9] ^ c[10];
newcrc[4] = d[3] ^ d[2] ^ c[10] ^ c[11];
newcrc[5] = d[4] ^ d[3] ^ c[11] ^ c[12];
newcrc[6] = d[5] ^ d[4] ^ c[12] ^ c[13];
newcrc[7] = d[6] ^ d[5] ^ c[13] ^ c[14];
newcrc[8] = d[7] ^ d[6] ^ c[0] ^ c[14] ^ c[15];
newcrc[9] = d[7] ^ c[1] ^ c[15];
newcrc[10] = c[2];
newcrc[11] = c[3];
newcrc[12] = c[4];
newcrc[13] = c[5];
newcrc[14] = c[6];
newcrc[15] = d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
nextCRC16_D8 = newcrc;

四、备忘录

  1. 此网站可自定义多项式规则,并生成代码。
  2. 此网站自行校验CRC的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值