Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度

Vivado中FFT9.1 IP核的使用(1)中已经介绍了最简单的FFT操作方式:即固定变换长度,仅仅控制少量控制信号:

      s_axis_config_tdata              // input,配置数据
      s_axis_config_tvalid               // input,配置数据有效信号

      s_axis_data_tdata                     // input ,输入数据
      s_axis_data_tvalid                    // input ,输入数据有效信号
      s_axis_data_tlast                      // input ,输入数据结束信号

在此基础上,这一部分对在线变换长度进行测试:

1、FFT核配置

配置FFT核时应注意,选定在线更改点数选项

如下:

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第1张图片

其余配置不变,配置结束查看配置情况:

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第2张图片                 Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第3张图片

可以看出,此时变换长度最小为8,最大为设置的32点;意味着变换长度在8-16-32之间可以在线设置。

s_axis_config_tdata长度也改变了,考虑到PAD扩展,一共24位,各位对应的配置项如上图Implementation details所示;

2、测试文件编写

32点变换测试:

主要应修改s_axis_config_tdata的配置,由Implementation details可以看出s_axis_config_tdata的配置情况:

s_axis_config_tdata[4:0] 为 NFFT,32点时NFFT=00101

s_axis_config_tdata[7:5] 为 PAD补零PAD=000

s_axis_config_tdata[8:8] 为 FWD_INV_0(通道0正反FFT变换选择),正变换时FWD_INV_0=1

s_axis_config_tdata[18:9] 为 SCALE_SCH_0(通道0缩放策略选择),取SCALE_SCH_0=0000000000(不缩放)

s_axis_config_tdata[24:19] 为 PAD补零PAD=000000

综上,配置数据为:s_axis_config_tdata = 000000_0000000000_1_000_00101

测试文件:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////


module fft_tsb(

    );
    reg aclk;                        
    reg [23 : 0] s_axis_config_tdata;
    reg         s_axis_config_tvalid;        
    wire        s_axis_config_tready;       
    wire [31 : 0] s_axis_data_tdata;  
    reg         s_axis_data_tvalid;          
    wire        s_axis_data_tready;         
    reg         s_axis_data_tlast;           
    wire [31 : 0] m_axis_data_tdata;
    wire        m_axis_data_tvalid;         
    reg         m_axis_data_tready;  
    wire        m_axis_data_tlast;
    reg [15:0] real_data;
    reg [15:0] imag_data;
    wire [15:0] real_dataout;
    wire [15:0] imag_dataout;
    reg [9:0]  cnt;
    assign s_axis_data_tdata={real_data,imag_data};
    assign real_dataout = m_axis_data_tdata[31:16];
    assign imag_dataout = m_axis_data_tdata[15:0];
    initial begin
      aclk = 0;
      s_axis_config_tdata=24'b0;
      s_axis_config_tvalid=1'b0;
      s_axis_data_tvalid=1'b0;
      s_axis_data_tlast=1'b0;
      real_data=16'd0;
      imag_data=16'd0;
      cnt = 0;
      m_axis_data_tready=1'b1;
      #1000;
      s_axis_config_tdata=24'b00000000_00000001_000_00101;
//      s_axis_config_tdata=24'b00000000_00000001_000_00011;
      s_axis_config_tvalid=1'b1;
      #10;
      s_axis_config_tdata=24'b00000000_00000000_000_00000;
      s_axis_config_tvalid=1'b0;
      #1000;
      repeat(32)begin
        s_axis_data_tvalid=1'b1;
        real_data=real_data+16'd1;
        cnt=cnt+1;
        if(cnt==32) s_axis_data_tlast=1'b1;
        #10;
      end
      s_axis_data_tvalid=1'b0;
      s_axis_data_tlast=1'b0;
      real_data=16'd0;
      #1000;
      $stop;
    end
    always #(5) aclk= ~aclk;
xfft_0 Uxfft(
      .aclk(aclk),                                                // input wire aclk
      .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 [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       
          );
endmodule

仿真结果:

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第4张图片

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第5张图片

8点变换测试:

主要应修改s_axis_config_tdata的配置,由Implementation details可以看出s_axis_config_tdata的配置情况:

s_axis_config_tdata[4:0] 为 NFFT,8点时NFFT=00011

s_axis_config_tdata[7:5] 为 PAD补零PAD=000

s_axis_config_tdata[8:8] 为 FWD_INV_0(通道0正反FFT变换选择),正变换时FWD_INV_0=1

s_axis_config_tdata[18:9] 为 SCALE_SCH_0(通道0缩放策略选择),取SCALE_SCH_0=0000000000(不缩放)

s_axis_config_tdata[24:19] 为 PAD补零PAD=000000

综上,配置数据为:s_axis_config_tdata = 000000_0000000000_1_000_00011

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2020/06/28 21:17:52
// Design Name: 
// Module Name: fft_tsb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module fft_tsb(

    );
    reg aclk;                        
    reg [23 : 0] s_axis_config_tdata;
    reg         s_axis_config_tvalid;        
    wire        s_axis_config_tready;       
    wire [31 : 0] s_axis_data_tdata;  
    reg         s_axis_data_tvalid;          
    wire        s_axis_data_tready;         
    reg         s_axis_data_tlast;           
    wire [31 : 0] m_axis_data_tdata;
    wire        m_axis_data_tvalid;         
    reg         m_axis_data_tready;  
    wire        m_axis_data_tlast;
    reg [15:0] real_data;
    reg [15:0] imag_data;
    wire [15:0] real_dataout;
    wire [15:0] imag_dataout;
    reg [9:0]  cnt;
    assign s_axis_data_tdata={real_data,imag_data};
    assign real_dataout = m_axis_data_tdata[31:16];
    assign imag_dataout = m_axis_data_tdata[15:0];
    initial begin
      aclk = 0;
      s_axis_config_tdata=24'b0;
      s_axis_config_tvalid=1'b0;
      s_axis_data_tvalid=1'b0;
      s_axis_data_tlast=1'b0;
      real_data=16'd0;
      imag_data=16'd0;
      cnt = 0;
      m_axis_data_tready=1'b1;
      #1000;
//      s_axis_config_tdata=24'b00000000_00000001_000_00101;
      s_axis_config_tdata=24'b00000000_00000001_000_00011;
      s_axis_config_tvalid=1'b1;
      #10;
      s_axis_config_tdata=24'b00000000_00000000_000_00000;
      s_axis_config_tvalid=1'b0;
      #1000;
      repeat(8)begin
        s_axis_data_tvalid=1'b1;
        real_data=real_data+16'd1;
        cnt=cnt+1;
        if(cnt==8) s_axis_data_tlast=1'b1;
        #10;
      end
      s_axis_data_tvalid=1'b0;
      s_axis_data_tlast=1'b0;
      real_data=16'd0;
      #1000;
      $stop;
    end
    always #(5) aclk= ~aclk;
xfft_0 Uxfft(
      .aclk(aclk),                                                // input wire aclk
      .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 [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       
          );
endmodule

仿真结果:

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第6张图片

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第7张图片

 

错误测试:

可以看出,上述两次实验IP核按照配置点数正确执行; 现将点数配置为8点FFT,但是输入数据实际为32位(输入32个数据以后s_axis_data_tlast才置数);

Vivado中FFT9.1 IP核的使用(2)——在线修改变换长度_第8张图片

可以看出,此时出现非法s_axis_data_tlast标志;                     

 

你可能感兴趣的:(FPGA项目实战)