一般情况下大家看到的都是分别的altera和xilinx的fft ip core的是使用方法,少有对比的文档,因此我写个blog做一下记录。
一、altera
引用:
1、时序图
一个时钟,一个复位,一个FFT/IFFT控制线,一个sink,一个source
时钟就是FFT ip核运算的时钟,reset_n是FFT ip核复位信号,低电平有效,复位的时候sink_ready信号一直为低(无效),inverser设置FFT变换还是IFFT变换,低电平表示FFT,高电平表示IFFT。
fftpts_in: 用来可配置fft规模的
sink信号:
sink_valid:输入数据有效信号,在输入数据期间要保持有效
sink_sop:输入数据起始信号,与第一个数据对齐,只需保持一个时钟周期即可
sink_eop:输入数据结束信号,与最后一个数据对齐,只需保持一个时钟周期
sink_ready:输出准备好信号,此信号为高表示可输入变换数据,否则不要输入变换数据
sink_error:输入错误信号,置0即可
sink_real:输入的实部信号
sink_imag:输入的虚部信号
Source信号:
source_valid:输出有效信号,FFT变换完成后,此信号置高,开始输出数据
source_ready:输入数据准备好信号,置1即可
source_error:输出错误信号,若输入的数据格式有误,则不进行FFT变换,并给出错误值,根据错误值可查看手册,确定是输入数据怎么错了。
source_sop:输出数据起始信号,与输出的第一个数据对齐
source_eop:输出数据的终止信号,与输出的最后一个数据对齐
source_real:输出数据的实部
source_imag:输出数据的虚部
source_exp:数据数据的缩放因子
FFT IP核的输入数据和输出数据,缩放因子都是有符号数
实际运算的结果是实部和虚部与缩放因子的结合,若缩放因子为负,实部和虚部要左移相应的位数,若为正则右移,例如:缩放因子宽度为6,二进制值为101011,该值为有符号数,表示-21,则实部和虚部需要左移21位才是最终结果。
若是FFT逆变换,只需要把inverser置1即可
作为对比的是xilinx 7.1 的IP核(之所以选择这么古老的,是因为这个与原来openofdm相同)
// .clk(clock),
// .fwd_inv(1), //=1正向fft, =0逆向fft
// .start(fft_start_delayed),
// .fwd_inv_we(1),
//
// .xn_re(fft_in_re),
// .xn_im(fft_in_im),
// .xk_re(fft_out_re),
// .xk_im(fft_out_im),
// .rfd(fft_ready),
// .done(fft_done),
// .busy(fft_busy),
// .dv(fft_valid)