Verilog 实现32位并行CRC编解码 可在一个时钟周期出结果
CRC简介
CRC(Cyclic Redundancy Check,循环冗余校验)是数据帧传输中常用的一种差错控制编码方式,针对要发送的数据帧,使用一些特定的多项式可以计算出CRC校验结果,CRC校验结果和原始数据一起传输到接收端。
接收端在接收数据的同时按照相同的多项式对接收数据进行校验运算,并将 校验结果和接收的结果进行对比,如果二二者相同则认为没有发生传输错误;如果不同,则认为是发生了传输错误。从理论上说,如果接收端计算出的CRC值与接收到的CRC值匹配,数据中仍有出错的可能,但由于这种可能性极低,在实际应用中可以视为0,即没有错误出现。当接收端CRC不匹配时,接收端可以采取不同的措施,例如,丢弃数据包并通知对端,要求对端重新发送,或者只进行丢弃处理,通过高层协议实现数据的重传。
CRC多项式
本文介绍的并行CRC多项式为:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1.为32CRC常用多项式。crc32=32’h104c11db7.
仿真
很多提供的CRC编解码都是Verilog串行资料,因此博主花了点时间验证了Verilog并行实现。废话少说上图:
串行CRC
对于串行32位CRC,需要32个时钟周期出结果。本文一帧数据96bit,所以串行32crc需要分3批运算96次。
第一批
运算的第一批32位数据32’h00100000,crc结果32’h1d8ac870
运算的第二批32位数据32’h55555555,crc结果32’ha48ebce5
运算的第三批32位数据32’haaaaaaaa,crc结果32’hfc3c3755
则,96’h0010000055555555aaaaaaaa的串行CRC结果为32’hfc3c3755.一共用了96个时钟周期运算。
并行CRC
第一个时钟32位数据32’h00100000,并行crc结果32’h1d8ac870
第二个时钟32位数据32’h55555555,并行crc结果32’ha48ebce5
第三个时钟32位数据32’haaaaaaaa,并行crc结果32’hfc3c3755
96’h0010000055555555aaaaaaaa的并行CRC结果为32’hfc3c3755.
可以看出并行CRC和串行CRC结果保持一致,但是在同样的一帧96bit数据串行crc用了96个clk.并行crc用了3个clk(不看其他开销)。
具体Verilog的并行CRC代码如下链接下载
链接: https://download.csdn.net/download/baozouxiaoluoli/22331004.