基于ARM的CRC算法和基于FPGA的算法性能比较

发布者:学海星空最新更新时间:2016-06-20 来源: eefocus关键字:ARM  CRC算法  FPGA 手机看文章 扫描二维码
随时随地手机看文章
CRC是一种实际通信中应用很广泛的线性分组码,具有很强的检错能力,但没有纠错能力。在应用的时候可以根据不同的场合选择硬件电路或者软件算法来实现,硬件实现的原理是根据特定的CRC多项式对输入信号和上一次校验结果进行移位异或操作,得到本次CRC校验结果;软件则可以采用多种不同算法进行计算,相应的时间复杂度会有所差别 

题目分析:本题目的设计意图在于使用FPGA中硬件资源对某些流程固定的软件算法进行加速,即algorithm-hardware codesign,是软硬协同设计中更为具体的一种形式,本题目中的CRC算法只是其中一种实例。这种由硬件电路实现的软件算法通常能够很大程度上的降低计算时间,代价仅是FPGA内部所消耗的一些逻辑、存储资源,但对于如今的FPGA芯片来讲是完全可以接受的。本题目的设立将充分验证MicroZed开发板中Zynq系列芯片的优势,因为它集成了高性能ARM处理器内核、充足外设资源和FPGA逻辑资源,对于软硬件协同设计的嵌入式应用,是很好的选择。

 

(二)过程说明

1. 软件学习:Vivado+ SDK

要在两周时间内完成挑战题目,需尽快学会题目规定的Vivado + SDK软件开发流程。其中第一个目标就是要搭建起基于ARM CortexA9的嵌入式系统,才能够进行下一步CRC算法的实现和调试。在Vivado 2013.4及以上的版本中都包含支持MicroZed开发板的硬件定义和板级支持包,新建工程时选中就会将开发板的所有信息导入到工程中,十分快捷。

 


 

有很多网友或MicroZed、Zynq使用者上传过很详细的图文开发流程,在这里我就不再重复演示了。这些教程包含了从入门级到专家级的MicroZed开发板、Vivado/SDK软件使用教程甚至代码。正是由于这些人乐于分享的精神,才使得国内FPGA设计技术能够快速、深入的发展起来。在这里跟大家推荐一个名字叫“亚当泰勒玩转MicroZed”的连载,中英版都有,但英文版的更全一些。这个入门级的图文教学可以教大家如何从一个新手快速熟悉基于Vivado+SDK的MicroZed开发流程,本题目能够顺利完成离不开这位外国友人的帮助。连载中除了说明开发板的使用、软件设计/调试流程外,还包含部分PS基本外设的使用方法,比如GPIO、中断控制器、三重定时器以及PS与PL进行通信使用的AXI4总线搭建/调试方法等。在这里提一下用Vivado进行设计的一个典型特点:在搭建嵌入式硬件系统时,它采用的是模块图的形式比PlanAhead更直观一些,下图就是本题目最终设计的系统模块图:

 

 

 

其中包含了CortexA9处理器系统、AXI总线互连IP以及PL实现的自定义CRC算法IP。

 

2. 基于ARM的CRC算法实现(PS端)及性能比较流程

 

软件CRC算法实现方法有很多种,目前大多使用查表法,具有较低的算法复杂度和运行时间。但是此题目的目的在于比较硬件加速对某种软件算法的性能提升,需要使用与PL端相同的算法实现才更有说服性。所以在ARM中实现的32bit CRC校验采用根据生产多项式按bit异或的方式,需要将输入的32bit整型数据拆分为32个单bit数据进行运算,然后将结果重新组合为32bit整型,如下所示

 

 

 

另外,为确保以太网数据包CRC校验的真实性,在本题目中使用了Wireshark从网络中随意抓取的一个ARP广播包,如下图:

 

 

下面向大家说明本题目进行性能比较时采用的流程:

 

首先,在进行性能比较时,统一时间标准是必要的。由于PS端进行时间计算采用的是TTC三重定时器,将其工作频率设为系统内部ARM_PLL产生的CPU_1X,约为133MHz。同时将其通过FCLK_CLK0信号输出到PL端用作CRC校验模块的工作时钟,能够确保PS端与PL端的计时标准一致性,如下图:

 

另外,为体现CRC循环冗余校验中的“循环”特点,本人将ARP数据包的完整校验过程分步呈现了出来。使用了开发板上唯一的GPIO按键进行过程控制,每次按键产生一次中断,执行一次中断比较程序。每次中断比较程序进行对比的数据包都会比上一次多一组(32bit),直到完整的ARP数据包完成CRC校验,则继续重复初始的校验过程。

 

按键中断程序中,首先进行PS端的CRC校验和计时,之后将数据包通过GP总线传送到PL端,PL端接收到完整数据包后进行自动校验和计时,完成后将结果返回PS端,流程如下:Reset Timer—>Start Timer—>Start CRC Calculate Function—>StopTimer—>Get Counter Value—>Output PS Result—>.Packet Transmit—>StartPL CRC FSM—>Read Back Result—> Output PL Result—>Reset Control Reg—>Return.

 

按键中断比较程序输出内容如下:

Ø每次按键触发后,首先输出提示:

“**********CRC Calculate Begin!**************”

Ø随后输出本次PS与PL进行CRC校验的数据:

“---------Packet is :-----------”

“数据包内容”(32bit为一组)

“---------------------------------”

Ø首先输出PS端CRC校验结果以及计算时间:

“PS_CRC = 0x......; PS_CRC_TIME = ……”

Ø之后输出PL端CRC校验结果以及计算时间:

“PL_CRC = 0x......; PL_CRC_TIME = ……”

连续按下按键,则超级终端返回内容如下:

 

 

 

以上就是本题目的CRC算法比较流程以及PS端的实现方案,接下来介绍PL端的实现方法。

 

3. 基于FPGA的CRC算法实现(PL端)

题目要求使用GP,HP,ACP总线完成数据帧的传输,如何完成数据帧的传输并界定帧的起始和截止是任务的重点。由于数据帧的长度并不大,也没有高速传输的要求,因此采用了最常用的GP总线。

实现方案:本人选择通过GP总线对自定义外设myip_crc_0中的4个控制/数据寄存器reg0~3进行读写,来完成数据帧的传输以及结果的返回功能。其中reg0为控制寄存器,包含标记帧起始的SOP和帧截止的EOP信号;reg1为数据寄存器,用于接收对端发送的32bit数据帧;reg2和reg3用于存储CRC校验的结果和消耗的时间。在一次帧传输开始后,所有接收的32bit数据会被自动存入FIFO中,当EOP信号有效时开始对FIFO内的全部数据进行连续的CRC校验并进行计时,校验完成后将结果存储到寄存器中并返回给PS端。

 

设计细节:生成带有AXI从接口的自定义IP核是本题目设计中的一个重点,需要选择好对应参数,并同时生成驱动以备软件使用:

 

 


 

建立好新的IP后需要在AddressEditor中为其分配地址空间

 

 

然后进入IP Packager中对其进行各项配置

并且每次修改后记得进入“Reviewand Package”中点击”Re-package IP”进行保存。

 

IP核生成之后,下一步需要对AXI从接口模块源文件“myip_crc_v1_0_S00_AXI.v”进行部分修改并在其中例化自定义功能模块。该源文件包含AXI Slave接口中每个输入输出信号的含义注释以及AXI协议功能实现部分的代码注释,方便设计人员进行阅读和修改。

 

在myip_crc_v1_0_S00_AXI.v中除了例化自定义的模块外,对协议本身部分的代码也进行了少许修改,使寄存器reg0~reg3可以同时被PL端进行赋值,并且控制向reg1写入的数据自动写入FIFO中。当接收到EOP信号后,启动CRC运算,连续读取FIFO中的数据包并进行校验,直到FIFO读空后完成本次校验并将结果写入寄存器reg2、reg3中返回。

 

仿真结果:

下图为数据包接收及校验过程仿真,测试的是数据包长度为五的情况

下图为五组连续的校验结果,与超级终端返回的初始五次比较结果吻合

 

以上便是PL端CRC算法的设计实现方法。

 

(三)总结

本次为期两周的Zynq极客挑战赛告于段落了,对于楼主来说这次比赛的挑战性还不小。困难主要体现在比赛之前我仅有过MicroBlaze + XPS的SOC经验,没有接触过Zynq器件和Vivado。在短时间内熟悉软硬件、设计流程需要十分专注的学习和尝试,并且寻找合适的学习资源。另外,时间也是一个问题,在挑战期间突发的事情会打乱设计调试的进度,真正用来进行开发的时间也就一个星期左右。优势在于之前是做计算机网络应用方面的,对题目二中CRC算法的FPGA设计实现有一定经验。最终,在规定的时间内完成了题目中的前四个要求,只是还有一些想法未能及时实现,比如使用MAC控制器从网络中实时抓取长度可变、内容较大的数据包进行CRC校验,使本次设计具有更大的应用意义并提高设计难度。

最后,再次感谢EETOP论坛给予本次挑战机会。希望越来越多的FPGA、嵌入式爱好者参与到其中,从中学习、思考、体验,收获更多的知识和技能。同时也祝愿中国的电子设计、制造行业能够迅速发展,不断进步!

关键字:ARM  CRC算法  FPGA 引用地址:基于ARM的CRC算法和基于FPGA的算法性能比较

上一篇:STM32F4-浮点DSP库的MDK开发环境的设置
下一篇:STM32的CAN总线的标识符过滤器组使用注意事项

推荐阅读最新更新时间:2024-03-16 14:58

ARM平台上如何才能以节能方式来设计和编软件
内容摘要:在强调便携式设备的电池寿命时,看起来比较奇怪是,很少有软件工程师在其日常项目任务中真正做到了减少能耗。我猜想对这个课题有所想法的那些人可能都是本着荣辱自担的想法才关注此课题的。我们到了要做些改变的时期。随着电池寿命和性能要求的矛盾持续,我们作为软件工程师不得不要用更多时间来找出如何才能以节能方式来设计和编写我们的软件,至少在工具能满足我们要求之前需要这样做。 我们这些软件工程师都热衷于为我们遇到的问题找出完美的解决方案。但奇怪的是,我们会发现在这个特定的领域,没有一个完美的解决方案。聪明的技巧可能会节省一些功率,但是这个领域是由其他更简单的因素支配的。就象房间里有几头很大的大象,我们必须要先小心翼翼地猎取我们
[单片机]
在<font color='red'>ARM</font>平台上如何才能以节能方式来设计和编软件
嵌入式linux面试题解析(一)——ARM部分一
1、FIQ比IRQ快的原因: A、FIQ模式的R8–R14寄存器是独有的,FIQ处理程序可以不必执行保存和恢复中断现场的指令。 B、FIQ可以将ISR直接放在FIQ后面的地址空间,不需要跳转。 2、中断与异常有何区别 异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;所谓中断是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。 3、在ARM系统中,在函数调用的时候,参数是通
[单片机]
Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式
模仿 STM32 驱动开发格式实验 C 语言编写 LED 灯驱动的时候,每个寄存器的地址我们都需要写宏定义,使用起来非常的不方便。我们在学习 STM32 的时候,可以使用“GPIOB- ODR”这种方式来给GPIOB 的寄存器 ODR 赋值,因为在 STM32 中同属于一个外设的所有寄存器地址基本是相邻的(有些会有保留寄存器)。因此我们可以借助 C 语言里面的结构体成员地址递增的特点来将某个外设的所有寄存器写入到一个结构体里面,然后定义一个结构体指针指向这个外设的寄存器基地址,这样我们就可以通过这个结构体指针来访问这个外设的所有寄存器。同理, I.MX6U 也可以使用这种方法来定义外设寄存器,本次我们就模仿 STM32 里面的寄存
[单片机]
Linux之<font color='red'>ARM</font>(IMX6U)裸机模仿STM32驱动开发格式
ARM中的5种异常模式和7种中断源
ARM中有5种异常模式,有7种中断源。这7种中断源中有些中断是我们希望发生的,但有些中断是我们不希望发生的。 我们希望发生的中断: 软中断:属于svc模式,通过SWI指令便可以产生软中断,进入到svc模式。 irq中断:属于irq模式,当产生普通的外部中断时,处理器便进入到IRQ模式。 fiq中断:属于fiq模式,当产生高优先级外部中断时,处理器便进入到FIQ模式。 我们不希望发生的中断: 复位:属于svc模式,当系统上电时便会产生复位中断,系统进入到svc模式。复位中断不需要中断返回。 取指中止中断:属于abt模式,当预取指发生错误时,便产生取指中止中断,进入到abt模式。 数据中止中断:属于abt模式,当访问数据存储器
[单片机]
<font color='red'>ARM</font>中的5种异常模式和7种中断源
DSP和FPGA在汽车电子中的广泛应用
  1  引言   20世纪末,全球范围内兴起的信息革命浪潮,为汽车工业的突破性发展提供了千载难逢的机遇,信息技术的广泛应用是解决汽车带来的诸如交通拥挤、交通安全、环境污染、能源枯竭等问题的最佳途径。同时,随着汽车电子技术的发展,电子组件所占整车成本的比例也逐步上升。据统计资料表明,目前,在欧美国家生产的汽车上,电子组件已占到汽车总成本的20%~30%,并且,车用电子组件还以每年8.8%的速度快速增长,特别是数字信号处理器芯片(DSP)的用量更是将以每年25%的速度增长。估计到2005年,汽车电子组件的市场规模,将达到170亿美元。由此可见,电子化、集成化、数字化、信息化、网络化、智能化、小型化和个性化已经成为并且还将继续是汽
[嵌入式]
ARM 常用汇编指令
ARM 汇编程序的框架结构 .section .data 初始化的数据 .section.bss 未初始化的数据 .section .text .global _start _start: 汇编代码 注意: 一般是将上面结构进行简化 .text .global _start _start: 汇编代码 寄存器操作指令: 算术和逻辑指令: MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器 MOV r1 ,#8 (注意:#+数,表示一个十进制数,#+0b数,表示一个二进制数,#+0x数,表示一个十六进制数) MVN :对源操作数取反再赋值给目的寄存器 MOV R1,#8
[单片机]
基于嵌入式SoPC的以太网接口设备
SoC(片上系统)的概念已日益普及,而随着FPGA技术的迅速发展,可编程系统芯片(SoPC)作为一种特殊的嵌入式微处理器系统,融合了SoC和FPGA各自的优点,并具备软硬件在系统可编程、可裁减、可扩充、可升级的功能,已逐渐成为一个新兴的技术方向。SoPC的核心是在FPGA上实现的嵌入式微处理器核,目前主要有Xilinx公司的32位软核MicroBlaze、32位PowerPC系列处理器硬核PowerPC 405,以及Altera公司的Nios系列微处理器软核等。 本文介绍的系统是一个以PowerPC 405为微处理器,基于VME总线的以太网接口设备,它通过以太网和VME总线接口,实现VME系统与外部局域网的实时数据交换。 硬件
[应用]
基于FPGA的FIR抽取滤波器设计
摘 要:本文介绍了FIR抽取滤波器的工作原理,重点阐述了用XC2V1000实现FIR抽取滤波器的方法,并给出了仿真波形和设计特点。 关键词:FIR抽取滤波器;流水线操作;FPGA     用FPGA实现抽取滤波器比较复杂,主要是因为在FPGA中缺乏实现乘法运算的有效结构,现在,FPGA中集成了硬件乘法器,使FPGA在数字信号处理方面有了长足的进步。本文介绍了一种采用Xilinx公司的XC2V1000实现FIR抽取滤波器的设计方法。 具体实现 结构设计     基于抽取滤波器的工作原理,本文采用XC2V1000实现了一个抽取率为2、具有线性相位的3阶FIR抽取滤波器,利用原理图和VHDL共同完成源文件设计。图1是抽取滤波器的
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved