基于Nios的FFT算法软硬件协同设计
图2为按频率抽取法的蝶形运算流程图符号,这样,就把1个N点DFT按k的奇偶分解为2个N/2点的DFT了。本文引用地址:https://www.eepw.com.cn/article/191448.htm
由以上分析可知,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是复数解出实部和虚部的模块。
该模型完成了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位是小数,就可以达到实型数据的处理。
评论