(笔记)VHDL/Verilog之CRC(循环冗余校验)计算

 

背景:我们在使用VHDL或Verilog进行FPGA开发时,经常会遇到CRC校验计算的情况,如校验公式为

G(x) = X8 + X4 + X3 + X2 + 1
G(x)=X3 +X+1

 

那使用VHDL或Verilog语言该如何进行设计呢?下方是总结分享。

 

1、首先推荐一个CRC循环冗余校验的在线计算工具

网址:CRC(循环冗余校验)在线计算_ip33.com    http://www.ip33.com/crc.html

 

 

 该在线工具可用于验证代码是否有效,如上图是基于“G(x) = X8 + X4 + X3 + X2 + 1”方式对数据“3E 03 00 EF DF”进行校验,结果是0x35。

 

2、推荐一个CRC代码自动生成平台,非常好用,可自动根据公式生成VHDL或Verilog代码

网址:Easics CRC Tool  http://crctool.easics.be/

 

 

 生成后的代码如下:

module CRC8_D8;

  // polynomial: x^8 + x^4 + x^3 + x^2 + 1
  // data width: 8
  // convention: the first serial bit is D[7]
  function [7:0] nextCRC8_D8;

    input [7:0] Data;
    input [7:0] crc;
    reg [7:0] d;
    reg [7:0] c;
    reg [7:0] newcrc;
  begin
    d = Data;
    c = crc;

    newcrc[0] = d[6] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[6];
    newcrc[1] = d[7] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[7];
    newcrc[2] = d[7] ^ d[5] ^ d[4] ^ d[2] ^ d[0] ^ c[0] ^ c[2] ^ c[4] ^ c[5] ^ c[7];
    newcrc[3] = d[4] ^ d[3] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[4];
    newcrc[4] = d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6];
    newcrc[5] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7];
    newcrc[6] = d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
    newcrc[7] = d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5];
    nextCRC8_D8 = newcrc;
  end
  endfunction
endmodule

  

3、如果需要仔细研究计算,可参考如下:

表示形式:多项式G(x):G(x) = X4+X3+1

假设:输入数据 Data,选定的多项式G(x)是x4 + x3 + 1.
所以G(M) = 11001.
CRC = Data mod G
注:CRC的位数要始终比G少1位,因为余数肯定比除数小且只小1位,高位为0不能省略。

CRC校验码的产生方式:模2除法

示例:

 

 

  • 发送端通过CRC校验码将Data转换成NewData发送;
  • 接收端接收到NewData对同样的G(M)进行模2运算,若没有余数,则数据正确传输,否则传输出现错误。

 

posted on 2022-12-01 13:18  tdyizhen1314  阅读(1237)  评论(0编辑  收藏  举报

导航