12-02-2019 08:05 AM
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?
12-02-2019 09:41 AM
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[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,
12-02-2019 11:54 AM
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.
12-02-2019 01:24 PM
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 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,
12-02-2019 02:12 PM
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...