基于Nios的FFT算法软硬件协同设计

时间:2010-12-07

     摘要:在深入研究Nios自定制指令的软硬件接口的基础上,利用Matlab/DSP Builder建立快速傅里叶变换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运算处理的特点。

  1 FFT算法原理

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

  设序列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算法中,复数乘法和复数加法是为的运算单元。

  2 FFT算法软硬件协同设计

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

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

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

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

  2.2 利用DSP Builder生成复数乘法模块

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

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


  在MATLAB/Simulink下建立如图3所示的复数乘法模型,图中的Dataal、Databl和Resultl是DSP Builder中SOPCLibrary中Custom Ins-truction中的模块,分别对应Nios内部ALU的2个输入信号dataa和datab,以及ALU的输出信号result。 Datareal、DataImag、DatbReal、Da-thlmag是一个总线位转换模块;BusConeatenation是总线复合模块。 Dataa toComplex和Datab to Complex是一个实数转复数的模块,Com-plex Product是复数乘法模块,Real Result是复数解出实部和虚部的模块。


图3  复数乘法模型

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

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

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

  2.4 FFT算法软件设计

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

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


  2.5 系统测试

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


  3 结束语

  Nios是一个性价比较高的微处理器,它是以软核的方式提供给用户,并专为在Altera的FPGA上实现作了优化,用于SOPC(片上可编程系统)集 成,在FPGA上实现,通过它可以创建Nios CPU设计项目,从而为设计人员提供SOPC设计必需的软硬件设计平台。在定制的NiosCPU设计项目中利用Nios的用户自定义指令功能,可以达到 FFT运算的软硬件协同设计,实现了快速FFT的变换。由于软件直接控制硬件,所以编译过后的软件调试工作,基本上都是软硬件协同完成的。因此速度快,占 用资源少,容易扩展。


  

参考文献:

[1]. RISC datasheet https://www.dzsc.com/datasheet/RISC_1189725.html.
[2]. N-1 datasheet https://www.dzsc.com/datasheet/N-1_1997158.html.
[3]. ALU datasheet https://www.dzsc.com/datasheet/ALU_2089372.html.
[4]. mdl datasheet https://www.dzsc.com/datasheet/mdl_1721936.html.


上一篇:基于FPGA的三线制同步串行通信控制器设计
下一篇:面向USB3.0的新型ESD防护设计

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料