说明:通过对比Matlab的实践,利用Xilinx FFT IP核实现多个FFT。
代码下载:实现Xilinx FFT IP核心Verilog代码
工程下载: FFT工程
200页FPGA/IC秋季招聘面试试题
文章目录一、快速傅里叶变换IP核心介绍二、FFT IP核心使用1、1KHz采样率、1024分FFT2、2.5GHz采样率、8192分FFT
一.快速傅里叶变换IP核介绍
主要包括配置接口、时域数据输入接口、时钟复位接口、频域数据输出接口、状态接口。
IP核心关键端口介绍:
名称说明aclk输入模块的工作时钟、上升沿有效aclken输入时钟使能信号、高电平有效、低电平时内核停止工作,该信号降低内核工作的最大时钟频率aresetn,实现低电平同步复位信号s_axis_config_tvalid输入配置通道的tvalid,表示外部主机可以断言以提供数据s_axis_config_tready输出配置通道的就绪性内核断言s_axis_config_tdata输入配置信道上的tdata,指示它准备接收数据,并声明配置信息、NFFT、FWD/INV、CP_LEN、 和SCALE_SCH输入数据:由携带s_axis_data_tvata_的外部主机断言,以提供数据s_axis_data_tready输出输入数据信道tready 指示内核断言可以接收数据s_axis_data_tdata输入数据通道tdara,并由外部主机提供待处理的数据s_axis_data_tdata
只有生成了事件event_tlast_unexpected和event_tlast_missing时,内核才使用它输出数据。 m_axis_data_tvalid输出输出数据通道tvalid表示内核可以提供数据m_axis_data_tvalid的外部群集机可以提供数据m_axis_data_tvalid 内核提供FFT之后的数据m_axis_data_tuser输出数据通道tuser,内核提供XK_INDEX、OVFLO、blk_tuser
根据您的配置,例如1024点,每个点为32位,高16位为虚部,低16位为实部。
http://www.Sina.com/http://www.Sina.com /
根据您的配置,例如1024点,每个点为32位,高16位为虚部,低16位为实部。
IP核心配置
)频道数,1~12。
)转换点数,8~65536。
)工作时钟频率,1~1000。
:数据的比特率。
)根据时钟频率和比特率自动选择。
)允许流水线IO、连续数据处理。 只有在使用单通道时才能选择流水线IO。
)采用磁盘4、突发IO、迭代方法加载和处理数据。 资源消耗比流水线体系结构少,但转换时间长
有点不同。 蝴蝶4帧的转换点数为64 ~ 65536,其他帧数为8 ~ 65536。
)使用与磁盘2、突发IO、Radix-4相同的迭代方法,但蝶形运算单元更小。
与Radix-4体系结构相比,资源消耗更少,但转换时间更长。
)基于磁盘2 -Lite、突发IO和Radix-2体系结构。 该变体采用时分复用方式实现蝶形运算单元,
实现更少的资源消耗,但转换时间变长。
)运行中可以配置转换点数。
四种FFT体系结构的资源消耗和吞吐量之间的关系:
:数据格式、定点、浮点。
)缩放选项,
)数据省入模式。
:输入数据宽度。
)相位因子幅度。
:输出名次。
) :输出序列号。
)数据溢出标志。
:数据。
)相位因子。
)排序缓冲区。
)复数乘法器。
)蝶形运算单元。
二、FFT IP核的使用以1、1KHz采样率、1024点的FFT矩阵产生原信号s,将1024点的数据写入FPGA的ROM
采样率为1000Hz,信号为100Hz、200Hz、300Hz重叠,FFT点数为1024。
清除全部; row=3; column=1; N=1024; fs=1000; %采样间隔为1/1000t=(1:1024 )/fs; %时间轴f0=100
; %载频频率f1=200; %载频频率f2=300; %载频频率y1=100*exp(1i*2*pi*f0*t); y2=100*exp(1i*2*pi*f1*t);y3=100*exp(1i*2*pi*f2*t);y=y1+y2+y3; %信号产生real_y = int32(real(y)); %实部imag_y = int32(imag(y)); %虚部a=[real_y;imag_y];s = int32(bitshift(imag_y,16)+real_y);%将实部和虚部拼接为32bit(实部16bit+虚部16bit)s = s'; %此数据输出到FPGA%绘制原信号subplot(row,column,1);plot(t,y);title("时域");xlabel('t');ylabel('y');grid on;%FFTf=(0:N-1)*(fs/N);fft_y=fft(y,N); %FFTabs_fft_y=abs(fft(y,N)); %FFT取绝对值subplot(row,column,2); %FFT波形plot(f,fft_y);title("FFT");xlabel('t');ylabel('y');grid on;subplot(row,column,3); %FFT取绝对值波形plot(f,abs_fft_y);title("FFT取绝对值");xlabel('t');ylabel('y');grid on;数据通过coe文件写入ROM:
FPGA端IP核的配置:
将时域数据写入ROM,通过FFT IP核后得到以下结果:
结果展现:
FPGA FFT波形,第三通道是时域数据,第五通道是FFT,第六通道是FFT取绝对值的波形。
采样率为1000Hz,1024个点。
观察下图中f变量(可以表示频率的横轴),三个峰值对应的频率为100Hz,200Hz,300Hz。
Verilog代码:
Xilinx FFT IP核 Verilog代码实现
Matlab产生原实信号 s,将8192点的数据写入FPGA的ROM
采样率为2.5GHz,信号为100Hz、350Hz、500Hz叠加,FFT点数为1024。
clcclear all;close all;row=3;column=1;N=8192;fs=2.5e9; %采样间隔为1/1000t=(1:N)/fs; %时间轴f0=100e6; %载频频率f1=350e6; %载频频率f2=500e6; %载频频率y1=20*exp(1i*2*pi*f0*t); y2=20*exp(1i*2*pi*f1*t);y3=20*exp(1i*2*pi*f2*t);y=y1+y2+y3; %信号产生real_y = int32(real(y)); %实部imag_y = int32(imag(y)); %虚部a=[real_y;imag_y];s = int32(bitshift(imag_y,16)+real_y);%将实部和虚部拼接为32bit(实部16bit+虚部16bit)s = s'; %此数据输出到FPGA%绘制原信号subplot(row,column,1);plot(t,y);title("时域");xlabel('t');ylabel('y');grid on;%FFTf=(0:N-1)*(fs/N);fft_y=fft(y,N); %FFTabs_fft_y=abs(fft(y,N)); %FFT取绝对值subplot(row,column,2); %FFT波形plot(f,fft_y);title("FFT");xlabel('t');ylabel('y');grid on;subplot(row,column,3); %FFT取绝对值波形plot(f,abs_fft_y);title("FFT取绝对值");xlabel('t');ylabel('y');grid on;
将时域数据写入ROM,通过FFT IP核后得到以下结果:
结果展示:第四通道是时域数据,第六通道是FFT取绝对值的波形。
观察图中f变量(可以表示频率的横轴),三个峰值对应的频率为100Hz,350Hz,500Hz。
Verilog代码:
Xilinx FFT IP核 Verilog代码实现