FPGA Intellectual Property
PCI Express*, Networking and Connectivity, Memory Interfaces, DSP IP, and Video IP
6536 Discussions

Unified FFT giving incorrect output

David32
New Contributor II
518 Views

I have simulated the parallel unified FFT and cannot, in any configuration, get it to output sensible signals. On the other hand, the single, normal, unified FFT simulates correctly.

In an effort to debug this problem:

I configured a PARALLEL Unified FFT as follows:

  • Inverse FFT - No
  • Bit reversed input = Yes
  • Log2Size = 6
  • Log2Wires = 1
  • Serial stages = 0
  • Data = fixed
  • reset = high
  • input width = 8
  • twiddle = 12
  • pruning = full word growth (output width = 15)

Also created a Bit reverse IP which generates the input to both a single and parallel (2 channels) FFT:

  • Complex = No
  • Log2Size = 6
  • Input width= 16

Since the parallel FFT requires two input channels (each real/imag) I concatenate the BR output twice to create the required input.

I can send source code and test bench if desired.

I have consulted the User Guide ug20304-683366-787799.pdf many times and cannot see anything that I am doing incorrectly.

Please help with this.

Labels (1)
0 Kudos
1 Solution
LeoFeng
Employee
212 Views

Hi David,

 

I've consulted Factory about the function of the parallel FFT IP. Actually, a parallel FFT processes a single FFT instance with high data rate channels.

For example, 16 instantiations of a single-wire streaming FFT (FFT IP) will calculate 16 different FFT instances in parallel. This is appropriate if you're processing 16 different channels. A 16-wire parallel FFT(parallel FFT IP)  processes a single FFT instance. This is appropriate if you're processing one very high data rate channel.

 

Back to your question about why you saw multiple peaks in one frame. The reasons are:

1. You have two sine waves in one FFT instance.

2. It's a 2-wrie parallel FFT, the processing cycles should be half of the single FFT, for example, for a 64 points FFT, the frame cycles is 64 for a single wire FFT, but 32 for a 2-wire parallel FFT.

 

Based on above, I modified the input of the parallel FFT(assign d = {8'h0, sine_noise_out1, 8'h0,sine_noise_out1};) to better show the case, and here is what I got:

LeoFeng_0-1733973699171.png

As you can see, the sum0 has 2 times of peaks of sum_single in "one frame". 

 

Please note that what I did above is just to show the function of the parallel FFT based on your design. The parallel FFT should be one FFT instance, which means you should combine sine_noise_out0 and sine_noise_out1 as one input sequence and then pipe it into two channels. The same with the output, you should pipe the 2 channels data into one sequence.

 

Best regards,

Leo Feng

View solution in original post

0 Kudos
7 Replies
LeoFeng
Employee
425 Views

Hi David,

 

This is Leo, I will help you with your issue.

Can I have your source code and test bench? I will have a look at it and do a simulation with it if necessary.

Also please tell me the Quartus version and the devices that you are using now.

Thank you!

 

Best regards,

Leo

0 Kudos
David32
New Contributor II
418 Views

Hi Leo,

I am using:

Quartus Prime 23.4.0 build 79 11/22/2023 SC Pro Edition (Linux)

QuestaSim Intel Starter FPGA Edition-64, Version 2023.3 linux_x86_64

 

The IP, SRC and Testbench is attached.

Thank you,

David

0 Kudos
David32
New Contributor II
362 Views

Hi Leo,

 

Please tell me the status of your simulation.

We need a solution here quite urgently.

Thanks

David

0 Kudos
LeoFeng
Employee
310 Views

Hi David,

 

I've simulated your source codes with the IPs and I understand your concern about the output of the parallel FFT IP. I notice there is a difference between the channel 0 output of the parallel FFT IP and the single FFT IP, which supposed to be the same considering they are with the same input and configurations.

Please allow me more time to further analyze the waveforms and do some experiments accordingly. I will get back to you soon. Thank you for your understanding!

 

Best regards,

Leo Feng

0 Kudos
LeoFeng
Employee
277 Views

Hi David,

 

I furtherly checked your codes and the simulation waveform, it looks fine for me. Can I see your simulation results? Why you are saying that the output is not sensible?

Here I attached the output of both parallel FFT and the single FFT of the simulation that I did.

Notice that the output of parallel FFT and single FFT are not aligned because of the latency difference, but the data seems correct.

LeoFeng_0-1733818631782.png

 

Best regards,

Leo Feng

0 Kudos
David32
New Contributor II
255 Views

Hi Leo,

 

Firstly thanks for taking the time to investigate.

I have attached a screen shot of my simulation and will explain why I still think there is a problem.

The input to the FFT's is a sine wave with small amount of added noise.

I would expect to see two peaks in the output spectrum (double sided output frequency spectrum).

This is exactly what I do see in the single FFT trace.

However, this is what I DO NOT SEE in the outputs from the parallel FFT.

Of course, maybe I am missing something here.

Please tell me what you think.

David

0 Kudos
LeoFeng
Employee
213 Views

Hi David,

 

I've consulted Factory about the function of the parallel FFT IP. Actually, a parallel FFT processes a single FFT instance with high data rate channels.

For example, 16 instantiations of a single-wire streaming FFT (FFT IP) will calculate 16 different FFT instances in parallel. This is appropriate if you're processing 16 different channels. A 16-wire parallel FFT(parallel FFT IP)  processes a single FFT instance. This is appropriate if you're processing one very high data rate channel.

 

Back to your question about why you saw multiple peaks in one frame. The reasons are:

1. You have two sine waves in one FFT instance.

2. It's a 2-wrie parallel FFT, the processing cycles should be half of the single FFT, for example, for a 64 points FFT, the frame cycles is 64 for a single wire FFT, but 32 for a 2-wire parallel FFT.

 

Based on above, I modified the input of the parallel FFT(assign d = {8'h0, sine_noise_out1, 8'h0,sine_noise_out1};) to better show the case, and here is what I got:

LeoFeng_0-1733973699171.png

As you can see, the sum0 has 2 times of peaks of sum_single in "one frame". 

 

Please note that what I did above is just to show the function of the parallel FFT based on your design. The parallel FFT should be one FFT instance, which means you should combine sine_noise_out0 and sine_noise_out1 as one input sequence and then pipe it into two channels. The same with the output, you should pipe the 2 channels data into one sequence.

 

Best regards,

Leo Feng

0 Kudos
Reply