基于Nios的FFT算法软硬件协同设计-设计应用_第1页
基于Nios的FFT算法软硬件协同设计-设计应用_第2页
基于Nios的FFT算法软硬件协同设计-设计应用_第3页
基于Nios的FFT算法软硬件协同设计-设计应用_第4页
基于Nios的FFT算法软硬件协同设计-设计应用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑基于Nios的FFT算法软硬件协同设计-设计应用摘要:在深入研究Nios自定制指令的软硬件接口的基础上,利用Matlab/DSPBuilder建立快速傅里叶变换FFT运算指令基本模型,然后用Altera公司提供的Singacompiler工具对其进行编译,产生QuartusⅡ能够识别的VHDL源程序,并将此程序在Nios中自定制成相关的FFT运算指令。利用自定制的FFT运算指令,在Nios中利用C语言编写基于Nios的FFT算法程序,实现了FFT运算的软硬件协同设计。经测试表明,将FFT算法加入到Nios嵌入式处理器指令集中,可以帮助系统完成复杂的数据处理任务,增强Nios系统的实时处理能力。该设计方法打破了软硬件间的屏障,大大加快了系统的功能验证。

在自动控制领域,往往要对被控对象进行状态检测,从而作出下一步的处理,达到控制的目的,因此自动控制系统离不开对被控系统的状态进行监测,以便对其进行处理,例如滚动轴承故障、电动机故障等均可以利用频谱分析法对其进行状态监测和故障诊断。要检测被控对象的状态,就离不开数字信号处理,因此,数字信号处理应用广泛。并且FFT(快速傅里叶变换)促进了数字信号处理的发展,它可应用傅里叶变换理论所能涉及的任何领域。对于FFT工程的实现方法有软件法和硬件法,即通过软件程序完成FFT运算,这种方法可适用于各种数字信号处理的应用场合,很灵活,但缺点是不能进行实时处理。而使用专用硬件完成数字信号处理的方法能够实现实时处理,但外围电路相对复杂,不易扩展,灵活性差,且价格昂贵。因此人们一方面寻求结构简单、运算速度快,存储量小的FFI实现方法,另一方面采用先进的VLSI技术改进实现FFT的硬件结构,将算法硬件化。

Nios嵌入式处理器是FPGA生产厂商Althera推出的软核CPU,它是一种面向用户的、可灵活定制的通用RISC嵌入式CPU。用户可以在Nios指令系统中增加用户自定义指令,以增强对强实时软件算法的处理能力,可以把一个复杂的标准指令序列简化为一条用硬件实现的单个指令。特别是在需要使用大量FFT算法的场合,可以根据用户的需要,定制专门的FFT处理器硬件和定制一些诸如复数乘法或复数加法等传统运算指令,使Nios系统不但具有常规数字信号处理器功能,而且具有软件实现FFT运算处理的特点。

1FFT算法原理

1.1按时间抽取的基-2FFT算法

设序列x(n)长度为N,且满足N=2M,M为正整数。按n的奇偶把x(n)分解为2个N/2点的子序列:

则可将DFT化为:

式中,X1(k)与X2(k)分别是x1(r)及x2(r)的N/2点DFT。

由此可以看到,一个N点DFT已分解成2个N/2点的DFT。这2个N/2点的DFT再按照式(4)组合成1个N点DFT。这里应该看到X1(k),X2(k)只有N/2个点,即k=O,1,…,(N/2)-1。而X(k)却有N个点,即k=0,1,…,N-1,故用式(4)计算得到的只是X(k)的前一半的结果,要用X1(k),X2(k)来表达全部的X(k)值,还必须应用系数的周期性,这样可得到:

说明后半部分k值(N/2≤k≤N-1)所对应的X1(k),X2(k)分别等于前半部分k值(O≤k≤(N/2)-1)所对应的X1(k),X2(k)。这样,就可将X(k)表达为前后两部分:

其运算关系可以利用蝶形运算流程图来形象地描述,图l为按时间抽取法的蝶形运算流程图符号。

图1时间抽取法的蝶形运算流程图

1.2按频率抽取的基-2FFT算法

仍设序列点数为N=2M,M为正整数。在把输出X(k)按k的奇偶分组之前,先把输入序列按前、后各一半(不是按偶奇)分开,把N点DFT写成2部分,则可将DFT化为:

图2为按频率抽取法的蝶形运算流程图符号,这样,就把1个N点DFT按k的奇偶分解为2个N/2点的DFT了。

图2频率抽取法的蝶形运算流程图

由以上分析可知,FFT算法中的是蝶形运算单元。而一个蝶形运算单元主要由复数乘法,两次复数加法构成。为此整个FFT算法中,复数乘法和复数加法是为的运算单元。

2FFT算法软硬件协同设计

软硬件协同设计指对系统中的软硬件部分使用统一的描述和工具进行集成开发,完成全系统的设计验证并跨越软硬件界面进行系统优化。其基本的设计流程是先用VHDL语言和C语言进行系统描述并进行模拟仿真和系统功能验证;然后对软硬件实现进行功能划分,分别用语言进行设计并将其综合起来进行功能验证和性能预测等仿真确认(协调模拟仿真);其次进行软件和硬件详细设计;进行系统测试。

根据上面的分析可知,FFT算法中的是蝶形运算单元,而复数乘法和复数加法又是蝶形运算单元的,因此可以采取Nios的自定义指令功能,定制一条复数乘法指令和一条复数加法指令,以便完成蝶形运算。

2.1建立NiosⅡ嵌入式处理器系统

首先,利用QuartusⅡ建立项目工程,选用的目标器件为CycloneⅡEP2C5Q:再用SOPCBuider创建NiosⅡ组件模型,生成硬件描述文件,锁定引脚后进行综合与适配,生成NiosⅡ硬件系统文件;然后建立NiosⅡ嵌入式系统,从SOPCBuilder组件栏中加入所需的组件(如NiosⅡCPU核、定时器Timer、JTAG_UART、Avalon三态总线桥、键输入I/O口和Flash等)。另外,为了实现NiosⅡ处理器对EPCSFlash存储器的读写访问,还要加入EPCSSerialFlashController组件。通过此控制器将用于FPGA配置的SOF文件和CPU运行的软件一并存于EPCS器件中,以便大大简化硬件系统组成结构。为了保证所有组件的地址安排是合法的,要对各组件地址实行自动分配;进行全程编译(即分析、综合、适配和输出文件装配),完成NiosⅡ硬件系统的设计。

2.2利用DSPBuilder生成复数乘法模块

使用DSPBuilder在FPGA上进行DSP模块的设计,可实现高速DSP处理。但是,在实际应用中,除了要求DSP高速外,由于DSP处理的算法往往比较复杂,如果单纯使用DSPBuilder来实现纯硬件的DSP模块,会耗费过多的硬件资源,因此有时也无法完成许多算法复杂的模型。而NiosⅡ则是一个建立在FPGA上的嵌入式微处理器软核,它有一个重要的特性是具有自定制指令。在DSP算法中会反复出现一些运算(如复数乘法器、整数乘法器、浮点乘法器等),而在通用的CPU中都没有专门用于复数乘法计算和浮点乘法计算的相关指令。在系统设计中,利用MA-TLAB、DSPBuilder或者VHDL设计并生成复数乘法器、整数乘法器、浮点乘法器等硬件模块。在QuartusⅡ环境中对上述文件做一些修正后,在SOPCBuilder窗口中将它们定制为相应的指令,并可设定或修改执行该指令的时钟周期。在进行DSP算法运算时,可通过汇编或C语言,甚至C++语言来运用这些自定义指令进行嵌入式程序设计。

根据复数运算,设2个复数为a+bj和c+dj,则乘法表述为:

在MATLAB/Simulink下建立如图3所示的复数乘法模型,图中的Dataal、Databl和Resultl是DSPBuilder中SOPCLibrary中CustomIns-truction中的模块,分别对应Nios内部ALU的2个输入信号dataa和datab,以及ALU的输出信号result。Datareal、DataImag、DatbReal、Da-thlmag是一个总线位转换模块;BusConeatenation是总线复合模块。DataatoComplex和DatabtoComplex是一个实数转复数的模块,Com-plexProduct是复数乘法模块,RealResult是复数解出实部和虚部的模块。

图3复数乘法模型

该模型完成了1个16位的复数乘法。在这个设计中,利用Nios32的32位数据位宽,把32位分成2部分,分别放入复数的实部和虚部,实部、虚部的位宽都是16位,正好构成1个32位数,两个16位复数进行运算后,把结果设为16位复数,也用32位表示。设此模型的文件名为co-mplex.mdl。并点击Signalcompiler,对complex.mdl进行转换,在转换窗口中分别作如下选择:器件选择CycloneⅡ;综合器选择Quart-usⅡ;“SOPCInfo”的generateSOPCBuilderPTFFile项要选择打勾。分别单击转换按钮1-Convert和综合按钮2-Synthesis即可将其转换成标准的VHDL语言。

2.3在Nios中加入复数乘法指令

在已建立的SOPC设计中,双击CPU项,点击“Import”按纽,点击“ADD"按纽,打开Complex_ei.vhd,再点击“Readport-listfromfiles"按纽,点击“ADDtoSystem”按纽,加入该设计作为指令执行模块。再将整个项目重新编译,锁定引脚后,再到目标器件中。为此即在Nios指令中定制了一条名为COMP的复数乘法指令,在进行C语言编程时,其调用格式为z=nm_comp(x,y),其中x和y为两个复数,其运算结果放在z中。用同样的方法,可以建立复数加法指令和复数减法指令。由此可见,利用DSPBuilder很容易地实现了FFT算法中的复数运算指令的定制。同时在定制指令时,对于浮点数的处理,采用统一为几位二进制有效数字的办法来解决的,比如说:小数位数固定为4位,整数位数固定为6位,那么可以定义一个向量signalnum:std_logic_vector(9downto0);在做运算的时候,注意高6位是整数、低4位是小数,就可以达到实型数据的处理。

2.4FFT算法软件设计

在NiosⅡ硬件系统设计完成后,将配置文件到指定的FPGA中,通过SOPCBuilder软件窗口,可进入NiosⅡIDE软件开发环境进行软件设计。

通过SOPCBuider软件窗口,启动NiosⅡIDE,然后新建工程,在新建工程的过程中,选择刚才产生的CPU,新工程产生后,在工程添加文件,在文件中写入程序代码。在软件编程时设计者可以使用多种方式使用自定制指令,为了简化软件开发者使用自定义指令的编程,在生成的SDK中的.h文件中已经包含了自定义指令的宏定义,可以直接用在C中。下面以基2,8点FFT为例加以说明。在定制了两条复数运算指令后,可以使用C语言编程实现FFT算法。由于有基本的复数运算指令和复数加法指令,为此采用C语言编写程序,其算法变得相当简单,FFT算法如下:

2.5系统测试

采用Altera公司的CycloneⅡ系列芯片EP2C5Q208C8。用Altera提供的NiosSDK,将编译后的可执行代码,通过计算机串口到FPGA上的Nios系统内存中去并运行,将输出结果与Matlab仿真结果进行了比较。比较结果如表1所示,其中参考值是用MATLAB按FFT计算得到的结果,测试值是在Nios中利用C语言编写的FFT程序计算的结果,表中某些数据误差较大,是因为本系统采用定点数据精度不够,只要增加定点数据的位数就可提高运算的精度。

3结束语

Nios是一个性价比较高的微处理器,它是以软核的方式提供给用户,并专为在Altera的FPGA上实现作了优化,用于SOPC(片上可编程系统)集成,在FPGA上实现,通过它可以创建NiosCPU设计项目,从而为设计人员提供SOPC设计必需的软硬件设计平台。在定制的NiosCPU设计项目中利用Nios的用户自定义指令功能,可以达到FFT运算的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论