Xilinx FFT IP使用总结

  • 一、概述
  • 二、FFT IP 配置过程
    • 1、步骤一:配置FFT 点数及工作模式
    • 2、步骤二:配置数据格式、输出数据顺序、循环前缀等信息
    • 3、步骤三:配置内部资源优化选项
    • 4、步骤四:查看生成了FFT信息,重点注意生成参数的格式
  • 三、FFT IP的test bench
  • 四、FFT结果及时序分析
    • 1、整体时序波形
    • 2、FFT输入数据时序波形
    • 3、FFT输出结果时序波形
    • 4、FFT输出结果分析
      • 1)FPGA计算结果
      • 2)matlab计算结果
      • 3)结果比对
  • 五、基2突发、基4突发、pipeline三种模式资源占用及性能分析
  • 六、注意事项

一、概述

FFT快速傅里叶变换是我们在数字信号处理中经常会用到的DSP算法,本文将Xilinx FFT IP核的使用方法及注意事项总结如下 ,主要是产生一个周期256点的正弦信号,然后通过FFT的IP核做256点的FFT处理,最后通过仿真分析对比查看FFT输出结果与matlab结果差异。

二、FFT IP 配置过程

下面将通过vivado配置FFT IP核的过程说明如下。

1、步骤一:配置FFT 点数及工作模式

2、步骤二:配置数据格式、输出数据顺序、循环前缀等信息

3、步骤三:配置内部资源优化选项

4、步骤四:查看生成了FFT信息,重点注意生成参数的格式

三、FFT IP的test bench

下面是FFT IP的测试代码,具体见代码注释。

`timescale 1ns / 1nsmodule tb_fft;//基2的参数配置
//parameter FWD=1'b1;//选择是FFT还是IFFT
//parameter SCALE=16'b01_01_01_01_01_00_01_10;
//parameter PAD=7'b000_0000;//基4的参数配置
parameter FWD=1'b1;//选择是FFT还是IFFT
parameter SCALE=8'b01_10_11_10;//每级右移位数
parameter PAD=7'b000_0000;//基4+CP的参数配置
//parameter FWD=1'b1;//选择是FFT还是IFFT
//parameter SCALE=8'b01_10_11_10;
//parameter PAD=7'b000_0000;
//parameter CP_LEN=8'b0000_1000;reg sclk;
reg rst_n;reg  [7:0] addra;
reg  [8:0] addra_cnt;
wire [7:0] sin_out;
wire [15:0] fft_in;//基2的寄存器长度
//wire [23:0]  s_axis_config_tdata;
//基4的寄存器长度
wire [15:0]  s_axis_config_tdata;
//基4+CP的寄存器长度
//wire [23:0]  s_axis_config_tdata;
//wire s_axis_config_tready;wire s_axis_data_tready;
reg[15:0] s_axis_data_tdata;
reg s_axis_data_tvalid;
wire[15:0] m_axis_data_tdata;
wire[15:0] m_axis_data_tuser;
wire m_axis_data_tvalid;
wire m_axis_data_tlast;wire[7:0] out_re;
wire[7:0] out_im;wire m_axis_status_tdata;
wire m_axis_status_tvalid;
wire event_frame_started;
wire event_tlast_unexpected;
wire event_tlast_missing;
wire event_fft_overflow;
wire event_status_channel_halt;
wire event_data_in_channel_halt;
wire event_data_out_channel_halt;initial
begin
#0 sclk=0;rst_n=0;
#90 rst_n=1;
end
always #10 sclk=~sclk;//产生从RAM中读取256点正弦信号地址
always@(posedge sclk or negedge rst_n)
beginif(rst_n==1'b0)addra<=8'd0;else if(addra==8'd255)//只产生256个数据地址,然后一直保持addra<=addra;elseaddra<=addra+1'b1;
end
//单口RAM的IP核
blk_mem_gen_0 blk_mem_gen_0_inst (.clka(sclk),    // input wire clka.ena(1'b1),      // input wire ena.wea(1'b0),      // input wire [0 : 0] wea.addra(addra),  // input wire [7 : 0] addra.dina('d0),    // input wire [7 : 0] dina.douta(sin_out)  // output wire [7 : 0] douta
);
//输入的正弦信号为实信号放在实部,虚部全部补零
assign fft_in={8'd0,sin_out};//用于产生256个数据的s_axis_data_tvalid信号
always@(posedge sclk or negedge rst_n)
beginif(rst_n==1'b0)addra_cnt<=9'd0;else if(addra_cnt==9'd256)addra_cnt<=addra_cnt;elseaddra_cnt<=addra_cnt+1'b1;
end//输入FFT数据与valid信号同步
always@(posedge sclk or negedge rst_n)
beginif(rst_n==1'b0)begins_axis_data_tvalid<=1'b0;s_axis_data_tdata<=16'd0;endelse if(addra_cnt==9'd256)begins_axis_data_tvalid<=1'b0;s_axis_data_tdata<=16'd0;endelsebegins_axis_data_tvalid<=1'b1;s_axis_data_tdata<=fft_in;end
end//将FFT输入数据的valid信号进行延时
reg [9:0] delay;
always@(posedge sclk or negedge rst_n)
beginif(rst_n==1'b0)delay<=10'd0;elsedelay[9:0]<={delay[8:0],s_axis_data_tvalid};
end//配置FFT参数
//基4的参数配置
assign s_axis_config_tdata={PAD,SCALE,FWD};
//基4+CP的寄存器长度
//assign s_axis_config_tdata={PAD,SCALE,FWD,CP_LEN}; xfft_0 xfft_0_inst (.aclk(sclk),                                                // input wire aclk.aclken(1'b1),                                            // input wire aclken.aresetn(rst_n),                                          // input wire aresetn.s_axis_config_tdata(s_axis_config_tdata),                  // input wire [23 : 0] s_axis_config_tdata.s_axis_config_tvalid(1'b1),                // input wire s_axis_config_tvalid.s_axis_config_tready(s_axis_config_tready),                // output wire s_axis_config_tready.s_axis_data_tdata(s_axis_data_tdata),                      // input wire [15 : 0] s_axis_data_tdata.s_axis_data_tvalid(delay[0]),                    // input wire s_axis_data_tvalid.s_axis_data_tready(s_axis_data_tready),                    // output wire s_axis_data_tready.s_axis_data_tlast(1'b0),                      // input wire s_axis_data_tlast.m_axis_data_tdata(m_axis_data_tdata),                      // output wire [15 : 0] m_axis_data_tdata.m_axis_data_tuser(m_axis_data_tuser),                      // output wire [15 : 0] m_axis_data_tuser.m_axis_data_tvalid(m_axis_data_tvalid),                    // output wire m_axis_data_tvalid.m_axis_data_tready(1'b1),                    // input wire m_axis_data_tready.m_axis_data_tlast(m_axis_data_tlast),                      // output wire m_axis_data_tlast.m_axis_status_tdata(m_axis_status_tdata),                  // output wire [7 : 0] m_axis_status_tdata.m_axis_status_tvalid(m_axis_status_tvalid),                // output wire m_axis_status_tvalid.m_axis_status_tready(1'b1),                // input wire m_axis_status_tready.event_frame_started(event_frame_started),                  // output wire event_frame_started.event_tlast_unexpected(event_tlast_unexpected),            // output wire event_tlast_unexpected.event_tlast_missing(event_tlast_missing),                  // output wire event_tlast_missing.event_fft_overflow(event_fft_overflow),                    // output wire event_fft_overflow.event_status_channel_halt(event_status_channel_halt),      // output wire event_status_channel_halt.event_data_in_channel_halt(event_data_in_channel_halt),    // output wire event_data_in_channel_halt.event_data_out_channel_halt(event_data_out_channel_halt)  // output wire event_data_out_channel_halt
);
//查看FFT输出结果的实虚部
assign out_re=m_axis_data_tdata[7:0];
assign out_im=m_axis_data_tdata[15:8];endmodule

四、FFT结果及时序分析

1、整体时序波形

2、FFT输入数据时序波形

FFT输入数据起始时序波形如下,将输入数据同步信号s_axis_data_tvalid延迟了1拍,是因为输入FFT参数配置信号s_axis_config_tready还没有拉高,即FFT参数还没有配置后,FFT输入数据已经进来,会导致输入数据点数少于FFT点数,出现event_data_in_channel_halt拉高报错。

3、FFT输出结果时序波形

从时序图中看出,FFT的输出数据与输出数据同步信号m_axis_data_tvalid和最后数据指示信号m_axis_data_tlast是完全同步的。

4、FFT输出结果分析

1)FPGA计算结果

便于比对FPGA与matalb结果,将输出结果配置为小数, 如下图。

第256个点FFT输出结果虚部为0.5

2)matlab计算结果

matlab代码如下:

clc;
close all;
clear all;
n=[0:255];
N=256;
sig=round(sin(2*pi*n/N)*127);
%sig=round(sin(2*pi*n/N)*32767);
sig_freq_re=real(fft(sin(2*pi*n/N),256));
sig_freq_im=imag(fft(sin(2*pi*n/N),256));
%figure(1),plot(abs(sig_freq));for i=1:256if(sig(i)<0)sig(i)=256+sig(i);%对于负数要转换为补码形式%sig(i)=65536+sig(i);%对于负数要转换为补码形式elsesig(i)=sig(i);end
end
fid=fopen('ram_init_data.coe','w+')
fprintf(fid,'memory_initialization_radix = 10; \n')
fprintf(fid,'memory_initialization_vector = \n')
for i=1:255fprintf(fid,'%d,',sig(i));
end
fprintf(fid,'%d;',sig(256));
fclose(fid);

matlab输出结果如下:

3)结果比对

为防止在计算FFT过程中出现溢出,我们在配置FFT的SCALE参数时,进行了右移处理,一共右移了8位后为0.5,正好与maltab结果是完全对应的,因此可以得出FFT IP核输出结果正确。

五、基2突发、基4突发、pipeline三种模式资源占用及性能分析

1、基2突发模式占用资源及时延

2、基4突发模式占用资源及时延


3、pipeline模式占用资源及时序

六、注意事项

1、为防止计算FFT过程中出现溢出,计算256点FFT时,在基4突发和pipeline这两种模式下,SCALE推荐采用[01_10_11_10],在基2突发模式下,推荐采用[01_01_01_01_01_00_01_10]。
2、在基2突发和基4突发模式,未采用流水下结果,只有FFT计算并输出完成后,采用允许继续输入;而pipeline模式可以连续输入数据进行FFT计算。
3、该FFT IP支持插入CP循环前缀,非常方便,但是要考虑输入数据的连续性。
4、基2突发模式占用资源最少但是处理时延大,基4突发模式正好相反,需要根据系统资源情况及时延要求综合考虑。
5、采用四舍五入方式比截断方式准确度更好。

关于xilinx FFT IP的具体使用,可以参见官方《Fast Fourier Transform v9.1 LogiCORE IP Product Guide》手册。

Xilinx FFT IP使用总结相关推荐

  1. Xilinx FFT IP core V9.0的介绍和使用

    参考: http://blog.csdn.net/yijingjijng/article/details/48137897 http://xilinx.eetop.cn/viewnews-1262 h ...

  2. FPGA数字信号处理(九)Vivado FFT IP核实现

    该篇是FPGA数字信号处理的第9篇,选题为DSP系统中极其常用的FFT运算.上篇介绍了Quartus环境下FFT IP核的使用"FPGA数字信号处理(八)Quartus FFT IP核实现h ...

  3. Xilinx HLS FFT IP核运行时动态配置FFT长度

    如上图所示,xilinx hls的fft ip核不仅可以计算固定长度的FFT变换,还可以在运行时动态配置fft变换长度,但其可配置的长度仅限于小于等于最大长度的所有可能的2的幂,即若该fft ip可支 ...

  4. FPGA数字信号处理(八)Quartus FFT IP核实现

    本系列的2-7篇分别介绍了FIR和IIR滤波器的FPGA实现.除了数字滤波器外,快速傅里叶变换(FFT)也是DSP系统常用的运算单元,用于对信号进行频域分析.FFT算法的实现很复杂,但Altera和X ...

  5. FFT IP核调用与仿真之SCALE压缩因子设置

    关于FFT IP核的配置,网上有很多相关的资料可以参考,但是唯独涉及到scaled压缩因子设置这个参数,资料却非常匮乏,这是个什么参数,应该整么设置,设置后对结果输出会有什么影响,整样才能知道它设置的 ...

  6. FIR设置过采样率 matlab,Xilinx FIR IP的介绍与仿真

    作者: OpenSLee 来源: 1 xilinx fir ip简介 1)符合AXI4-Stream的接口 2)高性能有限脉冲响应(FIR),多相抽取器,多相内插器,半带,半带抽取器和半带内插器,希尔 ...

  7. (51)Xilinx Divider IP核配置(十一)(第11天)

    (51)Xilinx Divider IP核配置(十一)(第11天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Divider IP核配置(十一 ...

  8. (50)Xilinx Multiplier IP核配置(十一)(第10天)

    (50)Xilinx Multiplier IP核配置(十一)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Multiplier IP ...

  9. (49)Xilinx Subtracter IP核配置(十)(第10天)

    (49)Xilinx Subtracter IP核配置(十)(第10天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)Xilinx Subtracter IP核 ...

最新文章

  1. IOS 编程中引用第三方的方类库的方法及常见问题
  2. 深度报告:中国将主宰5G时代?华为中兴的最大机会来了
  3. idea 中 git 修改了文件却无法提交(No Changes detected)
  4. linux内核oops错误码说明,Oops 定位错误代码行
  5. 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...
  6. linux之文件类型
  7. 计算机三级信息安全技术考什么2019,2019计算机三级信息安全技术精品练习8
  8. 【LeetCode笔记】300. 最长递增子序列(Java、动态规划、二分法、贪心)
  9. 信号检测与估计理论 pdf_CVPR2020|行人检测与重识算法推荐论文源码大盘点
  10. 专题:CentOS社区企业操作系统
  11. “方法X对于类型Y是模糊的” Java模糊方法调用null错误
  12. mpvue微信小程序引入腾讯地图sdk
  13. ubuntu16.04 修改分辨路并永久保存
  14. Qt5.12 安装教程windows
  15. 计算机组成原理408
  16. python ttk separator_python - ttk.Separator设置长度/宽度 - 堆栈内存溢出
  17. 一名大二废柴今后目标
  18. 限定性定语从句和非限定性定语从句的区别
  19. 数据库方言(Dialect)
  20. 计算机动画主要学什么,动画专业主要学什么?

热门文章

  1. 电子配线架何去何从?
  2. Pointnet(part_seg)train.py,test.py代码随记
  3. 小学生关于计算机的知识,计算机是什么,给小学生讲计算机知识.ppt
  4. vscode配置备忘录
  5. 《Android App开发进阶与项目实战》出版后记
  6. 大佛普拉斯(大佛+)
  7. CGB2105-Day-09笔记
  8. vue父子组件之间的传值,及互相调用父子组件之间的方法
  9. 美学心得(第二百四十三集) 罗国正
  10. java B2B2C源码电子商务平台 -SpringCloud服务相互调用RestTemplate