
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