精华内容
下载资源
问答
  • IP核手册,需要的自行下载吧。这个手册详细解释了FFT的使用方法,非常详细。
  • vivado FFT IP核中文翻译版本,是有道翻译的版本。Fast Fourier Transform v9.1
  • Xilinx FPGA FFT IP核完整的Vivado工程,用于实现FFT算法,可直接进行波形仿真,测试过没问题,另外还包含matlab仿真文件,时序波形仿真结果和matlab结果一致。
  • 简介: 结合VIVADOFFT IP核的使用,编写Verilog 代码进行配置和相应的testbench文件的编写,并结合MATLAB软件产生测试数据并进行后续的计算结果误差分析。有详细的源代码以及注释。
  • 详细介绍了vivado FFT 9.0版本AXIS总线 IP核的使用过程,附测试仿真代码
  • 快速傅里叶变换v9.0 IP核指南 ——Vivado设计套件 介绍:Xilinx FFT IP核是一种计算DFT的有效方式。 特点:•前向变换(FFT)和反向变换(IFFT)在复数空间,并且可以在运行的同时进行选择配置 •变换点数范围:N...
  • 参考这篇博客:https://blog.csdn.net/weixin_37182342/article/details/88916904,利用Vivado2017.4软件实现仿真,并在MATLAB软件中进行结果验证。
  • Xilinx vivado FFT IP核v9.0官方手册 pg109
  • VIVADO FFT IP核简单使用、8点FFT的实现

    千次阅读 2020-12-03 09:31:17
    VIVADO(VHDL语言) FFT IP核简单使用、8点FFT的实现一、VIVADO FFT IP核的调用、配置和生成二、个人配置示例三、个人对IP核的使用,以及引脚含义的理解四、收获仿真 一、VIVADO FFT IP核的调用、配置和生成 点击...

    一、VIVADO FFT IP核的调用、配置和生成

    1. 点击IP Catalog查找到vivado的fft IP核Fast Fourier Transform,双击进入配置界面。
      在这里插入图片描述

    2. 界面介绍,主要分为两大块,左边区域为IP核整体信息介绍部分,右边为详细配置部分。按照自己需求进行配置后可查看左边生成的IP核信息。具体的IP核配置界面介绍和参数分析可查看以下链接中大佬们阐述的内容。
      在这里插入图片描述
      !!!!!!☟☟☟不懂必看系列☟☟☟!!!!!!
      vivado 的IFFT/FFT IP核的配置及调用
      Vivado中FFT9.1 IP核的使用(1)

    看完上面的链接后,可根据自己需求配置IP核
    这里有三个需要注意的点:
    ①:时钟要设置正确,并且仿真或者硬件输入要匹配。如果硬件输入时钟与你的FFT IP核时钟不一致,可以使用MMCM时钟IP核进行转换。仿真时也要记得给对正确的时钟。
    ②:FFT IP核的复位引脚(ARESETn)最好使用,怎么使用?–把时钟IP核输出的locked引脚赋给FFT的复位引脚,并且在locked引脚为低时给FFT IP核一系列输入引脚均赋予初值。时钟IP核locked引脚代表意义:时钟IP核输出的时钟是否稳定有效,低时不稳定,高时表明时钟IP核输出时钟稳定
    ③:FFT IP核的输出模式,依据自己需要进行选择,默认为倒序输出,一般选择为自然输出。

    二、个人配置示例

    还有什么对FFT IP核不懂的均可直接查看官方数据手册,毕竟官方的东西就是牛逼!!
    网上找不到可以进入赛灵思官网,搜索pg109。那里有你最需要的东西!!

    以我调用的FFT IP核配置供大家参考,我定义的FFT IP核时钟为10MHZ,数据通道个数为1,变换点数N=8,输入数据为16位定点可截断数据,并使用了复位引脚(ARESETn),输出模式为自然输出模式(Natural Output),以下是配置截图。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、个人对IP核的使用,以及引脚含义的理解

    • 首先从FFT IP核引脚分布来分析,大约可分为五大块
      ①:寄存器配置部分(S_AXIS_CONFIG):它包含三个引脚,分别为TDATA,TREADY,TVALID。配置信息包含在tdata里面,tdata的位宽以及位定义在你配置好IP核后就已经确定,查看IP核信息部分中的IP Symbol栏即可按照正确配置方式在代码中进行寄存器配置。tready,tvaild两兄弟的作用可参考上面链接中详细阐述。

    在这里插入图片描述
    ②:输入数据部分(S_AXIS_DATA):四个引脚TDATA,TREADY,TVALID,TLAST。首先说的是S_AXIS_DATA_TDATA的位宽是你配置FFT IP核时输入数据位宽的两倍,同样位定义可以在IP Symbol查看,为什么是两倍?因为FFT IP核既可以做顺序运算也可做逆运算→也就是IFFT,意思就是给你准备了虚数部分的位定义。S_AXIS_DATA_TDATA低位为实数部分,高位为虚数部分。在哪里配置?在S_AXIS_CONFIG_TDATA里面配置。TREADY,TVALID两兄弟不说了,TLAST是起到一个输入数据末端指示作用,比如你作8点FFT运算,你要给8个数据给IP核吧,在最后一个数据期间你把TLAST拉高就行了,意思是告诉IP核,这一组的8个数据都给你带过来了,这是最后一个。IP核一验算,整整齐齐8个,就不会找你麻烦了。
    ③:输出数据部分(M_AXIS_DATA):输出和输入差不多,使用时将M_AXIS_DATA_TREADY一直拉高即可。
    ④:时钟和复位(aclk/aresetn):时钟和复位正常使用,注意事项上面(一、2、②)已经阐述,遇到问题可参考。
    ⑤:事件报告部分总共七个引脚,具体含义可直接查看手册,一般高有效,主要报告芯片工作状态以及出错情况。

    在这里插入图片描述

    • FFT IP核使用说明及注意事项
      ①:**关于复位引脚的使用,建议大家都用上,保证电路稳点可靠。**如上面(一、2、②)所说,复位引脚可使用时钟IP核输出引脚locked作为复位信号,locked为低时,可以使FFT IP核复位;为高时,时钟输出稳定,并且FFT IP核也正常运行。至于赋FFT IP核输入信号的初值,也可以在locked为低时赋值,这样保证输入信号也达到一个初始化的稳定状态。
      ②:FFT IP核输入数据赋值:当IP核的S_AXIS_DATA_TREADY引脚拉高时,表示核本身已经准备好接收数据,这时,你把S_AXIS_DATA_TDATA拉高N个时钟周期来传N个数据,并同时在每个时钟里都塞入数据,到达数据输入终点时的最后一个数据传输时钟里将S_AXIS_DATA_TDATA拉高一个时钟周期,即完成数据输入。
      ③:始终均可拉高的引脚:S_AXIS_CONFIG_TVALID,S_AXIS_DATA_TREADY。别问,问就是不知道。

    四、收获仿真

    • 我的是8个点的FFT IP核,输入数据简单点,就弄了序列X=[1,2,3,4,5,6,7,8];
      matlab的fft数据如下:

    在这里插入图片描述

    • 我的仿真结果如下:
      输入为8点数据,分别为1-8,使用的是ROM IP核输出的,有关ROM IP核的使用请自行学习,也很简单哦!
      输出自然也为8点,我的FFT IP核输出的是32位数据,低16位为实部,高16位为实部,程序中我已分开输出。
      整体波形
      重点:FFT输入数据波形
      重点:FFT输入、输出数据波形
      ![重点:real_out:输出数据实部、imag_out:输出数据虚部

    五、总结

    • 关于实现代码:希望大家都能从理论上论证学习再到实操实践,自己动手远比拿着别人的结果看一看会收获得多。这里附上vivado VHDL语言的工程文件,有需要的可以下载!
      VIVADO VHDL 8点FFT的简单实现project文件
    • 此文章介绍的FFT IP核内容有限,还不够详细!帮助自己总结,也希望能稍微帮到你们一点,网上论坛和博客中均含有使用FFT IP核的类似文章,我也是一边看网上实操加上看官网提供的IP核数据手册-pg109(这玩意是最准确有效的法宝)才慢慢摸索出来的,不是很难,但也绝非容易。
    • 再强调一下,迷茫的时候大家根据需求多看数据手册,看懂了就没太大问题了。
    • 怕大家没看到,这两篇链接再放出来一下,很好的文章。
      vivado 的IFFT/FFT IP核的配置及调用
      Vivado中FFT9.1 IP核的使用(1)
    • 最后,欢迎大家指正讨论!哔哔完*&……¥撒花✿✿ヽ(°▽°)ノ✿!
    展开全文
  • 举个例子,我设置fft ip核点数N=1024,当我输入的数据个数小于1024和大于1024时,ip核输出的数据个数分别是多少?</p>
  • Vivado FFT IP核实现

    2019-09-26 16:05:36
    VIVADO中建立一个FFT核,只要依下图步骤就可以开始配置一个FFT核: 需要配置的参数有三个标签页,需要一一配置 第一个标签页里主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意的是...

    在VIVADO中建立一个FFT核,只要依下图步骤就可以开始配置一个FFT核:

    需要配置的参数有三个标签页,需要一一配置

    第一个标签页里主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意的是结构的配置会影响调整因子。

    第二配置页主要是数据宽度,格式,控制信号,输出方式,和可选的控制信号。需要注意的是输据的输入是自然方式(Natural  Order),输出可以是自然方式也可以是倒序方式(Reversed Order),如果选用倒序方式输出,在后面处理中就要注意这一特性。

    第三配置页主要配置内部数据块的使用和优化的方式

    所有这些配置完成后,可以左侧一列中察看配置的结果,IP Symbol中主要察看各种接口,Implementation Detals 中有较多的信息,比如结构,长度,数据宽度等,需要注的是CONFIG TDATA这一项,与配置接口的参数有关,在使用中需要正确配置。在当前的配置, FWD_INV使用1bit,bit10:bit1用于调整因子,前面已经说过不同的结构调整因子不同,详细的可以参看FFT的核文献。

    之后点击OK就可以完成配置,并生成FFT核,并在Project Manager的source中找IP Sources的资源,核的模板就是xfft_0.veo

    我们就用这个模板创造我们的实例

    有一些接口是不需要的,对它进行重新封装,配置参数是固定的,直接设成固定值,需要注意的是当前配置参数中,调整因子是0,即不调整,这在数据比较小的时候,不会出现问题,当输入数据比较大时,需要适当的设置,以免在进行蝶形运算时出现溢出的情况。

    //
    module fft_core_test(
        clk,
        config_en,
        dat_rdy,
        dat_last,
        dat_in_RE,
        dat_in_IM,
        fft_core_rdy,
        freq_o_en,
        freq_o_RE,
        freq_o_IM  
        );
        
        input clk;
        input config_en;
        input dat_rdy;
        input dat_last;
        input [15:0] dat_in_RE,dat_in_IM;
        output fft_core_rdy;
        output freq_o_en;
        output [15:0] freq_o_RE,freq_o_IM;
     
        wire fft_core_rdy;   
        wire freq_o_en;
        wire [15:0] freq_o_RE,freq_o_IM;
        //fft core
        wire aclk = clk;
        wire [15 : 0] s_axis_config_tdata = 16'b0_0000_0000_0000_00_1;     //scal_sch:  [14:1]   FWD_INC:[0]    
        wire s_axis_config_tvalid = config_en;
        wire s_axis_config_tready;
        wire [31 : 0] s_axis_data_tdata = {dat_in_IM,dat_in_RE};
        wire s_axis_data_tvalid = dat_rdy;
        wire s_axis_data_tready;
            assign fft_core_rdy = s_axis_data_tready;
        wire s_axis_data_tlast = dat_last;
        wire [31 : 0] m_axis_data_tdata;
        assign  {freq_o_IM,freq_o_RE} = m_axis_data_tdata;
        
        wire m_axis_data_tvalid;
        assign freq_o_en = m_axis_data_tvalid;
        wire m_axis_data_tready = 1'b1;
        wire m_axis_data_tlast;
        wire event_frame_started;
        wire event_tlast_unexpected;
        wire event_tlast_missing;    
        wire event_status_channel_halt;
        wire event_data_in_channel_halt;
        wire event_data_out_channel_halt;
        
       
     
    xfft_0 your_instance_name (
      .aclk(aclk),                                                // input wire aclk
      .s_axis_config_tdata(s_axis_config_tdata),                  // input wire [15 : 0] s_axis_config_tdata
      .s_axis_config_tvalid(s_axis_config_tvalid),                // 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 [31 : 0] s_axis_data_tdata
      .s_axis_data_tvalid(s_axis_data_tvalid),                    // input wire s_axis_data_tvalid
      .s_axis_data_tready(s_axis_data_tready),                    // output wire s_axis_data_tready
      .s_axis_data_tlast(s_axis_data_tlast),                      // input wire s_axis_data_tlast
      .m_axis_data_tdata(m_axis_data_tdata),                      // output wire [31 : 0] m_axis_data_tdata
      .m_axis_data_tvalid(m_axis_data_tvalid),                    // output wire m_axis_data_tvalid
      .m_axis_data_tready(m_axis_data_tready),                    // input wire m_axis_data_tready
      .m_axis_data_tlast(m_axis_data_tlast),                      // output wire m_axis_data_tlast
      .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_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
    );    
    endmodule
    

    然后新建一个用于simulation的testbench文件, 用于sim的testbench文件是出现 在simulation Sources中的,也可以按源文件的方式建立testbench,这样出现的testbench出现在 Design Sources中,开发环境可能会认为这一文件也是正式的工程文件,可能会报出一些问题,具体自己试。

    module sim_fft( );
     
        reg all_en;
        reg clk;
        reg config_ena;
        reg dat_rdy;
        reg dat_last;
        reg [15:0] dat_c;
        wire [15:0] dat_in_RE,dat_in_IM;
        wire fft_core_rdy_t;
        wire freq_o_en_t;
        wire [15:0] freq_o_RE_t,freq_o_IM_t;
        
        integer handle1;
        initial
        begin//sequence block    
          handle1 =$fopen("fsave.txt");       
          #200000  $fclose(handle1);
          $stop;
        end 
        
        
        initial 
        begin
            clk = 0;
            dat_rdy = 0;
            dat_last = 0;
            //dat_in_RE=0;
            dat_c =0;
            config_ena = 0;
            all_en=0;
            #200 all_en = 1;
            //#20 config_ena =1;
            //#100 config_ena =0;
            forever #10 clk = ~clk;        
        end
        //
        reg [15:0]  cnt=0;
        reg [15:0] index = 0;
        always @(posedge clk)
        begin
            if(all_en)
                begin
                cnt <= cnt + 1'b1;
                if(cnt == 0)     
                begin     
                    config_ena  <=1;    
                end
                else if(cnt == 3)
                    config_ena  <= 0;
                else if(cnt == 5)
                begin    
                    dat_rdy <= 1;
                    dat_c <= 0;
                   // dat_in_IM <= 0;
                    index = 0;
                end        
                else if(cnt == 16'd1028)
                begin        
                    dat_last <= 1'b1;                
                    dat_c <= (dat_c + 12'h100);                
                end
                else if(cnt == 16'd1029)
                begin
                    dat_rdy <= 1'b0;
                    dat_last <= 1'b0;
                end
                else
                begin            
                    //dat_last <= 1'b0;
                    dat_c <=(dat_c + 12'h100);                
                end
                
                if(dat_rdy)
                    index <= index +1;
            end
        end 
     
        always @(posedge clk)
        begin
            if(dat_rdy)        
                $fwrite(handle1,"%d  %d \n",dat_in_RE,dat_in_IM);  
            else if(freq_o_en_t)        
                $fwrite(handle1,"%d  %d \n",freq_o_RE_t,freq_o_IM_t);        
        end
        
        
         assign dat_in_RE ={ 8'b0,{ dat_c[15]? ~dat_c[15:8] : dat_c[15:8]}};
         assign dat_in_IM =0;
    fft_core_test   fft_core_inst(
        .clk(clk),
        .config_en(config_ena),
        .dat_rdy(dat_rdy),
        .dat_last(dat_last),
        .dat_in_RE(dat_in_RE[15:0]),
        .dat_in_IM(dat_in_IM[15:0]),
        .fft_core_rdy(fft_core_rdy_t),
        .freq_o_en(freq_o_en_t),
        .freq_o_RE(freq_o_RE_t),
        .freq_o_IM(freq_o_IM_t)  
        );
    endmodule
    

    然后启动编译,之后就可以启动功能仿真。仿真的结果如下图。仿真的时候要注意一下event_tlast_unexpected和 event_tlast_missing;  这两个信号,如果出现则说明接口的时序配置有问题,跟FFT内部的配置不一致.

    在前面的testbench文件中,我们可以看到产生了一个三角波用于测试,同时我们把原始输入到FFT核 中的数据和FFT核输出的数据保存了下来,以便于用MATLAB进行分析。

    clear;
     
    file_name='fsave.txt';
    fid = fopen(file_name,'r');
    c = fscanf(fid,'%d');
    fclose(fid);
     for i=1: length(c)
        if(c(i)>32767)
            b(i) =  c(i)-65536;
        else b(i) =  c(i);
        end
    end
    d1=b(1:2:end);
    d2=b(2:2:end);
    comp1=d1(1:1024) + j*d2(1:1024);
    comp2=d1(1025:2048) + j*d2(1025:2048);
     
    c1avr=sum(comp1)/length(comp1);
    c1=comp1-c1avr;
    %  c1=comp1;
     
    c1fft=abs(fft(c1,1024));
    c2fft=abs(comp2);
    plot(c1);
    figure
    subplot(2,1,1);
    plot(c1fft);
    subplot(2,1,2);
    plot(c2fft);
    figure
    subplot(2,1,1);
    plot(c1fft(1:50));
    subplot(2,1,2);
    plot(c2fft(1:50));
    

    下图为保存数据画出来的三角波,在这里进行了一个去直流的过程,所以MATLAB的进行FFT的结果中应该不含直流分量,而FFT核运算出的数据中应该有直流分量。

    下图中,第一个MATLAB进行的FFT结果,第二个FFT核输出的结果

    只看前50个点的数据。可以看到两种方式输出数据中的频率分量都是对准的,而且在第二个图中(FFT核输数据)可以看到直流分量是有的。

     

    展开全文
  • 此资源为VIVADO的工程文件,语言使用的是VHDL语言,其中包括FFT IP核的使用,ROM的IP核使用,时钟IP核的使用。实现了8定点的FFT功能。
  • Vivado FFT IP核配置:从入门到熟练

    千次阅读 2020-11-17 09:37:57
    前言 fpga初学者,在vivado软件上调用fft IP核时,一头雾水。参考了部分博文,总结出FFT调用的流程,并更新了部分端口的说明 (https://www.cnblogs.com/lgy-gdeu/p/11590626.html 中有两个端口说明可能有误解)。 ...

     

    前言

    fpga初学者,在vivado软件上调用fft IP核时,一头雾水。参考了部分博文,总结出FFT调用的流程,并更新了部分端口的说明 (https://www.cnblogs.com/lgy-gdeu/p/11590626.html 中有两个端口说明可能有误解)。

    一、调用IP核

    1、点击Flow Navigator中的IP Catalog,搜索FFT,选择xfft9.1.

    2、双击后,有三个界面需要配置

    第2页:

    主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意的是结构的配置会影响调整因子。如下图所示:

              number  of  channels :变换通道,可以选择多通道,实现多帧数据同时进行FFT运算;

            transform  lenfgth   : FFT变换长度,如果选择了最下面的‘run time configurable transdorm legth’,则该参数是FFT变化的最大长度,一般不选。

         architecure  choice : 这个标签里主要是用来实现,FFT变换所选用的架构:

                 Automatically  selected :   自动选择所需要的,FFT变化架构。

                    pipelined  streaming     :    并行流水线结构

                    radix-4, burst i/o            :   基4 I/O突发结构 

                                                   radix-2, burst i/o            :    基2 I/O突发结构

                                                   radix-2 life, burst i/o       :   基2 I/O突发结构

              其中流水线的结构变换处理时间最短,资源消耗最大。

         run time configurable transdorm legth  : 该选项可以在FFT变换中通过设置s_axis_config_tdata中NFFT字段的长度来改变FFT变化的长度。

    第2页:

    配置 数据宽度,格式,控制信号,输出方式,和可选的控制信号。

             需要注意的是输据的输入是自然方式(Natural  Order),输出可以是自然方式也可以是倒序方式(Reversed Order),如果选用倒序方式输出,在后面处理中就要注意这一特性。

             其中在data format;下拉标签中,对应着FFT IP核支持两种数据类型: 
                                           1. 定点全精度 
                                           2. 定点缩减位宽 
             scaling optios :缩放选项 :

                                            1、 block floating point :不管输入的格式如何,FFT变化内部都采用浮点,会根据每一级的的数据情况自动缩放。 这个模式的输入输出位宽一致,便于调用。

                                            2、scaled :在m_axis_data_tuser中会有5BIT表示每一级的缩放情况,在s_axis_config_data中会有相应的字段配置配置缩放因子.每一级别包含2个stage ,2个bit 表示一级缩放,一般0-3可选,如果log(NFFT)不是2的倍数,则最高一级的缩放只能在0-1之间选取。

                                            3、unscaled :不用担心变化过程中会出现溢出,但是输入是32bit的话,输出是64bit。

              Aresten : 复位信号要勾选,至少保持两个时钟的低电平。

               output odering options: 输出顺序选项。

                                            1、nature order:就是FFT变化后的输出已经调整了顺序,按照xk_index自然顺序列出变化结果,

                                            2、bit/digital reserved oder就是按照变化后的顺序直接输出,是倒序输出,需要自己后续处理,

                                            3、cyclic perfix insertion :循环前缀插入,一般添加,在进行IFFT后可以根据s_axis_config_data中的CP长度配置自动添加CP。

               optional output fileds :选项输出字段,

                                            1、xk_index:FFT 变幻的结果索引,在m_axis_data_user中有相应的字段。

                                            2、OVFLO是变换中溢出的指示信号,对应event_fft_overflow.

    第3页:没有变化

    详细的FFT IP核说明可参考  Documentation 中的 Product Guide的pdf文件。

    点击OK,即可。

     

    二、编写一个.v 文件来驱动FFT单元

    1、例化fft IP核。 点击.IP Source中 Instantiation Template下的 .veo文件,双击。将以下代码复制到.v文件中。

    该代码定义了端口名称,输入输出模式,位宽等。

    2. 利用以上代码。 看起来很头疼,但研究之后回过头来发现,例化代码中真正对数据输入和FFT输出有关系的端口,只有s_axis_config_XXX,s_axis_data_XXX,和m_axis_data_XXX,其中前2个是输入配置,第3个是输出配置。

    最终编写的.v文件如下

    `timescale 1ns/1ps
    
    module fft64(
    	input           i_clk,	//100MHz, 10ns
    	input           aresetn,
    	input[7:0]     s_axis_config_tdata,
    	input           s_axis_config_tvalid,
    	output          s_axis_config_tready,
    	output          s_axis_data_tready, 
        input[31:0]     s_axis_data_tdata,  //输入的16位数据 16*2
        input           s_axis_data_tvalid, //拉高N个周期,输入N个数据进行fft
        input           s_axis_data_tlast,  //输入N个数据后拉高,停止数据输入
        output[47:0]    m_axis_data_tdata,
        output[7:0]     m_axis_data_tuser,
        output          m_axis_data_tvalid,
        input           m_axis_data_tready,
        output          m_axis_data_tlast
        );
    
        wire            event_frame_started;
        wire            event_tlast_unexpected;
        wire            event_tlast_missing;
        wire            event_status_channel_halt;
        wire            event_data_in_channel_halt;
        wire            event_data_out_channel_halt;
    
    fft_f fft64 (
      .aclk(i_clk),                                                // input wire aclk
      .aresetn(aresetn),                                          // input wire aresetn
      .s_axis_config_tdata(s_axis_config_tdata),                  // input wire [7 : 0] s_axis_config_tdata
      .s_axis_config_tvalid(s_axis_config_tvalid),                // 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 [31 : 0] s_axis_data_tdata
      .s_axis_data_tvalid(s_axis_data_tvalid),                    // input wire s_axis_data_tvalid
      .s_axis_data_tready(s_axis_data_tready),                    // output wire s_axis_data_tready
      .s_axis_data_tlast(s_axis_data_tlast),                      // input wire s_axis_data_tlast
      .m_axis_data_tdata(m_axis_data_tdata),                      // output wire [47 : 0] m_axis_data_tdata
      .m_axis_data_tuser(m_axis_data_tuser),                      // output wire [7 : 0] m_axis_data_tuser
      .m_axis_data_tvalid(m_axis_data_tvalid),                    // output wire m_axis_data_tvalid
      .m_axis_data_tready(m_axis_data_tready),                    // input wire m_axis_data_tready
      .m_axis_data_tlast(m_axis_data_tlast),                      // output wire m_axis_data_tlast
      .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_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
    );
    	
    endmodule

    3.  端口说明

    Input[N:0]:  s_axis_config_tdata:控制输入模式,进行fft/ifft以及衰减因子的设置,FWD_INV = 1做 fft,FWD_INV = 0做ifft。

    Input:          s_axis_config_tvalid:拉高两个时钟周期之后,将端口s_axis_data_tvalid和s_axis_data_tready拉高。

    Output:       s_axis_config_tready:s_axis_config_tvalid拉高两个时钟周期后,该口给1输出;若干个时钟周期后,自动归零。

    Output:       s_axis_data_tready:aresetn拉高两个时钟周期后,该口给1输出;此时ip核初始化完成,可进行数据输入。

    Input:          s_axis_data_tvalid:当s_axis_data_tready高电平后,将s_axis_data_tvalid拉高L个周期,输入L个数据进行fft;L是FFT的点数。

    Input[M:0]:  s_axis_data_tdata:将数据输入进行FFT运算。

    Input:          s_axis_data_tlast:输入L个数据后拉高,停止数据输入。

    做fft需要耗费的时钟周期计算如下s_axis_data_tlast- s_axis_data_tvalid

    Output[M1:0]:m_axis_data_tdata:高位为虚部,低位为实部。(经过测试发现的,implementation也有定义)

    Output:          m_axis_data_tvalid:当fft结果输出时拉高,输出2048个点的数据后拉低。

    Output[M2:0]:m_axis_data_tuser:输出fft的地址值,输出值*fs/L为对应频点。

    Input:             m_axis_data_tready:需保持高电平,保证FFT单元处在计算模式,并且能够输出结算结果;

    Output:          m_axis_data_tlast:当fft结果输出到最后一个结果时拉高,紧接着下一个时钟就拉低。

    说明

    (a)FWD_INV的字段从这里得到

    (b)当输入数据包含实部和虚部时,输入端口s_axis_data_tdata的高位存放虚部,低位存放实部。

    (c)输出数据的实部和虚部的字段分布

     

    三、编写一个testbench_top.v 文件对FFT单元进行测试。

    1、需要在testbench_top文件中对“二、编写一个.v 文件来驱动FFT单元” 中编写的.v文件进行例化。 代码如下:

    module testbench_top();
    	
    
    //参数定义
    
    `define CLK_PERIORD		10		//时钟周期设置为10ns(100MHz)	
    
    
    //接口申明
    	
    reg 		  clk;
    reg 		  rst_n;
    reg 		  aresetn;
    reg[7:0]	  s_axis_config_tdata;
    reg           s_axis_config_tvalid;
    wire          s_axis_config_tready;
    
    wire          s_axis_data_tready; 
    reg[31:0]     s_axis_data_tdata;  //输入的16位数据 16*2
    reg           s_axis_data_tvalid; //拉高4096个周期,输入4096个数据进行fft
    reg           s_axis_data_tlast;  //输入4096个数据后拉高,停止数据输入
    
    wire[47:0]    m_axis_data_tdata;
    wire[7:0]     m_axis_data_tuser;
    wire          m_axis_data_tvalid;
    reg           m_axis_data_tready;
    wire          m_axis_data_tlast;	
    
    reg    [15:0] mem0_re[1:64]; 
    wire[23:0]    o_data_real;
    wire[23:0]    o_data_imag; 
    assign o_data_real = m_axis_data_tdata[23:0];
    assign o_data_imag = m_axis_data_tdata[47:24];
    	
    //对被测试的设计进行例化
    
    fft64		uut_fft64(
    	.i_clk				 (clk),  //100MHz, 10ns
    	.aresetn			 (aresetn),
    	.s_axis_config_tdata (s_axis_config_tdata),
    	.s_axis_config_tvalid(s_axis_config_tvalid),
    	.s_axis_config_tready(s_axis_config_tready),
    	.s_axis_data_tready	 (s_axis_data_tready),  
    	.s_axis_data_tdata	 (s_axis_data_tdata),
    	.s_axis_data_tvalid	 (s_axis_data_tvalid),
    	.s_axis_data_tlast	 (s_axis_data_tlast),
    	.m_axis_data_tdata	 (m_axis_data_tdata),
    	.m_axis_data_tuser	 (m_axis_data_tuser),
    	.m_axis_data_tvalid	 (m_axis_data_tvalid),
    	.m_axis_data_tready	 (m_axis_data_tready),
    	.m_axis_data_tlast	 (m_axis_data_tlast)
        );	
    	
    
    //复位和时钟产生
    	//时钟和复位初始化、复位产生
    initial begin
    	clk <= 0;
    	rst_n <= 0;
    	#1000;
    	rst_n <= 1;
    end
    	//时钟产生
    always #(`CLK_PERIORD/2) clk = ~clk;	
    
    
    //测试激励产生
    
    initial $readmemb("D:/FPGA_Code/TeQuan_Study/sim_115_FFT2/0Matlab/data_before_fft.txt", mem0_re);
    integer i;
    	
    initial begin
    	// Initialize Inputs
    	clk = 0;
    	aresetn = 0;
    	s_axis_config_tdata = 0;
    	s_axis_config_tvalid = 0;
    	
    	s_axis_data_tvalid = 0;
    	s_axis_data_tdata = 0;
    	s_axis_data_tlast = 0;
    	
    	m_axis_data_tready = 0;
    	i = 0;
    	// Wait 200 ns for global reset to finish
    	#200;
    	aresetn = 1;
    	m_axis_data_tready = 1;
    	s_axis_config_tvalid = 1;
    	s_axis_config_tdata = {7'b0, 1'b1}; 
    
    
    	#8000
    	s_axis_config_tvalid = 0;
    	aresetn = 0;
    	#300;
    	
    	$stop;
    	
    end
    
    
    always @(posedge clk)
    begin
      if(s_axis_data_tready == 1)
      begin
        i = i + 1;
        s_axis_data_tvalid <= 1;
        s_axis_data_tdata <= mem0_re[i];
        $display("mem_a[%d] = %d", i, mem0_re[i]);
    	
    	if(i == 68)
    	begin 
    	  s_axis_data_tlast <= 1;
    	  s_axis_data_tvalid <= 0;
    	end
    
      end
    end
    
    
    endmodule

    说明:

    (a)输入数据在data_before_fft.txt中,测试使用的是从1到64的整数(间隔1),一共64个数字。

    (b)输出的端口一定要记得定义wire 输出,否则没有输出数据。

    四、Vivado仿真结果

    运行结果如下:

    可以看出,可完成1~64的数据输入。

    经过研究发现:

    (a)aresetn信号存在时,是控制FFT是否运行,以及是否输出运算结果的使能信号。此外,aresetn信号必须在FFT输入之前,到FFT结果计算结束之间这段时间,都必须保持高电平。

    (b)s_axis_data_tvalid也是控制输入和输出的信号端口。使用的时候给fft喂数据就enable(1),数据喂完了就disable(0)。但是在aresetn信号存在,s_axis_data_tvalid失去作用。

     

    五、与Matlab仿真结果对比

    Matlab运算结果:

    IP核运算结果

    1、运算结果实部和虚部,数字的值趋势相同,但是存在误差;

    2、实部数值正负号相同,数字值差别也不大,正确;

    3、虚部数值正负号完全相反,数字值本身差别不大,有问题。 如何解决?

    将config_tdata信号修改为s_axis_config_tdata = 8'b0000_0000。可得到FFT正确结果。

    六、目前还有以下问题:

    然而,8b0的配置明明是IFFT的配置,为什么在这里却能得到FFT的结果?

    当输入是浮点数时,FFT如何配置?

    应该在IP核界面中配置:

    算术类型:

    • 无标度(全精度)定点
    • 定标定点
    • 浮点数

    定点或浮点接口

    蝴蝶后舍入或截断

     

    补一补Verilog中signed,原码,反码,补码基础 https://blog.csdn.net/maxwell2ic/article/details/80596210

    这篇博文同时实现了FFT/IFFT 在VIVADO中实现FFT/IFFT https://blog.csdn.net/luobluesky/article/details/90516652?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param 值得参考!

    这篇博文利用的FFT模式是Fixed Point,Block Floating Point,Convergent Rounding。这样得到的结果,FFT模值趋势上与Matlab相同,但是具体的实部、虚部数值也存在相反现象。

    ModelSim结果

    Matlab结果(上面是实部,下面是虚部)

     

     

    参考博文

    https://blog.csdn.net/u013215852/article/details/105345952/

    https://blog.csdn.net/qq_36375505/article/details/81742680

    https://blog.csdn.net/id_yqduan/article/details/108882080?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

    https://www.cnblogs.com/lgy-gdeu/p/11590626.html

     

     

     

     

     

     

     

     

     

    展开全文
  • FPGA数字信号处理(九)Vivado FFT IP核实现

    万次阅读 多人点赞 2018-06-14 16:27:45
    该篇是FPGA数字信号处理的第9篇,选题为DSP系统中极其常用的FFT运算。上篇介绍了Quartus环境下FFT IP核的使用“FPGA数字信号处理(八)...本文将介绍在Vivado开发环境下使用Xilinx提供的FFT IP核进行FFT运算的设...

    该篇是FPGA数字信号处理的第9篇,选题为DSP系统中极其常用的FFT运算。上篇介绍了Quartus环境下FFT IP核的使用“FPGA数字信号处理(八)Quartus FFT IP核实现https://blog.csdn.net/fpgadesigner/article/details/80690345 ”。本文将介绍在Vivado开发环境下使用Xilinx提供的FFT IP核进行FFT运算的设计。


    IP核概述

    这里写图片描述
    Xilinx的FFT IP核属于收费IP,但是不需要像 Quartus那样通过修改license文件来破解。如果是个人学习,现在网络上流传的license破解文件在破解Vivado的同时也破解了绝大多数可以破解的IP核。只要在IP Catalog界面中Fast Fourier Transform的License状态为“Included”即可正常使用。


    IP核参数设置

    与Quartus中FFT IP核相比,Vivado的FFT IP核配置起来更复杂,功能也更强大。 打开主界面,左边是IP核的接口图(IP Symbol)、实现消耗的资源等信息(Implementation Details)和计算FFT所需的时间(Latency),右边是Configuration、Implementation和Detailed Implementation三个标签卡。

    这里写图片描述
    Vivado的FFT IP核支持多通道输入(Number of Channels)和实时更改FFT的点数(Run Time Configurable Transform Length)。Configuration标签下设置FFT的点数(Transform Length)和工作时钟(Target Clock Frequency),选择一种FFT结构,包括流水线Streaming、基4 Burst、基2 Burst和轻量级基2 Burst,计算速度和消耗的资源依次减少。
    这里写图片描述
    Implementation标签卡下设置FFT的数据格式为定点Fixed Point或浮点Float Point;设置输入数据的位宽和相位因子位宽(相当于旋转因子)。还有一些可选的附加信号。“Output Ordering”设置FFT计算结果以自然顺序(Nature Order)或位/数值反序(Bit/Digit Reversed Order)输出。
    这里写图片描述
    Detailed Implementation这个Tab中设置优化方式、存储的类型、是否使用DSP单元等与综合、实现有关的信息,比如可以选择复数乘法器和蝶形运算单元的实现结构。

    设置完成后,系统会在Latency中显示出计算FFT所需的时间,如下图所示:
    这里写图片描述
    可以据此衡量计算速度是否满足设计需求,如不满足可以使用更好性能的FFT结构或选择可以提高计算速度的优化选项,消耗更多的资源来缩短计算周期。


    FPGA设计

    IP核的接口在Verilog HDL中进行设计时,一定要参考官方文档中给出的时序图。在IP核的配置界面点击“documentation”,可以找到IP核的user guide。 也可以在Xilinx官网或DocNav工具中搜索pg109,查阅FFT IP核的说明。Burst模式、自然顺序输出的时序图如下:
    这里写图片描述
    驱动接口时序的Verilog HDL示例代码如下所示:

    `timescale 1ns / 1ps
    //--------------------------------------------------------
    //  使用Xilinx FFT IP核完成FFT运算
    //--------------------------------------------------------
    module Xilinx_FFT_Guide_liuqi(      
    
            input aclk,
            input aresetn,
    
            input [11:0]    input_data_ch1,
            output [23:0]   fft_real,
            output [23:0]   fft_imag,
            output reg [46:0]   amp,
            output fft_out_valid
    );
        reg [11:0] input_data_ch1_reg;    
        wire [7:0] s_axis_config_tdata;
        reg s_axis_config_tvalid;
    
        wire s_axis_data_tready;
        reg [31:0] s_axis_data_tdata;
        reg s_axis_data_tvalid;
        reg s_axis_data_tlast;
    
        wire [47:0] m_axis_data_tdata;
        wire [15:0] m_axis_data_tuser;
        wire m_axis_data_tvalid;
        wire m_axis_data_tlast;
        reg [7:0]   cfg_cnt;
        reg [13:0]  sink_ctl_cnt;   
        reg [23:0]  fft_real,fft_imag; 
        reg fft_out_valid;
        wire    event_frame_started;
        wire    event_tlast_unexpected;
        wire    event_tlast_missing;
        wire    event_status_channel_halt;
        wire    event_data_in_channel_halt;
        wire    event_data_out_channel_halt;
    
        xfft_0 usr_FFT(
    
                .aclk(aclk),
                .aresetn(aresetn),
    
                .s_axis_config_tdata(s_axis_config_tdata),
                .s_axis_config_tvalid(s_axis_config_tvalid),
                .s_axis_config_tready(),
    
                .s_axis_data_tdata(s_axis_data_tdata),
                .s_axis_data_tvalid(s_axis_data_tvalid),
                .s_axis_data_tready(),
                .s_axis_data_tlast(s_axis_data_tlast),
    
                .m_axis_data_tdata(m_axis_data_tdata),
                .m_axis_data_tuser(m_axis_data_tuser),
                .m_axis_data_tvalid(m_axis_data_tvalid),
                .m_axis_data_tready(1'b1),
                .m_axis_data_tlast(m_axis_data_tlast),
    
                .event_frame_started(event_frame_started),
                .event_tlast_unexpected(event_tlast_unexpected),
                .event_tlast_missing(event_tlast_missing),
                .event_status_channel_halt(event_status_channel_halt),
                .event_data_in_channel_halt(event_data_in_channel_halt),
                .event_data_out_channel_halt(event_data_out_channel_halt)
        );   
    
    //fft core config
        always@(posedge aclk or negedge aresetn)
        begin
            if(!aresetn)
                cfg_cnt <= 8'd0;
            else
            begin
                if(cfg_cnt < 8'd200)
                    cfg_cnt <= cfg_cnt + 1'b1;
                else
                    cfg_cnt <= cfg_cnt;
            end
        end
    
        always@(posedge aclk or negedge aresetn)
        begin
            if(!aresetn)
                s_axis_config_tvalid <= 1'b0;
            else
            begin
                if(cfg_cnt < 8'd200)
                    s_axis_config_tvalid <= 1'b1;
                else
                    s_axis_config_tvalid <= 1'b0;
            end
        end
    assign s_axis_config_tdata = 8'd1;
    
    /fft sink_in ctl/
        always@(posedge aclk or negedge aresetn)
        begin
            if(!aresetn)
                s_axis_data_tdata <= 32'b0;
            else
                s_axis_data_tdata <= {20'd0,input_data_ch1};
        end
    
        always@(posedge aclk or negedge aresetn)
        begin
            if(!aresetn)
                sink_ctl_cnt <= 14'd8194;
            else if(s_axis_config_tvalid)
                sink_ctl_cnt <= 14'd0;
            else if(sink_ctl_cnt == 14'd8192)
                sink_ctl_cnt <= 14'd1;
            else
                sink_ctl_cnt <= sink_ctl_cnt + 1'b1;
        end 
    
        //s_axis_data_tvalid
        always@(posedge aclk or negedge aresetn)
        begin
            if(!aresetn)
                s_axis_data_tvalid <= 1'b0;
            else if(sink_ctl_cnt < 14'd1)
                s_axis_data_tvalid <= 1'b0;
            else if(sink_ctl_cnt < 14'd2049)
                s_axis_data_tvalid <= 1'b1;
            else
                s_axis_data_tvalid <= 1'b0;
        end
    
        //s_axis_data_tlast
        always@(posedge aclk or negedge aresetn)
            begin
            if(!aresetn)
                s_axis_data_tlast <= 1'b0;
            else
            begin
                if(sink_ctl_cnt == 14'd2048)
                    s_axis_data_tlast <= 1'b1;
                else
                    s_axis_data_tlast <= 1'b0;
            end
        end
    /fft sink_in ctl/    
        always@(posedge aclk)
        begin
            fft_real <= m_axis_data_tdata[23:0];
        end
    
        always@(posedge aclk)
        begin
            fft_imag <= m_axis_data_tdata[47:24];
        end
    
        always@(posedge aclk)
        begin
            fft_out_valid <= m_axis_data_tvalid;
        end
    
        /********** 计算频谱的幅值信号 **********/
    
        wire signed [45:0] xkre_square, xkim_square;
        assign xkre_square = fft_real * fft_real;
        assign xkim_square = fft_imag * fft_imag;
    
        always @(posedge aclk)
          amp <= xkre_square + xkim_square;
    
    endmodule

    注意FFT计算结果输出的实部和虚部供用m_axis_data_tdata数据总线,因此在代码中需要截位分别得到实部和虚部。FFT计算结果的分析可以参考“FPGA数字信号处理(八)Quartus FFT IP核实现https://blog.csdn.net/fpgadesigner/article/details/80690345 ”中的内容。


    仿真与工程下载

    系统时钟(即FFT计算时钟)为50MHz,因此频谱范围为0~25MHz。使用MATLAB生成2MHz与15MHz的正弦波信号,分别写入txt文件。编写Testbench分别读取两个txt文件对两个单频信号做FFT分析,文件操作方法参考“Testbench编写指南(一)文件的读写操作”https://blog.csdn.net/fpgadesigner/article/details/80470972

    首先仿真对2MHz信号的FFT分析。根据上文Latency中的估计,计算时间需要145μs,因此仿真需要运行到大约150μs以上。结果如下:
    这里写图片描述
    整个频谱的持续时间恰好是out_valid信号保持高电平的时间,很明显可以看到2MHz信号在频谱中对应的一个频率点。将txt文件替换为15MHz的信号,结果如下:
    这里写图片描述
    观察到15Mhz信号的频谱峰值位置明显比2MHz频率靠中,符合事实。

    完整的Vivado工程(含testbench仿真)可以在这里下载:https://download.csdn.net/download/fpgadesigner/10478838

    展开全文
  • IP核主要用于完成FFT或者IFFT等功能,接口信号也分为几个类型:IP核基本信号(配置信号、时钟信号等)、接收信号部分(AXI从端口,用于接收需要处理的信号)、发送信号部分(AXI主端口,用于发送FFT/IFFT后的结果)...
  • VivadoFFT IP核的使用

    千次阅读 多人点赞 2020-05-03 17:42:37
    FFT(快速傅里叶变换)作为数字信号处理的核心算法具有重要的研究价值,可应用于傅里叶变换所能涉及的任何领域,如图像处理、音频编码、频谱分析、雷达信号脉冲压缩等数字信号处理领域。FFT的鲜明特征之一是计算离散...
  • VIVADO FFT核的实现

    万次阅读 多人点赞 2018-09-04 17:57:14
    VIVADO中建立一个FFT核,只要依下图步骤就可以开始配置一个FFT核: 需要配置的参数有三个标签页,需要一一配置 第一个标签页里主要配置通道数,点数,时钟,吞吐量,结构,以及是否可以运行时配置,需要注意的...
  • Vivado Xilinx FFT IP核v9.0 使用详解(附仿真实例)

    千次阅读 多人点赞 2021-01-16 00:34:16
    Vivado Xilinx FFT IP核v9.0 使用详解(附仿真实例) 前几天我导让我研究研究在FPGA上做FFT,作为一个迈进FPGA大门的小白,摸索之旅相当艰难~,现把学习FFT IP核的过程记录下来,为各位同胞提供参考。 一 傅里叶变换...
  • VIVADO FFT IP核配置以及端口说明

    千次阅读 2020-04-27 16:37:37
    (以下内容均是在学习了别人博客后,自己小结出来的) 原文链接1:https://blog.csdn.net/FPGADesigner/article/details/80694673 ...#FFT IP核配置说明 第一个选项是同时进行几路数据流并行。 第二个选项是变换的...
  • FFT9.1 IP核使用笔记.zip

    2020-04-21 15:57:06
    内含自己使用过程中的笔记,包含配置界面的每个选项和参数的讲解,以及ip核的每个引脚的解释。笔者是参考了官方的product guide,以及各种网络资源而总结而成,部分引用标出了原博客来源。压缩包中还有官方给出的英文...
  • Xilinx vivado FFT IP v9.0 详解

    万次阅读 多人点赞 2018-08-16 15:36:29
    FFT IP核支持三种数据类型: 1. 定点全精度 1. 定点缩减位宽 1. 块浮点 有四种可选择的FFT运算方式: 1. PipelinedStreaming I/O 1. Radix-4Burst I/O 1. Radix-2Burst I/O 1. Radix-2 Lite Burst I/O 四.....
  • 【超详细】VIVADO FFT IP v9.0 进阶

    千次阅读 2020-02-27 12:27:58
    我目前使用fft核都很简单,就是求固定长度时域数据的频谱,以4096点为例,我使用FFT核就是为了代替MATLAB中 data_fft = fft(data,4096); 这个功能。 第一次用FFT IP的时候,被吓到了,用过三四次以后基本摸清了使用...
  • 基于vivado 2015.4 的FFT IP核仿真

    千次阅读 2020-08-04 16:38:07
    小弟最近毕业论文在做OFDM方面的研究,用到了vivado中的FFT IP核,发现网上现有的也只是介绍了一些接口,而且大部分给的代码跑不出来,所以对自己使用该IP核做一些总结,并附上代码和matlab的仿真结果,欢迎大家批评...
  • vivado fft/ifft 的使用

    千次阅读 2019-05-28 17:00:43
    *在同时做fft核ifft的时候,尽量选择同一个ip核进行多次例化使用,通过assign s_axis_config_tdata=1/0设置fft或ifft模式 首先为FFT/IFFT核的设置,第一个页面Number of Channels表示输入通道个数,Transform ...
  • Xilinx公司在Vivado开发工具中提供了FFT/IFFT的 IP核,供开发人员很方便的调用和使用,因此,本文主要对Vivado中的Xilinx FFT/IFFT IP核使用流程展开详细介绍。 1、FFT/IFFT IP核的创建 在使用FFT/IFFT IP核之前...
  • Xilinx快速傅立叶变换(FFT IP)内核实现了Cooley-Tukey FFT算法,这是一种计算有效的方法,用于计算离散傅立叶变换(DFT) IP核引脚及功能概览 a 信号 [时钟] 引脚 I/O 功能 aclk I 时钟信号 aresetn I...
  • vivado FFT IP模块datasheet

    2017-10-07 16:15:35
    fft技术文档;详细介绍FFT模块的端口以及一些功能等;
  • 持续一个时钟 event_fft_overflow 当变换结果溢出时,持续每个时钟,仅当使用了缩放算法时才有此端口 event_status_channel_halt 当ip核需要输出状态信息时,输出缓冲器却满了的时候,此时ip核的所有活动都会停止...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 334
精华内容 133
关键字:

ip核vivado的fft