明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 420242|回复: 8

vivado的fft核连续输出

[复制链接]

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 2019-10-17 11:23:12 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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



QQ图片20191017112244.png

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 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 [7:0] fft_real;
wire [7:0] fft_imag;
  reg [5:0] addr;
reg [7:0] cfg_cnt;
wire [7:0] dout;
parameter MCNT = 120;
  parameter MCNT1 = 7;
reg  s_axis_config_tdata=8'd1;
reg s_axis_config_tvalid=0;
wire s_axis_config_tready;
wire [15 : 0] s_axis_data_tdata;
reg [7 : 0]sink_ctl_cnt;
reg s_axis_data_tvalid=0;
wire s_axis_data_tready;
reg s_axis_data_tlast=0;
wire [31 : 0] m_axis_data_tdata;
wire [7 : 0] 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
assign  data_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[11:0];

assign fft_imag = m_axis_data_tdata[27:16];       
       
endmodule

0

主题

15

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2019-10-17 19:30:33 | 显示全部楼层
问题描述的不清楚,哪个地方错误了请标出来,正确的应该是什么样的?输入是否有问题?

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-10-17 23:23:11 | 显示全部楼层
wudiheidawang 发表于 2019-10-17 19:30
问题描述的不清楚,哪个地方错误了请标出来,正确的应该是什么样的?输入是否有问题?

你好非常感谢你,首先我想实现fft核连续的读入数据,然后将结果连续的输出。

整体波形中,红色圈1表示正确的八位结果输出,红色圈2表示第二帧错误输出,

整体波形中,红色圈1表示正确的八位结果输出,红色圈2表示第二帧错误输出,
,整体波形图中,红色圈1表示正确的八位结果输出,红色圈2表示第二帧错误输出,放大后的正确输出为 正确.png ,放大后的错误输出为 错误.png ,同时错误输出前出现其他数据!

0

主题

15

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2019-10-20 10:45:30 | 显示全部楼层
我认为你应该检查一下fft接口的时序是否正确,输出肯定是输入得到的,在你不想他出现输出的地方出现了输出,那就是这个时刻fft接口的一些信号条件满足了,你应该检查的是这些

0

主题

28

帖子

374

积分

中级会员

Rank: 3Rank: 3

积分
374
发表于 2019-10-20 11:12:47 | 显示全部楼层
同意楼上观点。
你应该检查FFT输入的时序,确保要正确。
一般认为奇怪的现象,就是粗心大意了

1

主题

5

帖子

30

积分

新手上路

Rank: 1

积分
30
 楼主| 发表于 2019-11-8 13:11:39 | 显示全部楼层

好的,已解决,谢谢

0

主题

1

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2021-7-3 14:21:29 | 显示全部楼层
程序方便看看吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-11-22 23:31 , Processed in 0.059723 second(s), 23 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表