1149853345 发表于 2019-10-17 11:23:12

vivado的fft核连续输出

请教一下,在使用vivado的fft核时,第一次和第二次得到的数据正确,后面的数据就出错了,如何解决呢??fft_real,和fft_imag为输出的实部与虚部



1149853345 发表于 2019-10-17 13:14:06

`timescale 1ns / 1ps
`define sys_clk 20
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2019/10/11 08:34:25
// Design Name:
// Module Name: Time difference location_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////


module Time_difference_location_tb;


reg aclk;
reg aresetn;
reg cnt_en=0;
wire fft_real;
wire fft_imag;
reg addr;
reg cfg_cnt;
wire dout;
parameter MCNT = 120;
parameter MCNT1 = 7;
regs_axis_config_tdata=8'd1;
reg s_axis_config_tvalid=0;
wire s_axis_config_tready;
wire s_axis_data_tdata;
reg sink_ctl_cnt;
reg s_axis_data_tvalid=0;
wire s_axis_data_tready;
reg s_axis_data_tlast=0;
wire m_axis_data_tdata;
wire m_axis_data_tuser;
wire m_axis_data_tvalid;
reg m_axis_data_tready=1;
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;

ip_rom rom0(
   .a(addr),
   .clk(aclk),
   .spo(dout)
   );




xfft_0 fft0(
.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_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_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(m_axis_data_tready),
.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)
);

   initial aclk=1;
always#(`sys_clk/2)aclk=~aclk;

initial
    begin
   
      aresetn = 0;//低有效
      #(`sys_clk*3) aresetn = 1;
               
    end
       
       

// always@(posedge aclk or negedge aresetn)
// if(!aresetn)
// cfg_cnt<=8'd0;
// else if(m_axis_data_tlast)
// cfg_cnt<=8'd0;
// else
// cfg_cnt<=cfg_cnt+1'b1;


// always@(posedge aclk or negedge aresetn)
// if(!aresetn)
// addr=6'd0;
// else if((cfg_cnt<8'd10)&&(cfg_cnt>8'd2))
// addr=addr+1'b1;
// else
// addr=6'd0;
// / //s_axis_config_tvalid驱动
always@(posedge aclk )
begin
if(s_axis_config_tready)
s_axis_config_tvalid<=1'b1;
else
s_axis_config_tvalid<=1'b0;

end
// // assign s_axis_config_tdata = 8'd1;

//............上升沿捕捉。。。。。。。。。。。。。。。。//
wire    data_tready_pose;   //tready信号上升沿
reg   data_tready_r0 = 0;
reg   data_tready_r1 = 0;
always @(posedge aclk) begin
    data_tready_r0 <= s_axis_data_tready;
    data_tready_r1 <= data_tready_r0;
end
assigndata_tready_pose = data_tready_r0 & ~data_tready_r1;

//--------------------设置tvalid信号------------------------//
always @(posedge aclk) begin
    if(data_tready_pose == 1) begin   
      s_axis_data_tvalid <= 1;      //检测到上升沿,信号拉高,数据有效
    end
    else    begin
      s_axis_data_tvalid <= s_axis_data_tvalid;
    end
end

//---------------检测到上升沿,计数器开始工作----------------//
always @(posedge aclk) begin
    if(data_tready_pose == 1)   begin
      cnt_en <= 1;
    end
    else if(addr == 6'd6) begin      /*需要改动*/
      cnt_en <= 0;
    end
end


always @(posedge aclk) begin
    if(cnt_en == 1) begin
      addr <= addr + 1;
    end
    else    begin
      addr <= 0;
    end
end

//----------------------设置tlast信号-----------------------//
always @(posedge aclk) begin
    if(addr == 6'd6)begin      /*需要改动*/
      s_axis_data_tlast <= 1;   //输入最后一个数据时,tlast信号产生一个脉冲
    end
    else    begin
      s_axis_data_tlast <= 0;
    end
end
assign s_axis_data_tdata=dout;
// always@(posedge aclk or negedge aresetn)
// begin
// if(!aresetn)
// s_axis_data_tdata <=16'd0;
// else if(s_axis_data_tready)
// s_axis_data_tdata<=dout;
// end

// always@(posedge aclk or negedge aresetn)
// begin
// if(!aresetn)
// m_axis_data_tready <=1'd0;
// else
// m_axis_data_tready<=1'b1;
// end

// always@(posedge aclk or negedge aresetn)
    // begin
      // if(!aresetn)
            // sink_ctl_cnt <= 8'd0;
      // else if(addr==8'd0)
            // sink_ctl_cnt <= 8'd0;
      // else if(sink_ctl_cnt == 8'd7)
            // sink_ctl_cnt <= 8'd0;
      // 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<8'd8&&cfg_cnt<8'd9)
                // else if(cfg_cnt<8'd12)
            // 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(addr == 8'd7)
                // s_axis_data_tlast <= 1'b1;
            // else
                // s_axis_data_tlast <= 1'b0;
      // end
    // end
assign fft_real = m_axis_data_tdata;

assign fft_imag = m_axis_data_tdata;       
       
endmodule

wudiheidawang 发表于 2019-10-17 19:30:33

问题描述的不清楚,哪个地方错误了请标出来,正确的应该是什么样的?输入是否有问题?

1149853345 发表于 2019-10-17 23:23:11

wudiheidawang 发表于 2019-10-17 19:30
问题描述的不清楚,哪个地方错误了请标出来,正确的应该是什么样的?输入是否有问题?

你好非常感谢你,首先我想实现fft核连续的读入数据,然后将结果连续的输出。,整体波形图中,红色圈1表示正确的八位结果输出,红色圈2表示第二帧错误输出,放大后的正确输出为,放大后的错误输出为,同时错误输出前出现其他数据!

wudiheidawang 发表于 2019-10-20 10:45:30

我认为你应该检查一下fft接口的时序是否正确,输出肯定是输入得到的,在你不想他出现输出的地方出现了输出,那就是这个时刻fft接口的一些信号条件满足了,你应该检查的是这些

panwenming 发表于 2019-10-20 11:12:47

同意楼上观点。
你应该检查FFT输入的时序,确保要正确。
一般认为奇怪的现象,就是粗心大意了

1149853345 发表于 2019-11-8 13:11:39

wudiheidawang 发表于 2019-10-20 10:45


好的,已解决,谢谢

FPGAer 发表于 2021-7-3 14:21:29

程序方便看看吗
页: [1]
查看完整版本: vivado的fft核连续输出