The fft_rows
and fft_cols
functions are similar in structure except for the configured FFT point and loop bounds for data reading and writing. As detailed in the following example, fft_rows
reads the data, performs FFT, and writes out the data (directionStub=1/0
means FFT/IFFT
, and ovfloStub
is returned when FFT is done and indicates whether overflow has happened):
void fft_rows(
hls::stream<qdma_axis<128, 0, 0, 0>> &strm_inp,
hls::stream<qdma_axis<128, 0, 0, 0>> &strm_out
)
{
LOOP_FFT_ROWS:for(int i = 0; i < MAT_ROWS; ++i) {
#pragma HLS DATAFLOW
#pragma HLS loop_tripcount min=32 max=1024
#if FFT_2D_DT == 0 // cint16 datatype
cmpxDataIn in[MAT_COLS];
#pragma HLS STREAM variable=in depth=1024
//#pragma HLS ARRAY_RESHAPE variable=in cyclic factor=4 dim=1
cmpxDataOut out[MAT_COLS];
#pragma HLS STREAM variable=out depth=1024
//#pragma HLS ARRAY_RESHAPE variable=out cyclic factor=4 dim=1
#else // cfloat datatype
cmpxDataIn in[MAT_COLS] __attribute__((no_ctor));
#pragma HLS STREAM variable=in depth=512
//#pragma HLS ARRAY_RESHAPE variable=in cyclic factor=2 dim=1
cmpxDataOut out[MAT_COLS] __attribute__((no_ctor));
#pragma HLS STREAM variable=out depth=512
//#pragma HLS ARRAY_RESHAPE variable=out cyclic factor=2 dim=1
#endif
bool directionStub = 1;
#if FFT_2D_DT == 0 // cint16 datatype
bool ovfloStub;
#endif
readIn_row(strm_inp, in);
#if FFT_2D_DT == 0 // cint16 datatype
fftRow(directionStub, in, out, &ovfloStub);
#else // cfloat datatype
fftRow(directionStub, in, out);
#endif
writeOut_row(strm_out, out);
}