(笔记)VHDL/Verilog之CRC(循环冗余校验)计算
背景:我们在使用VHDL或Verilog进行FPGA开发时,经常会遇到CRC校验计算的情况,如校验公式为:
那使用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/
生成后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 阅读(1392) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
2014-12-01 (笔记)linux设备驱动--LED驱动
2014-12-01 (笔记)Linux下查看CPU使用率的命令