09-27-2019 01:25 AM - edited 09-27-2019 01:32 AM
Hi, I am new to Vivado FFT IP and tried to test FFT/IFFT.
I first send data 1~127(with imaginary part equals zero) to FFT and FFT's output is sent to IFFT's input. If IFFT's output is 1~127, I think FFT/IFFT is working as expected.
The setting is like below. Transform Length is 8, the architecture choice is "Pipelined, Streaming I/O." Input data width and phase factor width is 16 bit. The ordering is natural ordering.
Like I said, I send data 1~127 to FFT IP as below.
I divide the output by 8, and the divided result is 1,1,3,3,5,6,7,8 for the first frame as shown below.
I think the problem is from the fact that I set the scaling schedule as 0000 for both FFT and IFFT like below.
fft_wrapper fft(.aclk_0(aclk), // input
.aresetn_0(aresetn), // input
.event_data_in_channel_halt_0(), // output
.event_data_out_channel_halt_0(), // output
.event_frame_started_0(fft_event_frame_started_0), // output
.event_status_channel_halt_0(), // output
.event_tlast_missing_0(), // output
.event_tlast_unexpected_0(), // output
.m_axis_data_tdata_0(fft_m_axis_data_tdata_0), // output
.m_axis_data_tlast_0(fft_m_axis_data_tlast_0), // output
.m_axis_data_tready_0(fft_m_axis_data_tready_0), // input
.m_axis_data_tvalid_0(fft_m_axis_data_tvalid_0), // output
.s_axis_config_tdata_0(8'b0000_0001), // input, forward fft
.s_axis_config_tready_0(fft_s_axis_config_tready_0), // output
.s_axis_config_tvalid_0(fft_s_axis_config_tvalid_0), // input
.s_axis_data_tdata_0(fft_s_axis_data_tdata_0), // input
.s_axis_data_tlast_0(fft_s_axis_data_tlast_0), // input
.s_axis_data_tready_0(fft_s_axis_data_tready_0), // output
.s_axis_data_tvalid_0(fft_s_axis_data_tvalid_0)); // input
ifft_wrapper ifft(.aclk_0(aclk), // input
.aresetn_0(aresetn), // input
.event_data_in_channel_halt_0(), // output
.event_data_out_channel_halt_0(), // output
.event_frame_started_0(ifft_event_frame_started_0), // output
.event_status_channel_halt_0(), // output
.event_tlast_missing_0(), // output
.event_tlast_unexpected_0(), // output
.m_axis_data_tdata_0(ifft_m_axis_data_tdata_0), // output
.m_axis_data_tlast_0(ifft_m_axis_data_tlast_0), // output
.m_axis_data_tready_0(ifft_m_axis_data_tready_0), // input, always reday
.m_axis_data_tvalid_0(ifft_m_axis_data_tvalid_0), // output
.s_axis_config_tdata_0(8'b0000_0000), // input, inverse fft
.s_axis_config_tready_0(ifft_s_axis_config_tready_0), // output
.s_axis_config_tvalid_0(ifft_s_axis_config_tvalid_0), // input
.s_axis_data_tdata_0(ifft_s_axis_data_tdata_0), // input
.s_axis_data_tlast_0(ifft_s_axis_data_tlast_0), // input
.s_axis_data_tready_0(ifft_s_axis_data_tready_0), // output
.s_axis_data_tvalid_0(ifft_s_axis_data_tvalid_0) // input
);
How can I avoid the data loss? I want the output of IFFT to be nice 1,2,3,4,5,6,7,8, so on.
Thanks in advance!
09-28-2019 04:22 AM
09-28-2019 04:22 AM
09-28-2019 04:24 AM
09-29-2019 06:40 PM
Thanks @hermanfisher1994
For those who are interested, I switched to floating point(following IEEE-754 standard), and the data loss is minimal.