CRC循环冗余校验 (Cyclic Redundancy Check) 原理/电路实现/Verilog实现

这篇具有很好参考价值的文章主要介绍了CRC循环冗余校验 (Cyclic Redundancy Check) 原理/电路实现/Verilog实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 什么是CRC循环冗余校验?

2 CRC校验的原理

2.1 多项式表示

2.2 模二

多项式除法

2.3 传输端

 2.4 接收端

3 CRC码的产生

3.1 产生CRC码步骤

3.2 Verilog实现

4 电路实现原理—线性反馈移位寄存器

4.1 循环移位寄存器结构

4.2 最大长度移位寄存器

 4.3 多项式除法电路(线性反馈移位寄存器)

4.4 Verilog实现


1 什么是CRC循环冗余校验?

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。CRC有以下特性:

  • 多项式表示:把所有二进制位字符串视为变量 (x) 的多项式方程;
  • 多项式除法:使用“多项式除法” (模2算术运算) 进行校验;
  • 在检测单bit和多bit错误时极其可靠;
  • 可以简单地通过反馈移位寄存器和XOR门高效地实现。

2 CRC校验的原理

2.1 多项式表示

对如下二进制bit字符串:

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

可以将其表示为一个虚拟变量 (x) 的多项式方程 (二进制加权形式):

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 例:字符串 (1100101) 可以表示为:

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 这样做的目的是,方便之后进行数学编码和对二进制数据串的操作 (如:模二运算)。

2.2 模二多项式除法

通常一个多项式B(x)除以另一个多项式G(x)会产生一个商多项式Q(x)和一个余数多项式R(x):

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 由于 模二减法=模二加法,上式可重写为:

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

这表明可以可以通过添加一个特定的二进制组合R(x)到原原数据串,来产生一个刚好能被多项式G(x)整除的新的多项式。

2.3 传输端

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 2.4 接收端

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

T'(x) 是接收端的接收到的二进制bit串对应的多项式,E(x) 是错误的二进制bit构成的多项式。

如果余数多项式R'(x)=0, 则表明接收到的数据没有错误。否则,在传输过程中存在单bit或多bit的错误,需要重新传输。G(x)为选定的能够检测出几乎所有单bit和多bit错(突发错误)误的生成多项式。

3 CRC码的产生

3.1 产生CRC码步骤

第一步:对r次的生成多项式crc循环冗余校验,数字IC基础,硬件工程,fpga开发,在原二进制bit串后方增加r个“0”,形成新的数据多项式B'(x):

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 第二步:用B'(x)除以生成多项式G(x),得到余数多项式R'(x):

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 第三步:传输crc循环冗余校验,数字IC基础,硬件工程,fpga开发。此时,T(x) 等于 Q'(x)·R'(x) 且正好能被G(x)整除。

3.2 Verilog实现

module CRC_Gen(
input clk,
input rst_n,
input [7:0] data,
input data_valid,
output reg [15:0] crc
);
reg [23:0] temp;
parameter polynomial=17'b1_0001_0000_0010_0001;
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
    begin
        crc <= 0;
        temp <= {data,16'd0}; //复位时,将初始数据放入寄存器
    end
    else if(data_valid)
    begin
        if(temp[23]) temp[23:7] <= temp[23:7]^polynomial;
        else if(temp[22]) temp[22:6] <= temp[22:6]^polynomial;
        else if(temp[21]) temp[21:5] <= temp[21:5]^polynomial;
        else if(temp[20]) temp[20:4] <= temp[20:4]^polynomial;
        else if(temp[19]) temp[19:3] <= temp[19:3]^polynomial;
        else if(temp[18]) temp[18:2] <= temp[18:2]^polynomial;
        else if(temp[17]) temp[17:1] <= temp[17:1]^polynomial;
        else if(temp[16]) temp[16:0] <= temp[16:0]^polynomial;
        else crc <= temp[15:0];
    end
end
endmodule

4 电路实现原理—线性反馈移位寄存器

4.1 循环移位寄存器结构

数据通寄存器循环,输出被反馈到输入。例:一个下图所示的4-bit移位寄存器初始载入0001,则可以得到四种不同的bit pattern,但这并不是所有可能的4-bit pattern(种)。

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

4.2 最大长度移位寄存器

当XOR门(执行模二和运算)被加在反馈路径上时,可能得到的bit patterns的数量增加了。

最大长度移位寄存器定义为:一个在不同时钟下能产生种bit patterns 的 n-bit 反馈移位寄存器。

最大长度寄存器对任意输入序列都拥有除法器的作用。其他任何不能产生最大序列的电路都不能执行除法操作。

例:如下图所示的最大序列产生器是一个含有XOR门的3-bit移位寄存器,假设起始值为001。

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

例:如上图所示(由移位寄存器和XOR门构成的除法器电路)(该电路表示的crc循环冗余校验,数字IC基础,硬件工程,fpga开发):使用最大序列移位寄存器结构,假设寄存器中初始值均为0并且有一个四位的输入(1110 MSB先入)。在四次移位后,留在寄存器R3 R2 R1中的bit pattern就是余数,可以看到在周期4,我们得到余数R(x) = 011(R3 R2 R1)。

验证得到的余数是否准确:

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 4.3 多项式除法电路(线性反馈移位寄存器)

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 crc循环冗余校验,数字IC基础,硬件工程,fpga开发

用下图电路执行crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

 可以看出,对一个n次多项式,最多使用n-1个移位寄存器和最多n-2个异或门可以构成一个线性移位寄存器。线性移位寄存器可以实现模二除法。

 重新编排多项式后的编码电路如下,由于当移位开始时,输入可以直接在输出得到,这节省了k个Cycle的时间:

crc循环冗余校验,数字IC基础,硬件工程,fpga开发

crc循环冗余校验,数字IC基础,硬件工程,fpga开发文章来源地址https://www.toymoban.com/news/detail-758278.html

  •  在开始的k次移位,开关打开 (选择下端)。k位信号bits同时移入寄存器和移到输出。
  • 在之后的n-k次移位,开关关闭 (选择上端)。剩下的寄存器中的 (n-k)位check bit移动到输出。

4.4 Verilog实现

// CRC = x16+x12+x5+1
module CRC_GenSerial(
    input clk,
    input rst_n,
    output reg [15:0] crc
);
reg [31:0] data_parallel;
reg data_serial;
reg [5:0] cnt;
parameter source_data = 32'h96E32077;
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
    begin
        cnt <= 0;
        data_parallel <= source_data;
        data_serial <= 0;
    end
    else if(cnt < 32)
	begin
		cnt <= cnt+1;
        data_serial <= data_parallel[31];
        data_parallel <= data_parallel<<1;
	end
	else
    begin
        cnt <= 33;
        data_serial <= 0;
        data_parallel <= 0;
    end
end
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
    begin
        crc <= 0;
    end
    else if(cnt <= 32)
    begin
        crc[0] <= crc[15]^data_serial;
        crc[4:1] <= crc[3:0];
        crc[5] <= crc[4]^crc[15]^data_serial;
        crc[11:6] <= crc[10:5];
        crc[12] <= crc[11]^crc[15]^data_serial;
        crc[15:13] <= crc[14:12];
    end
    else
    begin
        crc <= crc;
    end
end
endmodule

到了这里,关于CRC循环冗余校验 (Cyclic Redundancy Check) 原理/电路实现/Verilog实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JAVA获取CRC(即循环冗余校验)

    前言:网上查了很多,CRC计算时,除数长度太长无法计算,所以写此文章。希望大家喜欢!     CRC(Cyclic Redundancy Check),即循环冗余校核,是一种根据网络数据包或电脑文件等数据产生简短固定位数 校核码 的快速算法。      CRC校验本质上是选取一个合适的 除数 ,要进行校

    2024年02月06日
    浏览(5)
  • 【基础知识】CRC(循环冗余校验)直接计算和查表法

    【基础知识】CRC(循环冗余校验)直接计算和查表法

    校验是什么,个人理解就是经过一个算法,使用大量数据(几MB的数据)生成较小长度的一串信息(如16Bit),并切要做到 原数据不同时,生成的信息大概率不同(不是加密算法不考虑刻意造数据的情况) 原数据中任意一个或几个数据出现错误时,生成的信息不同(所有的原信

    2024年02月05日
    浏览(11)
  • CRC冗余校验的原理和FPGA实现思路

    CRC冗余校验的原理和FPGA实现思路

    CRC校验码,顾名思义是用于 校验 的。它可以用于检测数据传输过程中是否出现错误(某些位,或某几位,或者某块区域位错误),反正 可以知道数据出错了,但是不能纠错 。 CRC校验,本质上是模2除法求余。将发送信息 M 当做被除数,发送方和接收方共同约定一个除数 G

    2024年02月08日
    浏览(10)
  • 计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码

    计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码

    带你度过期末难关 文章目录 一、差错控制 1、冗余编码 2、编码VS编码 二、检错编码 1、奇偶校验码 2、CRC循环冗余码 三、纠错编码————海明码 海明距离 1、确定校验码位数r 2、确定校验码和数据的位置 3、求出校验码的值 4、检错并纠错 纠错的方法一: 纠错方法二: 总

    2024年02月04日
    浏览(8)
  • 题解校验码—CRC循环校验码与海明校验码

    题解校验码—CRC循环校验码与海明校验码

    一个编码系统的码距是 任意两个码字 的最小距离。 例如个编码系统采用三位长度的二进制编码,若该系统有四种编码分别为:000,011,100,111,此编码系统中000与111的码距为3;011与000的码距为2;011与111的码距为1,则该编码系统的码距为1。 码距计算方法:两个编码按位异

    2024年02月04日
    浏览(13)
  • 解决灵科路由循环冗余校验错误排除操作指南

    本文为大家介绍的是由于路由器循环冗余校验错误,所造成POS故障的解决办法,循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现,从其检错能力来看,它所不能发现的错误的几率非常低。 一、组网环境 在灵科路由器的组网环境中,在个点使用

    2024年02月05日
    浏览(11)
  • DeepSpeed零冗余优化器Zero Redundancy Optimizer

    DeepSpeed零冗余优化器Zero Redundancy Optimizer

    内容 零概述 培训环境 启用零优化 训练 1.5B 参数 GPT-2 模型 训练 10B 参数 GPT-2 模型 使用 ZeRO-Infinity 训练万亿级模型 使用 ZeRO-Infinity 卸载到 CPU 和 NVMe 分配 Massive Megatron-LM 模型 以内存为中心的平铺 注册外部参数 提取权重 如果您还没有这样做,我们建议您在逐步完成本教程之

    2024年02月09日
    浏览(9)
  • CRC32校验算法原理及计算说明

    CRC32校验算法原理及计算说明

    本文主要介绍如何使用CRC32校验算法计算得出FCS(Frame Check Sequence帧检验序列). 参考: 1、CRC32加密算法原理 2、CRC多项式对应代码 作用:在远距离数据通信中,为确保高效而无差错地传送数据,对数据进行校验即差错控制。 CRC原理实际上就是在一个K位二进制数据序列之后附

    2023年04月22日
    浏览(8)
  • CRC校验原理与FPGA实现(含推导过程)

    CRC校验原理与FPGA实现(含推导过程)

      CRC校验全称为循环冗余校验(Cyclic Redundancy Check),常用于数据传输中的错误检测。   在学习CRC校验前,需要了解CRC校验中的几个基本概念: NAME:参数模型名称,比如CRC-8、CRC-16、CRC-32等 WIDTH:CRC校验位宽度 POLY:多项式的简写,用十六进制表示。例如:CRC-8的多项式

    2024年02月03日
    浏览(7)
  • 【Verilog】CRC校验码生成器原理及verilog实现

    【Verilog】CRC校验码生成器原理及verilog实现

    目录 一、CRC的基本原理  二、CRC生成步骤 2.1举个栗子 三、Verilog实现 四、参考资料 4.1 CRC在线计算器 CRC :Cyclic Redundancy Check循环冗余校验码         将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和

    2024年02月11日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包