基于FPGA的CRC32校验查找表算法的设计.docVIP

基于FPGA的CRC32校验查找表算法的设计.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于FPGA的CRC32校验查找表算法的设计.doc

基于FPGA的CRC32校验查找表算法的设计   摘 要:循环冗余码校验CRC广泛应用于数字通信和数据存储的数据检错。CRC校验分为串行方式校验、并行方式校验。串行方式校验采用串行移位寄存器,每1个clk计算1bit,处理速度慢。并行方式采用查找表算法,处理速度快。本文介绍了CRC32校验算法的FPGA实现方法,并通过Modelsim仿真,验证了算法的可行性和正确性。   关键词:循环冗余校验码;CRC32;FPGA   DOI:10.16640/j.cnki.37-1222/t.2016.10.188   0 引言   循环冗余校验码CRC是一种实现简单、校验能力强、在串行通信领域广泛采用的校验编码[1]。CRC校验的基本思想是利用线性编码理论,在发送端,对要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(即CRC码)r位,附在信息后边,构成了一个新的二进制码序列数共(k+r)位,然后发送出去[2]。在接收端,则根据信息码和CRC码之间所遵循的规则进行校验,以确定传送中是否出错。   1 CRC32生成查找表和CRC32数据校验   CRC32校验查找表算法采用正规查询表查询,该查询表是将“直接查询表”的索引值和表值直接镜像,正规查找表多项式POLY是0x04C11DB7。生成查找表的流程是首先对索引值0到0xFF数值镜像。以索引值1为例,镜像值为0x80,已对该8bit镜像值0x80左移24位变成32位CRC32值。对该值一次左移1位,移出的值若为1,则对移后的CRC32值与POLY进行异或操作得到新的CRC32值,否则不做运算。进行8次左移运算,最后的CRC32值在做镜像后的值即为索引值1的CRC32查找表值,按照该算法进行256次操作,可得到256个CRC32查找表值。   得到查找表后,则对数据进行CRC校验,其校验步骤是将待校验数据与32位寄存器的低8位做XOR运算得到一个指向查询表的索引值,将所将索引所指的表值与寄存器的高24位做XOR运算,得到的值更新到32位寄存器中,同时该值也为校验过的值,如数据没有全部处理完,则跳到开始进行运算。   2 FPGA硬件实现   FPGA实现CRC32校验时,一种方法是校验之前将CRC32生成的查找表值直接存入ROM中,按照索引值去取表内值。第二种方法是在校验前根据算法生成CRC32的查找表值,依次存入RAM中,生成查找表之后再按照索引值去取表内值。本文是按照第二种方式进行校验。这种方式的优点是灵活、易于操作。FPGA实现的流程图如图1所示,待校验数据Din与CRC32低8位异或的值产生查找表的索引值,由于查找表是RAM存储器,为了数据输出稳定,输出寄存一拍,从RAM出来的值会有两拍延迟。Din数据寄存一拍,CRC32数据输出寄存一拍,共有4拍数据延迟,所以CRC32会比串行校验提高8倍时钟周期。   生成查找表值代码段如下,其中tab_cnt_next一个周期的高电平将tab_cnt_reflect镜像值更新到crc32_table,ulPolynomial是校验多项式值32h04C11DB7,循环256次,并将256个crc32_table值镜像之后存入RAM中。   if(tab_cnt_next == 1b1)   crc32_table = {tab_cnt_reflect,24h0};   else if(crc32_table[31] == 1b1)   crc32_table = {crc32_table[30:0],1b0} ^ ulPolynomial;   else crc32_table = {crc32_table[30:0],1b0};   对Din数据进行校验的主要代码如下,dat_valid是一个周期的高电平,crc_value初始值为0,tab_index是RAM的读地址,两拍后从RAM读的值rd_ram_data和crc_value高24位异或更新到新的crc_value值。   if(dat_valid == 1b1)   tab_index =crc_value[7:0] ^ din;   else if(dat_valid_2d == 1b1)   crc_value = rd_ram_data ^ crc_value[31:8];   3 CRC32的仿真验证   CRC32生成查找表要循环256次完成查找表所有值的遍历,其用Modelsim仿真如图2所示,crc32_table的镜像值crc32_table_reflect即为查找表的值,图2中显示的32’h0、32’h32’hEE0E612C、32’h 990951BA即为CRC32正规查询表值

文档评论(0)

yingzhiguo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档