Matlab与FPGA的联合开发方式

MatlabFPGA的联合开发方式
                                  --------全并行结构FFTFPGA实现
目前MatlabFPGA的联合开发主要可分为三种形式:一种是利用Matlab来进行FPGA设计时的前期系统算法仿真,另一种是利用Matlab软件来完成FPGA设计中的辅助仿真功能,最后一种是利用Matlab软件将系统级的FPGA设计模型转换成硬件描述语言。本报告利用一个具体例子介绍第一种应用方法。
1.1 全并行FFT算法介绍
玻璃包装箱
FFT算法是DFT(离散傅里叶变换)算法的简称,它是由CooleyTukey1965年提出的,FFT在数字信号处理中得到了广泛的应用,各大FPGA生产厂家也都提供了相应的运算点数可以改变的FFT核,其运算速度相对于其他由DSP器件实现的FFT要快得多,但是其运算速度仍然满足不了某些特殊应用领域的需求,而且这些FFT商业核的价格不菲,即使购买,源代码也不公开。
DFT算法公式为
                                    (1-1)
其中:输入序列(时域);(为输出序列(频域);为旋转因子。其快速算法FFT结构,如图1所示。为了作图方便,这里以基2时间抽取8点FFT为例加以说明。图中箭头上的数字代表旋转因子中的k。输入是码位倒序的,输出是自然顺序。这种全并行结构的特点使每个蝶形的输出数据不需存储,直接流向下一级,整个算法不会产生数据堆积,如果采用同步时序电路,则可以实现每个时钟节拍输出一组FFT计算结果,从而充分发挥了并行加流水结构的快速处理特点,使得FFT运算速度得到极大提高。
1 2时间抽取全并行FFT算法结构图
1.2算法MATLAB验证
从图1所示的算法流程图中可以看出,经过蝶形运算后的数据位宽要比原来的输入数据扩展一倍,在所有运算都是定点运算的情况下,必须对数据进行截取,否则随着运算级数的增加,位宽扩展成指数增加,最终导致FPGA器件资源枯竭,无法实现设计。但是,数据的截取必然带来运算的误差,随着级数的增加,这种误差也将越来越大,那么,究竟能不能采用这种全并行的设计结构来实现FFT运算呢?下面通过MATLAB的仿真来验证算法的可行性。
在本例中MATLAB编程的主题思想是,迷你FOGA器件中的实际硬件操作来分析误差对性能的影响,并输出FFT编程的主题思想是,模拟FPGA器件中的实际硬件操作来分析误差对性能的影响,并输出FFT运算的中间结果以便为后续的FPGA调试提供参考。基于这种思想,在MATLAB中编制的32点全并行结构FFT算法的主程序ffttheroytest.m如下:
%--------------------------------------------------------------------------------------------------------------- %
%--        时间抽取32点基-2固定缩小比例(2/级)fftmatlab验证程序        --%
%--------------------------------------------------------------------------------------------------------------- %
%--本代码主要用来分析,此种FFT算法中相位误差的来源
clear
clc
PI=3.14159265357
DWIDTH=8;
POINTS=32;
%--下面的程序用于产生仿真所需的输入信号(正弦信号),其时域离散值如下图所示
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
MULT_F=3;
OMIGA=2*PI/(POINTS-1)*MULT_F;
%OMIGA=2*PI/(POINTS)*MULT_F;%区别在于能否将输入信号恰好完整充满32点(/POINT)不能),如上图所示
破真空阀N=[0:1:31]
indata_signal=cos(OMIGA*N);
%indata_signal=sin(OMIGA*N);
CONSTANT=0;
indata=round((indata_signal+CONSTANT)/max(indata_signal+CONSTANT)*2^(DWID…T
H-1));
for i=1:POINTS%--产生仿真波形中的输入数组(要用补码来表示)
    if indata(i)<0
        indata_comp(i)=2^DWIDTH+indata(i);%--取负数的补码
  elseif indata(i)==2^(DWIDTH-1) %--避免对“+1”归一化时的错误
        indata_comp(i)=indata(i)-1;
    else
        indata_comp(i)=indata(i);
        end;
end;
fftout_xil=floor(fftout_mat/(2^log2(POINTS)));%--因为在设计中为了防止每级蝶形运算的数据溢出,所以每级输出数据缩小了2
absout_xil=abs(fftout_xil);%--FFT结果的理论模值
thetaout=angle(fftout_xil);%--FFT结果的理论相位值(弧度表示)。
Thetaout_xil=thetaout*2^(DWIDTH-3);%--XilinxCORDIC核中定义的数据格式
缩放后的数值(波形中的理论数值,便于比较用)
%theaout_du=theaout/PI*180;%--度数表示的FFT相位理论输出结果
[g1out,g2out,g3out,g4out,g5out]=simfft(indata);%--输出FFT脱硝催化剂成分运算每一级的运算结果
主函数主要用来产生仿真所需的输入数据,以及将理论输出数据(无截断)变换成FPGA软件显示的数据格式,以便于进行比较。主函数调用了simmfft函数。
Simmfft函数采用定点数的运算形式,主要是为了模拟FPGA器件内部的操作,该函数还将
FFT每一级的运算结果给了出来,这样可方便与FPGA仿真结果进行比较验证。该函数调用了一个蝶形运算函数butfly.m。该函数采用的也是定点运算,目的是模仿FPGA内部操作。有了这些函数,将它们放在同一目录下,在将MATLAB软件的当前目录(Current Directory)定位到此目录,然后再命令窗口中运行主程序ffttherottest,可得如下所示运行结果。
glout=
2, 124, -19, 37, 9, -107, 18, 50, 19, 25, -2, 126, -13, -99, 13, -91, 13, 91, -12, 100, -2, -126, 18, -24, 17, -49, 10, 108, -19, -37, 2, -124
g2out=
-9, 62-19i, 11, 62+19i, 12, -54-25i, -4, -54+25i, 8, 12-63i, 10, 12+63i, -1, -50+45i, -13, -50-45i, 0, 45-50i, 0, 45-50i, 12, 45+50i, 7, -63+12i, -9, -63-12i, 12, -25-54i, 4, -25+54i, -10, -19+62i, -10, -19-62i
g3out=
0, 2, 5+2i, 59+19i, -10, 60-20i, 5-2i, 3-1i, 3, 4+1i, 5+6i, 7+64i, 5, 8-65i, 5-6i, 5-2i, 3, 3+1i, 6+4i, 40+51i, -3, 41-51i, 6-4i, 4-1i, 1, 2+1i, 2+5i, -29+55i, 11, -28-55i, 2-5i, 3-1i
g4out=
1, 3-1i, 5+1i, 59+18i, -5-3i, -2-2i, -2-1i, -2-2i, -1, -1+1i, -1+1i, -1,-5+3i, 62-18i, 6-1i, 4, 1, 2, 5+3i, 39+48i, -2-6i, 0-3i, 0-1i, 0-2i, 1, 0, 1+1i, 1+2i, -2+6i, 40-49i, 6-3i, 4
g5out=
0, 1-2i, 4, 58+18i, -6-4i, -3-2i, -2-2i, -2-2i, -1-1i, -1, -1-1i, -1-1i, 0, -1-1i, 0-1i, 0, 1, 0, 0, 0, 1, 0, 0, -1+1i, -1, -1+1i, -1+1i, -5+3i, 62-16i, 7-1i, 4+1i
上述运行结果分别代表FFT运算每一级的输出,最后一级的输出也就是整个FFT的运算结果。这些输出结果都是定点运算的结果,所以都是以整数的形式显示的。可以用这些数据与FPGA设计的仿真输出结果进行比较来辅助FPGA设计。
1.3 全并行结构FFTFPGA实现
高速FFT在雷达、通信和电子对抗等领域都有广泛应用,在某些场合要求对采样速率1GHz以上的数据进行实时处理。利用FPGA器件的丰富资源采用全并行加流水先FFT算法,可对速率为2.9GHz的采样数据实现实时(数据不堆积傅里叶变换)。这里采用Xilinx公司最新VirtexII Pro.系列中的xc2vp125-6ff1704器件对设计进行编译、综合、布局布线、也可以采用Altera公司的Stratix器件来完成本设计。Virtex II Pro是一款具有高性能结构体系的FPGA器件,它集成强大的内核性能、大存储带宽、数字信号处理(DSP)功能、高速I/O性能和模块化设计于一体,采用LVDS数据传输模式其最高I/O速率可达840MHz汽车防尘套,内嵌的DSP模块具有很高的乘法运算速度,内部最高时钟可达420MHz。在用VHDL编程时可以用IP CoreGenIP核生成器向导)的方法指定用DSP模块生成乘法器,用这种乘法器来做蝶形,然后用多个蝶形构成FFT运算级,再将多级串联,即可实现FFT核心运算的全并行流水结构。设计的输入采用硬件描述语言和图形输入相结合的方法,在Xlinx公司的软件ISE中完成设计的输入,并对设计进行综合、编译、布局布线等操作,最后用ModelSim软件和MATLAB软件对设计做了联合仿真。通过利用FPGA器件中大量的乘法器、逻辑单元、存储器等硬件资源,采用全并行加流水结构,实现了在一个时钟节拍内完成32防盗手机套FFT的功能,设计最高运算速度可达11ns,可对采样速率为2.9GHz的输入数据进行实时处理。
为了在220v稳压器FPGA设计中充分应用模块化的设计思想,采用自顶向下的设计方法。设计的顶层模块采用图形输入,其结构如图2所示。

本文发布于:2024-09-25 00:30:07,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/278079.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:运算   设计   输入   数据   采用   结果   输出   算法
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议