热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于FPGA的32位CRC校验码生成器设计与实现

本文介绍了基于FPGA的32位CRC校验码生成器的设计与实现。该生成器利用FPGA的并行处理能力,实现了高效的数据校验功能。通过优化的算法和逻辑结构,该生成器能够快速准确地生成32位CRC校验码,适用于高速数据传输和存储系统的数据完整性验证。实验结果表明,该生成器具有良好的性能和可靠性,能够满足实际应用中的需求。
e7aee9ec237af20fbe34ea8519c88452.gif大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来基于FPGA 的CRC校验码生成器设计,话不多说,上货。

一、概述

CRC,即Cyclic Redundancy Check,循环冗余校验,是一种数字通信中的常用信道编码技术。其特征是信息段和校验字段的长度可以任意选定。二、CRC校验的基本原理CRC码是由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如:(7,3)码:110 1001,前三位110为信息码,1001为校验码。三、校验码的生成规则1) 将原信息码左移r bit,右侧补零,如 110--> 110 0000;2) 用110 0000除以g(x)  (注意,使用的是模2除法,见下文),得到的余数即为CRC校验码;3) 将校验码续接到信息码的尾部,形成CRC码。四、关于生成多项式g(x)在产生CRC校验码时,要用到除法运算,一般来说,这是比较麻烦的,因此,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:      6d57a559e2c433fd8a92cea166a15eab.png所有二进制数均被表示为一个多项式,x仅是码元位置的标记,因此我们并不关心x的取值,称之为码多项式。(我没研究过CRC代数推理过程,没体会到用多项式计算的方便之处,这里要学会的就是给出生成多项式g(x),能写出对应的二进制即可)常见的生成多项式如下:cba55ee47a0bb71b51984d32aae53e67.png五、关于模2除法模2运算就是加法不考虑进位,减法不考虑借位。   1)加法运算:     0+0=0        0+1=1        1+0=1        1+1=0例如0101+0011=0110,列竖式计算:
          0 1 0 1
      + 0 0 1 1
      ──────
          0 1 1 02)减法运算:      0-0=0        0-1=1        1-0=1        1-1=0  例如0110-0011=0101,列竖式计算:
         0 1 1 0
     -  0 0 1 1
       ──────
         0 1 0 13)乘法运算0×0=0        0×1=0        1×0=0        1×1=1多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算:   2b201bf4f497b95b2fe2b8c10780f19a.png4)除法运算:
       0÷1=0        1÷1=1多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:989d0d28ef4e54ec514a8450ae77dbc0.png掌握了上面的运算规则,你可以尝试计算一个复杂一点的,如下:       9fae621473f85809cbc6a5e2a8d6cf66.png如果得到的余数结果正确,你掌握的东西就够用了。六、CRC-CCITT的硬件实现CRC-CCITT的生成多项式为:   2f526ebd25e6a7a1335af4a733743962.png对应的二进制数就是上面复杂运算中那个除数。由刚才的计算可知,对于8 bit的数据 0xaa,它的CRC校验码为0001 0100 1010 0000,下面用verilog来实现,看能否得到这个结果:要实现这一过程,仍然需要LFSR电路,参看《FPGA设计中,产生LFSR伪随机数》中关于该电路特性的介绍,如果你不需要了解原理,直接略过即可;有所改进的地方就是,可以将伪随机数发生器看作一个Moore型状态机,它的输出只与当前的状态有关;而此时利用LFSR电路,需要引入数据输入端,输出不仅取决于当前的状态,还取决于输入信号,相当于Mealy型状态机,如下图:  7a52065aedc378340ba8d37fcf85f5c0.png注意对比与伪随机数产生器中该反馈支路的区别。反馈项gr+1gr……g0为生成多项式的系数,依然是1代表存在反馈,0代表不存在反馈;此电路可以完成上述的模2除法操作,若我们要求0xaa的CRC校验码,则从高位到低位顺序输入0xaa共8 bit后,D15……D0中的数据即为所要求的余数,即CRC校验位。七、verilog描述如果用时序电路串行实现,则8 bit数据要移位8次,就需要8个clk,效率低下,为了能在一个时钟周期输出结果,必须采用组合电路,当然,这是以空间换时间的方法,由于使用了for循环8次,直观的讲电路规模将扩大8倍。2d0032eaf6237c53d12bfa5495acfa8d.pngb4c5cc100cb8d5cc79e9e9bc4db786b4.png仿真结果如下:得到的是数据0xaa和0xf0的CRC校验码,为验证结果的正确性,可以按照模2法则手工计算一下。016f02114043e37aa9d8a32c4be339c8.png八、其他例子同样给出一个4 bit信息位,5 bitCRC码的(9,4)码的程序和仿真结果,程序的流程与上述流程完全一样:       75af09895a87994d5d7a61c124f027b7.png270e96eb1565c215da9bae83cd9661f3.png6c28569dbbcc93ff1dee13571a015bd8.png说明:细心的大侠可能发现,本篇对LFSR电路能完成模2求余操作的原因避而不谈,不是因为不告诉你,是因为目前也不是很清楚,工科背景对数学推理实在是有点不知所云,尤其是看到国内教材那好几页的公式的时候,如果您有通俗易懂的讲解LFSR电路由来与应用的文章,注意是深入浅出的,请大力推荐,在此感谢。END后续会持续更新,带来Vivado、 ISE、Quartus II 、Candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

往期推荐

  • FPGA零基础学习:VGA协议驱动设计

  • FPGA零基础学习:IIC协议驱动设计

  • Zynq:用PS控制DDR3内存读写

  • 举例分析 Intel FPGA 和 Xilinx FPGA 的区别

  • 新谈:为什么你觉得FPGA难学?如何入门?

25d308628b6b37eb0b4439b660137fb6.gif

af149a4ed217f179a8b141848e5c764f.png

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。

FPGA技术江湖微信交流群

277c4eacf65d88cce406764f34ac8421.png

加群主微信,备注职业+方向+名字进群

FPGA技术江湖QQ交流群

38794fdb260db4cdea72c93559c81c5b.png

备注地区+职业+方向+名字进群

2e51d4219e8ff322b80bc1b23dc3421f.png



推荐阅读
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
author-avatar
百脑汇惠州店_956
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有