vivado的fft核连续输出
请教一下,在使用vivado的fft核时,第一次和第二次得到的数据正确,后面的数据就出错了,如何解决呢??fft_real,和fft_imag为输出的实部与虚部`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
问题描述的不清楚,哪个地方错误了请标出来,正确的应该是什么样的?输入是否有问题?
你好非常感谢你,首先我想实现fft核连续的读入数据,然后将结果连续的输出。,整体波形图中,红色圈1表示正确的八位结果输出,红色圈2表示第二帧错误输出,放大后的正确输出为,放大后的错误输出为,同时错误输出前出现其他数据! 我认为你应该检查一下fft接口的时序是否正确,输出肯定是输入得到的,在你不想他出现输出的地方出现了输出,那就是这个时刻fft接口的一些信号条件满足了,你应该检查的是这些 同意楼上观点。
你应该检查FFT输入的时序,确保要正确。
一般认为奇怪的现象,就是粗心大意了 wudiheidawang 发表于 2019-10-20 10:45
好的,已解决,谢谢 程序方便看看吗
页:
[1]