CRC循环冗余校验码verilog实现

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

前言

本题来自2021年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

确定校验码方法

首先看所选定的除数二进制位数(假设为n-k+1位),然后在要发送的数据(假设为k位)后面加上n-k位“0”,然后用这个加了n-k个“0“的新数据(一共是n位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码。
但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。例如此处,余数位数为n-k,除数位数为n-k+1
例如:
G(x)=x8+x2+x+1G(x) = x^8+x^2+x+1G(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 <= 72'b0;else if(crc_start)din_temp <= {din,8'b0};//补0操作else if(crc_en)begindin_temp[71:64] <= din_temp[71]? din_temp[70:63]^poly : din_temp[70:63];//实际上,这步我们做了运算与移动操作din_temp[63:0] <= { din_temp[62:0],1'b0};//最后位补0end//使能模块always@(posedge clk or negedge rst_n)if(~rst_n)crc_en <= 1'b0;else if(crc_start)crc_en <= 1'b1;else if(crc_cnt == 6'd63)crc_en <= 1'b0;//计数器模块always@(posedge clk or negedge rst_n)if(~rst_n)crc_cnt <= 6'd0;else if(crc_start)crc_cnt <= 6'd0;else if(crc_en)crc_cnt <= crc_cnt +1'b1;//输出标志位always@(posedge clk or negedge rst_n)if(~rst_n)crc_vld <= 1'b0;else if(crc_en && crc_cnt == 6'd63)crc_vld <= 1'b1;elsecrc_vld <= 1'b0;assign crc_o = din_temp[71:64];endmodule

TB代码

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/05/08 13:38:26
// Design Name:
// Module Name: testbench
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module tb_crc();reg  clk;reg rst_n;reg [63:0]din;reg  crc_start;wire crc_vld;wire[7:0]crc_o;wire[5:0]crc_cnt;
always #10 clk = ~clk;initial beginclk = 1'b0; rst_n =1'b0;din = 64'd0;crc_start = 1'b0;//给激励信号#103 //错开clk和rst的沿rst_n = 1'b1;@(posedge clk);//等待一个时钟的上升沿@(posedge clk)begincrc_start = 1'b1;din = 64'h1234567812345678;//8x4x4 = 64位二进制位end@(posedge clk)crc_start = 1'b0;//等结果@(posedge crc_vld)begin#2//为了采集准确的上升沿,crc_o向后延if(crc_o == 8'h12)//16进制1个数4位$fdisplay ("Correct");else$fdisplay ("Incorrect");end // #1000//    $stop;end
crc_8 crc_8_u(.clk(clk),. rst_n(rst_n),.din(din),.crc_start(crc_start),.crc_vld(crc_vld),.crc_o(crc_o),.crc_cnt(crc_cnt)
);
endmodule

仿真截图

最后让我们来一张仿真截图吧

引用

[1]: http://adrai.github.io/flowchart.js/# 茶乡浪子. 最通俗的CRC校验原理剖析

提示:这里可以添加学习目标
例如:一周掌握 Java 入门知识


CRC_8循环冗余校验码verilog实现相关推荐

  1. 差错控制:海明码、循环冗余校验码

    海明码 海明码的编码方法 例题: D B 循环冗余校验码 奇偶校验

  2. 循环冗余校验码CRC,求解步骤

    循环冗余校验码CRC,是软考-计算机组成原理 中一种重要的编码. 下面只是简要描述求解CRC码的解题步骤,面向有一定理论基础的朋友. 直接看例题. 例.信息位: 10100110   生成多项式: 解 ...

  3. CRC24循环冗余校验码的FPGA实现

    CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据 ...

  4. 第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]

    第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英.戴志涛 2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/ ...

  5. 计组之数据运算:2、奇偶校验码、海明校验码 循环冗余校验码

    2.奇偶校验码 奇偶校验相关概念: 奇偶校验: 海明校验: 思维导图: 基本思想: 求解步骤: 问题: 循环冗余校验码: 原理: 步骤: 纠错: 奇偶校验相关概念: 1.码字:00组成一个码字A 2. ...

  6. 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

    笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...

  7. 循环冗余校验码例题[转帖]

    循环冗余较验 循环冗余校验码是模2除,也就是说他是异或算法.而假如我们接受到得CRC码在除以循环冗余检验校验码时有余数说明,在传输过程中,出错了! 在串行传送(磁盘.通讯)或者TCP/IP协议中,广泛 ...

  8. CRC循环冗余校验码总结

    一.CRC简介 先在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用除法及余数的原理来作错误侦测(Error Detecting ...

  9. 循环冗余校验码CRC原理和实例

    今天同事问了一个CRC(循环冗余校验码)的问题,好奇心之下学习了一下. 首先说它的原理,百度百科上也有,我就简单说一下,它其实就是采用多项式编码的方法,对于要发送的信息码R,发送方和接收方约定好多项式 ...

  10. CRC 循环冗余校验码 的计算方法

    循环冗余校验CRC(Cyclical Redundancy Check)字段位于尾部,有32位,有时称为IEEE/ANSI标准的CRC32.要使用一个n位CRC监测 数据传输错误,被检查的消息首先要追 ...

最新文章

  1. Python类访问限制
  2. 8080端口被占用_Spring Cloud IPv6端口问题排坑
  3. java实现https免证书认证
  4. 前端之 XMLHttpRequest
  5. 点触科技:构建实时计算和数据仓库解决方案
  6. 实现机器学习的循序渐进指南XI——DBSCAN
  7. css多行文本溢出显示省略号(…)
  8. 重庆市南川隆化职业学校计算机,重庆市第十三届中等职业学校职业技能大赛“web前端开发”赛项在南川隆化职中举行...
  9. 前端证券项目_非科班二本前端大厂面试的心路历程和总结(腾讯、头条、阿里、京东)...
  10. 【对讲机的那点事】对讲机数字语音加密,保障通信安全
  11. Java—集合框架图
  12. echart 迁徙图
  13. unity tags的坑
  14. 赵小楼《天道》《遥远的救世主》深度解析(20)(补)肖亚文的不当吃不当喝和丁元英没接受18万马克的补偿
  15. Hibernate框架基础——cascade属性
  16. 止血、回血 苏宁易购正在复苏路上
  17. 前有阿里巴巴,后有拼多多,网易考拉要去哪儿?
  18. O2OA 稳定版 V4.2235 发布,功能性能等多方面优化升级
  19. 2021软件工程保研经历
  20. 百度、Google.yahoo排名机制和优化规则

热门文章

  1. 基于Chrome内核(WebKit.net)定制开发DoNet浏览器
  2. 基于RFID定位技术的文物仓库管理--新导智能
  3. 低功耗微波雷达模块,LED庭院灯智能感应,雷达传感器助力节能减排
  4. 一种多源信息融合方法及其应用(Matlab代码实现)
  5. Flutter 页面弹出毛玻璃浮层
  6. ros中odometry数据生成方式与分发去向
  7. 如何把大写金额变为小写数字_如何将小写金额变成大写数值
  8. python实现小写金额转换成大写
  9. ognl # % 的作用(井号,星号,百分号)
  10. 访问网上邻居-修改账号密码