1.软件版本

Quartusii12.1

2.本算法fpga实现过程

这里,我们的FFT2048模块,其基本结构如下所示:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_运行时间

 仿真效果如下所示:

i_rst

复位信号

1的时候复位,0的时候工作

i_clk

系统时钟

时钟,接频率至少为

i_fft_ifft

FFTIFFT

0的时候为FFT,1的时候为IFFT

i_sel

测试选择

0的时候为内部测试,1的时候外部输入测试

i_Imag

外部测试虚部

AD输入1

i_Real

外部测试实部

AD输入2

o_Real_datain

测试输出1

输入信号的输出

o_Imag_datain

测试输出2

输入信号的输出

i_Enable

使能

即高电平的时候工作

o_Enable

输出使能

FFT工作完毕输出数据的时候为1

i_frame_start

帧头指示

在帧头前一时刻输入高电平

o_fft_imag

虚部

输出虚部

o_fft_real

实部

输出实部

i_high

1

一直设置为1即可

o_fft_ena

输出使能

当FFT开始输出结论时,为1,否则为0

o_fft_sop

输出帧头指示


o_fft_eop

输出帧尾指示


o_times

统计运行时间


O_boxes


实部和虚部的abs模计算

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_fpga开发_02

前面的几个控制信号,上面介绍过了,下面说明一下如何看这个波形图

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_傅里叶变换_03

当sel选择0的时候,则启用内部的测试信号进行FFT的测试,在实际工作的时候,接的是sel=1,即外部输入信号进行测试。

ireal和iimag就是外部输入信号,因为在仿真阶段,我们使用内部测试结果,所以为0。

最后两个是输出我们使用的测试信号。如果sel=1,则输出外面进来的两路信号,如果sel=0,则输出内部测试的两路信号,这里内部测试的两路信号为cos和sin信号。

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_数据_04

Oenable是状态指示信号,0的时候说明FFT正在工作,1的时候计算完毕输出最后的FFT结论

eop和sop分别表示的是最后FFT输出的帧信号的对应的帧尾和帧头

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_傅里叶变换_05

oboxes表示的实部和虚部的平方和,用来看最后的FFT的幅度,也就是matlab中的对FFT最后计算abs模的效果

times是计算运行的时间,具体仿真时间为timesx时钟频率,本课题,我们的计算时间为:+

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_fpga开发_06

13380个时钟周期,

那么如果时钟频率为10M

那么延迟为,13380*1/10M = 0.0013s >1ms。

所以,我们在实际使用的时候,只要时钟频率大于10M就可以满足1ms延迟的需求。

下载板子后使用signalTapII观察效果如下所示:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_傅里叶变换_07

在本系统,FFT采用IP核实现

IP核的设置比较简单,具体如下所示:

设置一:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_数据_08

设置二:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_fpga开发_09

上面的产生仿真文件,可以调用内部的模块进行仿真。

最后完成设置:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_运行时间_10

       其实是用IP核掌握好几个接口的信号的输入定义,就基本可以快速使用了,下面介绍一个FFT核各个管脚的使用.

       下面重点介绍一下IP核设置后的FFT核的各个接口的含义:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_傅里叶变换_11

 关于IP核的详细介绍就不做说明了,比较简单。IP核仿真如下所示:

【FPGA+FFT】基于FPGA的FFT频率计设计与实现_数据_12

3.部分源码

module fft_tops(
i_clk,
i_rst,
i_sop,
i_eop,
i_datar,
i_datai,
o_datar,
o_datai
);

input i_clk;
input i_rst;
input i_sop;
input i_eop;
input [17:0]i_datar;
input [17:0]i_datai;
output[17:0]o_datar;
output[17:0]o_datai;

fft_ip fft_ip_u(
.clk (i_clk),
.reset_n (i_rst),
.inverse (1'b0),
.sink_valid (1'b1),
.sink_sop (i_sop),
.sink_eop (i_eop),
.sink_real (i_datar),
.sink_imag (i_datai),
.sink_error (2'b00),
.source_ready (1'b1),
.sink_ready (),
.source_error (),
.source_sop (),
.source_eop (),
.source_valid (),
.source_exp (),
.source_real (o_datar),
.source_imag (o_datai)
);

endmodule
A28-15