FPGA+FFT基于FPGA的FFT频率计设计与实现

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPGA+FFT基于FPGA的FFT频率计设计与实现相关的知识,希望对你有一定的参考价值。

1.软件版本

Quartusii12.1

2.本算法fpga实现过程

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

 仿真效果如下所示:

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模计算

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

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

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

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

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

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

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

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

13380个时钟周期,

那么如果时钟频率为10M

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

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

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

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

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

设置一:

设置二:

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

最后完成设置:

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

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

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

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

以上是关于FPGA+FFT基于FPGA的FFT频率计设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

FPGA教程案例37通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换

FFT处理器的FPGA优化实现

基于FPGA的64点fft变换verilog开发

FPGA教程案例36通信案例6——基于vivado核的FFT傅里叶变换开发以及verilog输入时序配置详解,通过matlab进行辅助验证

fpga的优点与缺点

Simulink HDL Coder FPGA初级开发实践FFT以及CORDIC算法进行信号相位校正