CRC

您所在的位置:网站首页 crc校验码在线生成 CRC

CRC

2023-08-17 06:36| 来源: 网络整理| 查看: 265

CRC循环冗余校验码verilog实现 前言CRC原理概述过程模2除法确定校验码方法 代码实现模块代码TB代码仿真截图 引用

前言

本题来自2021年bit北京集电赛数字组培训,出题为张延军老师。 一个勤勤恳恳的入门菜鸟大学生以此作为自己第一篇博客,记录一下学习的内容,若有不足或错误的地方,欢迎大家在评论区指正!! bit张延军老师出题

CRC原理 概述

为了检测数据传输是否准确,人们发明了许多检测方式,常见的有奇偶校验、因特网校验和循环冗余校验等。 在这里插入图片描述

循环冗余码(CRC)的本质就是在需要发送的数据(D)末尾附加一个校验码(F),生成一个新数据(T)发送给接收端。发送端与接收端共同约定一个整数,发送机对D进行“去余”处理,使得接收端接收到的T能够被此整数整除。若无法整除则证明传输过程中出现了差错。

过程

(1)约定一个除数P(二进制比特串,通常以多项式的方式表示) (2)发送方在发送前根据数据D确定F,生成CRC码 T,T 即为数据位D与校 验位F的拼接,发送T (3)接收方收到CRC码 T,以“模2除法”除以除数P,当且仅当余数为 0时接收方认为没有差错。

模2除法

模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0 模2算法实例

确定校验码方法

首先看所选定的除数二进制位数(假设为n-k+1位),然后在要发送的数据(假设为k位)后面加上n-k位“0”,然后用这个加了n-k个“0“的新数据(一共是n位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码。 但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。例如此处,余数位数为n-k,除数位数为n-k+1 例如: G ( x ) = x 8 + x 2 + x + 1 G(x) = x^8+x^2+x+1 G(x)=x8+x2+x+1 此时 G ( x ) G(x) G(x)一共为9位,其二进制比特串为:100000111 此时CRC校验码位数应为8(比生成多项式的位数少1)

代码实现 模块代码 `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2021/05/06 19:37:47 // Design Name: wangmeinan // Module Name: CRC_code // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module crc_8( input clk, input rst_n, input [63:0]din, input crc_start, output reg crc_vld, output wire[7:0]crc_o, output reg[5:0] crc_cnt ); parameter [7:0]poly = 8'b0000_0111; //除数为1_0000_0111,第一位为1。 //因为我们需要的余数,最高为8位,所以实际上最高位我们用不到。于是为节省资源,可在运算时将整个数组向前移动一位。并且在存储除数时,可忽略第一位1。 //运算时我们先判断被除数最高位是否为1,若为1,剩下8位进行亦或操作后,将其填入寄存器前8位。若为0,则将被除数直接落下,填入寄存器前8位。 reg [71:0]din_temp;//寄存器,存储din值进行处理 reg crc_en;//运算使能信号,当该信号使能时,将din_temp向左移动一格,将其与poly进行“模2除法” // reg [5:0]crc_cnt; //一般一个语言块,我们只给一个变量赋值 always@(posedge clk or negedge rst_n) if(~rst_n) din_temp


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3