当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]CRC基本原理在串行数据流的最有效的检错方案是CRC(Cyclic Redundancy check)循环冗余检验,CRC循环冗余校验最根本的原理就是将原始数据除以某个固定的数,然后所得的余数就

CRC基本原理

在串行数据流的最有效的检错方案是CRC(Cyclic Redundancy check)循环冗余检验,CRC循环冗余校验最根本的原理就是将原始数据除以某个固定的数,然后所得的余数就是CRC校验码,根据校验码位数的不同常用的CRC循环冗余校验算法有:CRC8、CRC12、CCITT CRC16、ANSI CRC16、CRC32。这次我只实现了CRC8的算法,至于CRC16或CRC32下次再研究。

对于CRC的基本原理我们可以根据具体的硬件电路图来理解,通常CRC循环冗余校验可以表示为带有反馈的移位寄存器,移位寄存器的阶数就是CRC字节的位数。另一种表示方法是将CRC表示为 X的多项式,X的幂次数就是CRC字节相应的位数,系数为“1”表示相对应阶数的寄存器有反馈,系数为“0”表示无反馈。

 

计算之前先将移位寄存器全部清零,然后将数据一位一位地串行方式输入移位寄存器,当所要计算的有用数据最后一位输入后,此时移位寄存器中的值就是所输入这段有用数据的CRC8校验值。

我们可以通过CRC8的两个重要性质来验证我们事先CRC8算法的正确性,这两个性质在接下来的仿真过程中要用到:

1)当CRC8的移位寄存器的初始值为八位的数据A时,如果将相同的8位数据A依次输入给移位寄存器,寄存器将清零。也可以说成是A除以A余数为0。

2)当CRC8的移位寄存器的初始值为八位的数据 时,如果我们将 的反码 依次输入给移位寄存器,移位寄存器的结果将是35H,也就是十进制的53。利用该特性可以对CRC8算法进行验证。

算法实现

以上所介绍的这种串行移位寄存器的方式主要是帮助我们掌握CRC校验的基本原理,当然实现上也可以用Verilog语言实现这种硬件电路,可想而知这种方式计算起来是相当慢的,要1个clk计算1bit。常用的CRC8算法是查找表算法。

该算法是以一次输入8位数据din为单位的,也就是说一个时钟内并行输入一个字节数据,下一个时钟即可算出CRC8校验字节。利用Verilog语言先定义一个CRC8字节的寄存器,在CRC8寄存器内容的基础上,利用新输入的8位数据计算新的CRC8字节来更新CRC8寄存器。如果CRC8寄存器初始值为0,那么输入8位数据后计算得到的CRC8就有256种可能。因此,定义了一个查找表reg [7:0] CRC8_table[255:0]并初始化为如下所示:

 

下面说下实现该算法的过程:输入的8位数据din即作为查找表CRC8_table的索引i = din,然后执行CRC8 《= CRC8_table语句就得到了该字节的CRC8校验码,然而以上过程的前提是CRC8寄存器初始化为0,若CRC8寄存器不为0,那么查找表的索引i 的计算应为当前CRC8与输入数据的异或,即 i = CRC8^din,然后执行语句CRC8 《= CRC8_table就得到了新的CRC8校验码。依次循环处理每个字节。。。。。。

首先定义了个module

 

SCLK输入时钟,在上升沿对输入数据din[7:0]采集,使能信号EN, 计算结果CRC8[7:0]

仿真结果:

1)输入数据依次为:8‘h11 8‘h22 8‘h33 8‘h44 8‘h55 8‘h66 8‘h77 8‘h88 在最后一个字节的下一个时钟上升沿得到校验结果为8’h7b

 

2)根据性质一,如果我们继续输入8‘h7b,得到的结果将是8’h00

 

3)根据性质二,8‘h7b的反码是8’h84,如果在1)数据的基础上继续输入8’h84,将得到8‘h35,在封装IP核的过程中我们只需要上一步的.v文件,也就是CRC8_LookupTable.v文件。

 

1)打开vivado, 点击 manage IP 创建新IP,如下图:

 


2)选择IP核工程路径:CRC8_LUT_IP这个文件夹是之前创建的,以后我们所有的创建的文件都在这个文件下,这个路径很重要

 


3)点击finish后,在TOOL下拉菜单选择Create and Package IP

 


4)点击next,选择Create New AXI4 Peripheral,注意默认的路径是 CRC8_LUT_IP/managed_ip_project ,这个事错误的,如果在这个路径下的话,在接下来的过程中会遇到错误,将路径改为: CRC8_LUT_IP下

 

[!--empirenews.page--]

 


5)添加IP核的详细信息:

 


6)更改AXI总线名字,添加4个32位的slv_reg寄存器,其实都是默认的即可

 

7)选择Generate Drivers,点击next,然后finish

 

 

8)这样我们就可以在IP Catalog下搜索CRC,就会找到自己生成的IP核“CRC8_LUT_ip_V1_0”, 然后右键选择Edit in IP Packager,这样就会打开IP核编辑界面:

 

9)在flow navigator栏中选择 add aoirce 添加之前自己编辑的CRC算法的.v文件,即CRC8_LookupTable.v

 

 

10)会发现在工程里一共3个.v文件:

CRC8_LUT_ip_v1_0_S_AXI.v 和 CRC8_LUT_ip_v1_0.v 和刚刚添加的自己的CRC8_LookupTable.v文件,然后需要修改CRC8_LUT_ip_v1_0_s_AXI.v 文件,把我们的IP核挂载到AXI总线上,其实就是一个简单的例化过程。由于我所创建的IP核不需要和FPGA外部通信,不用分配引脚,只需和AXI总线通信,所以就不用在CRC8_LUT_ip_v1_0_S_AXI.v添加用户input或者output,只需把slv_reg 0 1 2 3 分别连接到sclk、en、din和CRC8.

由于slv_reg3是一个寄存器型的,所以要定义一个wie型变量CRC8,再连接到slv_reg3,不然综合会出错。

 


 


11)然后保存,综合,如果报错,继续修改综合,知道没有报错。

 

12)综合完成后,点击Package IP-CRC8_LUT_ip标签页,点击Categories ,选择我们的IP核将会出现在IP catalog的哪个类别里面,如果选择“basic elements” 就会在IP catalog的basic elements类别下找到,如图

 

 

13)添加IP核支持的芯片型号,也就是添加family,因为要在microZed板子上跑,所以要把zynq系列添加进来

14)最后封装IP,如果我们能在Create archive of IP所示的路径下找到这个压缩文件,就说明我们的IP制定成功了~

 

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭