(笔记)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运算,若没有余数,则数据正确传输,否则传输出现错误。
作者:tdyizhen1314(一位从事软硬件开发十年以上的老兵的故事,希望与大家一起交流,共同进步)
邮箱:495567585@qq.com
posted on 2022-12-01 13:18 tdyizhen1314 阅读(1237) 评论(0) 编辑 收藏 举报