**UPGRADE YOUR BROWSER**

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- Community Forums
- :
- Forums
- :
- Software Development and Acceleration
- :
- HLS
- :
- How to call many FFT's?

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

Highlighted
##

marcin

Visitor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 08:05 AM

238 Views

Registered:
09-03-2018

How to call many FFT's?

Dear All,

I'm calling FFT according to tutorials:

1) I'm moving data from input data stream to the input FIFO defined as follows:

cmpxDataIn inComplData[DIM]; //input data

cmpxDataOut outComplData[DIM]; //output data

#pragma HLS interface ap_fifo depth=FFT_LENGTH port=inComplData,outComplData

2) then, I'm using default parameters so I'm calling:

hls::fft<config1>(inComplData, outComplData, &fft_status1, &fft_config1);

_ovflo |= fft_status1.getOvflo() & 0x1;

3) Finally I'm transfering the results from the output FIFO to the output stream.

Everything works without any problems.

But I would like to perform more FFTs from input stream (let's say to receive 2048 samples and perform 16 FFT, for N=128 points each).

How to do it?

Schould I transfer the whole data set to BRAM memory and then from this matrix transfer the data to 16 spearate FIFOs?

But what if I would like to perform 128 FFTs - manually, it's stupid idea...

Moreover, I believe that in pipelined mode it should work without utilizing so much memory...

Could you help me with some ideas?

Kind Regards,

Marcin

5 Replies

archangel-lightworks

Voyager

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 08:09 AM

227 Views

Registered:
07-23-2019

Re: How to call many FFT's?

Is AXI stream splitter what you need?

sorry, I don't quite get what you want to do...

marcin

Visitor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 09:41 AM

197 Views

Registered:
09-03-2018

Re: How to call many FFT's?

Sorry for my week explanation.

I'm receiving 2048 samples in the AXI stream protocol and I want to take the first 128 samples and perform FFT, then following 128 samples and FFT etc. until I perform 16 transformations on the entire received signal (128 samples * 16 FFT = 2048 samples).

Should I split the whole stream (2048 samps) to 16 shorter streams (128 samps) each?

I supposed I can use fft in for loop, but I have problem with arguments. 2D fifo declared:

static cmpxDataIn inComplData[16][DIM];

is not supported by fft ip (it work only for multichannel FFT and up to 8 channels). AXI stream is also not supported.

I believe that the solution is quite obvious but I'm new in HLS and I don't know how to do it, sorry.

Thank you for your help,

Best,

satguy

Explorer

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 11:54 AM

166 Views

Registered:
04-19-2018

Re: How to call many FFT's?

In "normal" vivado you would send the first block to an FFT, the second to a second one, until a block comes when the first FFT engine has finished.So you don't need to deploy 16 FFTs. It saves resources and you get the same speed. Having 16 FFTs and 15 idle is not smart.

Now, how to do that in HLS? From the top of my head, I don't know.... but if it's possible in a block diagram it must be possible in HLs as well.

marcin

Visitor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 01:24 PM

141 Views

Registered:
09-03-2018

Re: How to call many FFT's?

For me it would be more convinient to do it in Vivado HLS, but I tried to do it in the block diagram and I had a problem too. I have sent through the "AXI stream" a vector of 2048 samples (fixed point, 16 bits) to the FFT block (N = 128, pipelined mode) and as I remember I received the only first 128 saples with crrect values.

Generally I can come back to the "normal" Vivado...

You wrote:

> "you would send the first block to an FFT, the second to a second one".

what do you mean "first block"? - 128 samples in my case, am I right?

should I divide the whole vector (single stream) of the 2048 samples into a 16 streams per 128 samples each? Maybe this is the problem - I assumed that if I set in the FFT module "N" to a specific value (here N=128) it will perform FFT one after another as long as data comes in single stream.

And the second part of your sentence, what do you mean "second to a second one", I belive one FFT module on the diagram is enough? Am I right?

Thank you very much,

Best!

satguy

Explorer

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

12-02-2019 02:12 PM

130 Views

Registered:
04-19-2018

Re: How to call many FFT's?

Yes, 1st chunk of data to FFT #1, 2nd chunk to FFT #2, etc. until N-th chunk can go to 1st FFT because it's free (you will have to work out the worst case).

This way you will have the best usage, all FFTs running.

Probably it's good **not to** receive 2048 samples but just 128 every time, so you can start as soon as you have data ready, provided the sequence is always the same and you keep track of what channel each piece of data belongs to.

I haven't tried FFT on HLS yet. FFT IP block does work with continuous data but latency may limit the data rate... if your data comes slowly enough, a FIFO can be all you need and one FFT would be enough. If faster, you need some multiplex-and-parallel scheme.

There must be a way to make HLS to implement a number of calls in parallel...