zoukankan      html  css  js  c++  java
  • Xilinx FFT IP v9.0 使用(一)

     reference:https://blog.csdn.net/shichaog/article/details/51189711

    https://blog.csdn.net/qq_36375505/article/details/81742680 (推荐)

    https://blog.csdn.net/lovewdmcwieg/article/details/79235229

    https://blog.csdn.net/FPGADesigner/article/details/80694673

    该ip用于实现N=2**m(m=3~16)点FFT的变换,

    *实现的数学类型包括:

    A)      定点全精度

    B)      定点缩减位宽

    C)      块浮点

    每一级蝶型运算后舍入或者取整。对于N点运算,FFT还是逆FFT,scaling策略以及循环前缀的长度是运行时可配置的,可随帧改变,改变变换点数会复位FFT ip核

     *有四种可选择的FFT的实现架构:

    1)  PipelinedStreaming I/O

    2)  Radix-4Burst I/O

    3)  Radix-2Burst I/O

    4) Radix-2 Lite Burst I/O

    FFT ip核使用基二和基四分解法计算离散傅里叶变换 ; 对于Burst I/O architectures采用时域抽取法实现,对于Pipelined Streaming I/Oarchitecture.使用频域抽取法。当使用基四计算时,其蝶型算法的级数是log 4 (N),每一级包括N/4的基四蝶型运算。对于点数不是4的指数情况,则需要一个额外的基二来组合数据。类似的基二实现法需要log 2 (N)级蝶型运算。对于scaling方法,其每一级的scaling因子由s_axis_config_tdata来配置。Ip核的端口如下:

     

    输入输出方向在上图中已经很明显了,下面描述端口作用


    名称 方向 可选择性 描述

    aclk                           

    I                    NO                         上升时钟沿采样                                                                                        

    aclken

    I     yes

    高有效,时钟使能                   

    aresetn

    I yes

    同步低有效复位,至少需要保持两个低有效周期;

    s_axis_config_tvalid        

    I NO

    参数配置通道,config数据有效标志

    s_axis_config_tready

    O NO

    参数配置通道,高状态下,config才可以再次配置

    s_axis_config_tdata

    I NO

    参数配置通道,包括了配置信息:CP_LEN,FWD/INV,NFFT 和SCALE_SCH

    s_axis_data_tvalid

    I NO

    数据输入通道,数据有效标志

    s_axis_data_tready

    O NO

    数据输入通道,状态准备标志

    s_axis_data_tdata

    I NO

    数据输入通道,数据输入;包括未处理数据:XN_RE/XN_IM

    s_axis_data_tlast

    I NO

    数据输入通道,外部主设备在帧的最后一个样本上断言。 除了生成事件event_tlast_unexpected和event_tlast_missing事件之外,核心不使用它

    m_axis_data_tvalid

    O NO

    数据输出通道,标志输出数据的有效性

    m_axis_data_tready

    I NO

    数据输出通道,接受外部从设备断言,表示已准备好接受数据。 仅存在于非实时模式中。

    m_axis_data_tdata

    O NO

    数据输出通道,包含处理后的数据:XK_RE/XK_IM

    m_axis_data_tuser

    O NO

    数据输出通道,携带额外的每个采样信息,例如XK_INDEX,OVFLO和BLK_EXP

    m_axis_data_tlast

    O NO

    数据输出通道,内核在帧的最后一个采样上断言。

    m_axis_status_tvalid

    O NO

    状态输出通道,提供状态有效的断言

    m_axis_status_tready

    I NO

    状态输出通道,外部slave断言是否准备好接收状态数据。仅存在与非实时模式中。

    m_axis_status_tdata

    O NO

    状态输出通道,包含了状态数据BLK_EXP/OVFLO

    event_frame_started

    O NO

    事件状态通道,当内核开始处理一个新帧时,内核产生断言

    event_tlast_unexpected

    O NO

    事件状态通道,当内核发现在非帧的最后一个采样时,出现了s_axis_data_tlast拉高,内核将产生断言

    event_tlast_missing

    O NO

    事件状态通道,当在帧最后一个采样时,s_axis_data_tlast没有被拉高,内核将产生断言

    event_fft_overflow

    O NO

    事件状态通道,在数据输出通道卸载的数据样本中看到溢出时置位。 仅在溢出是有效选项时出现。

    event_data_in_channel_halt 

    O NO

    事件状态通道,在内核需要数据时,数据输入数据无效,内核产生断言

    event_data_out_channel_halt  

    O NO

    事件状态通道,在内核向外写数据时,出现不能写出时,内核出现断言。仅出现在非实时模式下。

    event_status_channel_halt

    O NO

    事件状态通道,在内核向外写状态时,出现不能写出时,内核出现断言。仅出现在非实时模式下。

     

     

     

    上面信号所有s开始的表示的是axi信号的slave端,m是master端。各信号更详细作用参考: pg109 -Fast Fourier Transform v9.0 LogiCORE IP Product Guide.pdf

    以8点FFT示意,configure

    implementtation

    summary

    由于xilinx自带的testbench是VHDL的,这里给出自己写的verilog版本的testbench。

    `timescale 1ns / 1ps
     
     
    module TB_fft256;
     
    // Inputs
    reg aclk;
    reg s_axis_config_tvalid;
    reg s_axis_data_tvalid;
    reg s_axis_data_tlast;
    reg m_axis_data_tready;
    reg [15:0] s_axis_config_tdata;
    reg [95: 0] s_axis_data_tdata;
    
    // Outputs
    wire s_axis_config_tready;
    wire s_axis_data_tready;
    wire m_axis_data_tvalid;
    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;
    wire [95 : 0] m_axis_data_tdata;
     
    reg[23:0] mem0_re[0:7];
    reg[23:0] mem1_re[0:7];
    reg[23:0] mem2_re[0:7];
    initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus0_24bit.dat",mem0_re);
    initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus1_24bit.dat",mem1_re);
    initial $readmemh("/home/gsc/FPGA_exercise/bf_verilog/stimulus2_24bit.dat",mem2_re);
     
     
    
    reg[7:0] op_sample= 0;
    reg      op_sample_first = 1;
    reg[7:0] ip_frame=0;
    reg[7:0] op_frame=0;
    
    integer i;
    // generate clk
    always #5 aclk =! aclk;
     
    // Instantiate the Unit Under Test (UUT)
     
    xfft_256 uut (
    .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 [95 : 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 [95 : 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
    );
     
     
     
    initial begin
     
    // Initialize Inputs
     
    aclk = 0;
    s_axis_config_tvalid = 0;
    s_axis_config_tdata = 0;
    s_axis_data_tvalid = 0;
    s_axis_data_tdata = 0;
    s_axis_data_tlast = 0;
    m_axis_data_tready = 0;
     
    // Wait 100 ns for global reset to finish
     
    #150;
    m_axis_data_tready = 1;
    s_axis_config_tvalid = 1;
    //s_axis_config_tdata = 16'b0101100101011011; // FFT desired (and not IFFT
    s_axis_config_tdata = 16'b0000000000000111; // FFT desired (and not IFFT
     
    //s_axis_data_tlast = 1;
    s_axis_data_tdata = 96'h000000;
    s_axis_data_tvalid = 0;
     
    
     
    begin
      for(i=0;i<8;i=i+1)
        begin
          #10
          s_axis_data_tvalid <= 1;
          s_axis_data_tdata <= {{24'h000000},mem1_re[i],{24'h000000},mem0_re[i]};
          $display("mem_a[%d] = %h", i, mem0_re[i]);
          //    if(i== 256)
          //    s_axis_data_tlast <= 1;
          //    else
          //    s_axis_data_tlast <= 0;
        end
     
    end
    #10; s_axis_data_tdata = 96'h000000; s_axis_data_tvalid = 0; #1000 $finish; //$stop end endmodule
    stimulus0_24bit.dat文件内容如下:
    000000
    000001
    000002
    000003
    000004
    000005
    000006
    000007
    stimulus1_24bit.dat文件内容随便,这里是两个通道的FFT计算。仿真波形图如下:

    MATLAB计算所得的FFT结果如下:

    将FFT结果的放大后得到如下图:

    MATLAB计算的结果是28,而fpga仿真结果是0x00000e为14,0xfffffe为-2;这是因为设置了scaling因子,且scaling因子是2,即28/2=14。

    关于hls的实现见:

    http://blog.csdn.net/shichaog/article/details/50811449

  • 相关阅读:
    vim快速查找
    一次特别二不兮兮的WebStorm经历
    让docker容器使用主机系统时间(挂入/etc/localtime)
    systemd:在service文件中给Exec传入多个参数
    mongodb数据迁移
    明日边缘;逃出克隆岛
    [C++] 类的所有对象实例共享静态类成员变量
    HTTP长连接
    fqPkzJetPK
    何时使用move
  • 原文地址:https://www.cnblogs.com/limanjihe/p/9999526.html
Copyright © 2011-2022 走看看