# Real-sampled Wideband FFT¶

Block: Real-sampled Wideband FFT (`fft_wideband_real`)
Block Author: Aaron Parsons
Document Author: Aaron Parsons
 Contents

## Summary¶

Computes the real-sampled Fast Fourier Transform using the standard Hermitian conjugation trick to use a complex core to transform a single real stream using half the normal resources (this requires at least 4 time samples in parallel). Only positive frequencies are output (negative frequencies are the mirror images of their positive counterparts), so there the number of output ports is half the number of input ports. Uses a biplex FFT architecture under the hood which has been extended to handle time samples in parallel. Data is output in normal frequency order, meaning that channel 0 (corresponding to DC) is output first, followed by channel 1, on up to channel 2N − 1 − 1.

Parameter Variable Description Recommended Value
Number simultaneous streams n_streams The number of input data streams to be processed in parallel. Each stream consists of a set of parallel inputs set by another parameter (see Number of Simultaneous Inputs)
Size of FFT: (2^?) FFTSize The number of channels computed in the complex FFT core. The number of channels output for each real stream is half of this.
Input Bit Width input_bit_width The number of bits in each real and imaginary sample as they are carried through the FFT. Each FFT stage will round numbers back down to this number of bits after performing a butterfly computation if bit growth is not enabled. To make optimal use of BRAM => 18 For low FFT noise => 25
Input binary point bin_pt The position of the binary point in the input data.
Coefficient Bit Width coeff_bit_width The number of bits used in the real and imaginary part of the twiddle factors at each stage. 18
Number of Simultaneous Inputs: (2^?) n_inputs The number of parallel time samples which are presented to the FFT core each clock. This must be at least 22. The number of output ports is half of this value.
Unscramble output (ie, put channels in canonical order) unscramble The FFT inherently produces data in an order that requires unscrambling before being used by many algorithms. This requires resources and can limit performance and so should be disabled if not necessary.
Asynchronous operation async Whether valid data is input on every clock cycle or is flagged via the en input port.
Quantization Behavior quantization Specifies the rounding behavior used at the end of each twiddle and butterfly computation to return to the number of bits specified above. NOT Truncate.
Overflow Behavior overflow Indicates the behavior of the FFT core when the value of a sample exceeds what can be expressed in the specified bit width. Wrap as Saturate will not make overflow corruption better behaved.
Mult Latency mult_latency Latency through multipliers in the FFT. 2
BRAM Latency bram_latency Latency through BRAM in the FFT. 2 For designs aimed at > 200MHz => 3
Convert Latency conv_latency Latency through blocks used to reduce bit widths after twiddle and butterfly stages. 1 For designs aimed at > 180Mhz => 2
Number bits above which to store stage’s coefficients in BRAM (2^? bits) coeffs_bit_limit Determines the threshold at which the twiddle coefficients in a stage are stored in BRAM. Below this threshold distributed RAM is used. 8 (ensures at least 2^8=256 bits out of 18432 bits of BRAM used)
Number bits above which to implement stage’s delays in BRAM (2^? bits) delays_bit_limit Determines the threshold at which data delays in a stage are stored in BRAM. Below this threshold distributed RAM is used. 8 (ensures at least 2^8=256 bits out of 18432 bits of BRAM used)
BRAM sharing in coeff storage coeff_sharing Real and imaginary components of twiddle factors can be generated from the same set of coefficients, reducing BRAM use at the cost of some logic.
Store a fraction of coeff factors where useful coeff_decimation The full set of twiddle factors can be generated from a smaller set, reducing BRAM use at the cost of the some logic.
Generate coeffs with multipliers where useful coeff_generation Generate twiddle factors in the internal fft_direct block using an oscillator with feedback. To reduce BRAM usage => on. To reduce multiplier usage => off
Number calibration locations when generating coeffs (2^?) cal_bits When generating twiddle factors with an oscillator with feedback, reference values are used to calibrate the complex exponential generated. For low BRAM usage => 1. For high quality twiddle factors => 9.
Feedback rotation vector resolution n_bits_rotation When generating the twiddle factors, the resolution of the vector determines how much error accumulates. For low error => 25. For low BRAM usage => 18.
Maximum fanout max_fanout The maximum fanout the twiddle factors are allowed to experience between where they are generated and when they are multiplied with the data stream. As the coefficients are shared, large fanout can occur which can affect maximum timing achievable. Decreasing the maximum fanout allowed should increase possible performance at the expense of some logic.
Multiplier specification (0=core, 1=embedded, 2=behavioural) (left=1st stage) mult_spec Array of values allowing exact specification of how multipliers are implemented at each stage. 2 (behavioral HDL) for each stage
Bit growth instead of shifting bit_growth Bit growth at every stage in the FFT can result in overflows which affect data quality. This can be prevented by dividing the data by two on the output of every stage, or by increasing the number of bits in the data stream by one bit. Shifting decreases the dynamic range and possible data quality whereas bit growth increases the resource requirements.
Max bits to growth to max_bits The maximum number of bits to increase the data path to when the bit growth option is chosen. Shifting is used for FFT stages after this.
Hardcode shift schedule hardcode_shifts When shifting to prevent overflow, use a fixed shifting schedule. This uses less logic and increases performance when compared to using a dynamic shift schedule.
Shift schedule shift_schedule When using a fixed shift schedule, use the shift schedule specified. A ‘1’ at position M in the array indicates a shift for the M’th FFT stage, a ‘0’ indicates no shift.
DSP48 adders in butterfly dsp48_adders The butterfly operation at each stage consists of two adders and two subtracters that can be implemented using DSP48 units instead of logic. on (enabled) to reduce logic used.

## Ports¶

Port Dir Data Type Description Recommended Use
sync in Boolean sync is used to indicate the last data word of a frame of input data. When the block is in asynchronous operating mode an active signal is aligned with en being active. When the block is in synchronous operating mode, a an active pulse is aligned with the clock cycle before the first valid data of a new input frame. Ensure the sync period complies with the memo describing correct use.
shift in Unsigned Sets the shifting schedule through the FFT to prevent overflow. Bit 0 specifies the behavior of stage 0, bit 1 of stage 1, and so on. If a stage is set to shift (with bit = 1), then every sample is divided by 2 at the output of that stage.
in<stream><inp ut> in Signed consisting of one (Input Bit Width) width signals per input. The time-domain stream(s) to be channelised. Data amplitude should not exceed 0.5 (divide data by 2 pre-FFT)
en in Boolean When asynchronous operation is chosen, this port indicates that valid input data is available on all input data ports.
sync_out out Boolean Indicates that data out will be valid next clock cycle.
out<stream><in put> out Inherited The frequency channels.
of out Unsigned, one bit per input stream Indication of internal arithmetic overflow. Not time aligned with data. The most significant bit is the flag for input stream 0 etc.

## Description¶

Computes the real-sampled Fast Fourier Transform using the standard Hermitian conjugation trick to use a complex core to transform a single real stream using half the normal resources (this requires at least 4 time samples in parallel). Only positive frequencies are output (negative frequencies are the mirror images of their positive counterparts), so there the number of output ports is half the number of input ports. Uses a biplex FFT architecture under the hood which has been extended to handled time samples in parallel. Data is output in normal frequency order, meaning that channel 0 (corresponding to DC) is output first, followed by channel 1, on up to channel 2N − 1 − 1.