VIVADO FFT IP核输出频谱数据杂乱

img

module fft(
input clk,
input reset,
input [13:0]ch1,
output [15:0]index,
output reg signed[58:0]abs
);
//声明变量
reg  s_data_tvalid = 1'b0;
reg  [13:0]s_data_tdata = 14'd0;
reg  s_data_tlast = 1'b0;
reg [12:0]count = 12'd0;
always@(posedge clk or negedge reset)
begin
    if(!reset)begin
    s_data_tvalid<=1'b0;
    s_data_tdata<=32'd0;
    s_data_tlast<=1'b0;
    count<=8'd0;
    end
    else if (s_data_tready)begin
        if(count==2047)begin
           s_data_tvalid<=1'b1;
           s_data_tlast<=1'b1;
           s_data_tdata<=ch1;
           count<=0;     
         end
         else begin
           s_data_tvalid=1'b1;
           s_data_tlast<=1'b0;
           s_data_tdata<=ch1;
           count<=count+1;
         end
    end
    else begin
    s_data_tvalid<=1'b0;
    s_data_tlast<=1'b0;
  end
end
reg [31:0]fft_i;
reg [31:0]fft_m;
wire [63:0]m_data_tdata;
always @(posedge clk)begin
  if(m_data_tvalid) begin
    fft_i<=m_data_tdata[31:0];
    fft_m<=m_data_tdata[63:32];    
  end
end
always @(posedge clk)begin
    abs<=fft_i * fft_i + fft_m * fft_m;
end
FFT u1(
  .aclk(clk),                                            // 时钟信号(input)
  .aresetn(reset),                                       // 复位信号,低有效(input)
  .s_axis_config_tdata(8'd1),                            // ip核设置参数内容,为1时做FFT运算,为0时做IFFT运算(input)
  .s_axis_config_tvalid(1'b1),                           // ip核配置输入有效,可直接设置为1(input)
  .s_axis_config_tready(s_config_tready),                // output wire s_axis_config_tready
  
  .s_axis_data_tdata({s_data_tdata,18'b0}),               // 把时域信号往FFT IP核传输的数据通道,[31:16]为虚部,[15:0]为实部(input,主->从)
  .s_axis_data_tvalid(s_data_tvalid),                    // 表示主设备正在驱动一个有效的传输(input,主->从)
  .s_axis_data_tready(s_data_tready),                    // 表示从设备已经准备好接收一次数据传输(output,从->主),当tvalid和tready同时为高时,启动数据传输
  .s_axis_data_tlast(s_data_tlast),                      // 主设备向从设备发送传输结束信号(input,主->从,拉高为结束)
  
  .m_axis_data_tdata(m_data_tdata),                      // FFT输出的频谱数据,[63:32]对应的是虚部数据,[31:0]对应的是实部数据(output,主->从)。
  .m_axis_data_tuser(index),                             // 输出频谱的索引[15:0](output,主->从),该值*fs/N即为对应频点;
  .m_axis_data_tvalid(m_data_tvalid),                    // 表示主设备正在驱动一个有效的传输(output,主->从)
  .m_axis_data_tready(1'b1),                             // 表示从设备已经准备好接收一次数据传输(input,从->主),当tvalid和tready同时为高时,启动数据传输
  .m_axis_data_tlast(m_data_tlast),                      // 主设备向从设备发送传输结束信号(output,主->从,拉高为结束)
  
  .event_frame_started(),                  // output wire event_frame_started
  .event_tlast_unexpected(),            // output wire event_tlast_unexpected
  .event_tlast_missing(),                  // output wire event_tlast_missing
  .event_status_channel_halt(),      // output wire event_status_channel_halt
  .event_data_in_channel_halt(),    // output wire event_data_in_channel_halt
  .event_data_out_channel_halt()  // output wire event_data_out_channel_halt
);  
endmodule