Xilinx
TM
Block Preview

Introduction

The block reconstructs a continuous real time-domain signal from a stream of $N$-point complex spectra ($R$ bins per clock in, $R$ time samples per clock out, no dead cycles). It is the exact inverse of the FFT TM Realtime block and consumes its output format directly: at cycle $k$ input lane $q$ carries bin $k + q \cdot N/R$.

Internally it runs the polyphase split of the forward block backwards:

$$ u_r[k] = \sum_{q=0}^{R-1} W_R^{-rq}, X[k + q\tfrac{N}{R}] = R, W_N^{rk} X_r[k] $$

The inverse $R$-point sum uses only $\pm 1 / \pm j$ (no multipliers), the conjugate twiddle $W_N^{-rk}$ (16-bit ROM, one complex multiplier per lane) removes the phase term, and $R$ Xilinx xfft cores of $N/R$ points - switched to inverse mode at startup through their configuration channel - transform each branch back to time. Output lane $r$ then carries exactly the time samples $n$ with $n \bmod R = r$: the natural TM order.

Only the real part is emitted. The input spectrum is expected to be conjugate-symmetric ($X[N-b] = X^*[b]$, which is automatic if it was produced by an FFT of a real signal); any residual imaginary part is discarded.

Pin Description

IN_RE Input 16 bit TM
TM input, real parts of the spectrum. Lane q = bin $k + q N/R$ at cycle k (k counted from SPECTRUM_START). Signed, InputBits wide.
Default: Must be connected
IN_IM Input 16 bit TM
TM input, imaginary parts (same mapping as IN_RE).
Default: Must be connected
SPECTRUM_START Input 1 bit BIT
One-cycle pulse on the cycle carrying bin 0. Connect FRAME_START of the FFT TM Realtime block. The first pulse arms the block; no output is produced before it.
Default: Must be connected
CLK Input 1 bit BIT
TM-domain clock.
Default: Default Board Clock
DATA_OUT Output 16 bit TM
TM output, real time-domain signal. Lane r = sample n with $n \bmod R = r$.
DV Output 1 bit BIT
Data valid. After the initial pipeline fill it stays HIGH continuously (gapless operation).
FRAME_START Output 1 bit BIT
One-cycle pulse on the cycle carrying sample 0 of each reconstructed N-sample block.
FRAME_END Output 1 bit BIT
One-cycle pulse on the cycle carrying the last R samples of each block. The next cycle is the FRAME_START of the following block.

Properties

Property window

FFT Length FFTLength

Number of points of the inverse transform (must be power of 2)

Transform length N (64..16384, power of 2). Must match the spectrum source.

Default: 1024

Options: 64 128 256 512 1024 2048 4096 8192 16384

TM Factor (SSR) TMFactor

Time Multiplexing factor (samples per clock). 2 or 4 (multiplier-free recombination).

TM factor R: 2 or 4 only. These factors keep the recombination stage multiplier-free ($W_R^{-rq} \in {\pm 1, \pm j}$).

Default: 4

Options: 2 4

Input Data Bits InputBits

Bit width of each spectrum component RE/IM (8-30 bits, signed)

Spectrum component width RE/IM (8..30, signed).

Default: 16

Options: 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Scaling Mode ScalingMode

No Scaling: full bit growth (InputBits + log2(N) + 1, the output is N*x). Grow to Max: saturated to 27 bits. Scale: output divided by N (true x[n] amplitude), InputBits wide (saturated).

  • Scale (default): output divided by N (round half up) - reconstructs the original amplitude when fed by an unscaled FFT.
  • No Scaling: output = N*x, full bit growth (saturating, capped at 32).
  • Grow to Max: saturated to 27 bits.

Default: Scale

Options: No Scaling Grow to Max Scale

Output Bits OutputBits

Width of DATA_OUT samples (saturating). Auto: InputBits in Scale mode, InputBits+log2(N)+1 otherwise. Set 16 to get back the original 16-bit signal after an unscaled FFT -> IFFT (Scale) chain.

Width of the DATA_OUT samples (saturating). Auto follows the ScalingMode policy (InputBits wide in Scale mode). Set an explicit value - e.g. 16 after an unscaled FFT of a 16-bit signal - to force the output bus width regardless of InputBits.

Default: Auto

Options: Auto 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Chaining with FFT TM Realtime : the round trip

Connect OUT_RE/OUT_IM of the FFT block to IN_RE/IN_IM and its FRAME_START to SPECTRUM_START: the alignment is then automatic. Any frequency-domain processing placed in between (masking, filtering, per-bin gain) must preserve the lane/bin mapping and the conjugate symmetry of the spectrum.

To get back the ORIGINAL bit width (e.g. a 16-bit signal in, 16-bit signal out), configure the pair like this:

Block FFTLength InputBits ScalingMode Output
FFT TM Realtime N 16 No Scaling 16 + log2(N) + 1 bits (27 for N=1024), full precision
IFFT TM Realtime N 16 + log2(N) + 1 (27) Scale + Output Bits = 16 16 bits, original amplitude

The FFT must stay unscaled (dividing the spectrum by N there would quantize the small bins away); the division by N happens once, at the IFFT output, with round-half-up. Verified in simulation (N=1024, R=4, two tones + noise at 2/3 full scale): reconstruction error max 1 LSB, rms 0.43 LSB, 82% of samples bit-exact, ~1270 clocks total latency:

Round trip

SPECTRUM_START tells the block which cycle carries bin 0. The first pulse arms the internal bin counter and the data stream to the xfft cores; after that the counter free-runs with period $N/R$ and each further pulse re-checks the alignment. Nothing is emitted before the first pulse.

Input spectrum and reconstructed output

The figure above is real simulation data ($N=1024$, $R=4$, 16-bit spectrum of two tones + noise, Scale mode): the reconstruction matches the original signal within 1 LSB (rms 0.7 LSB, the rounding floor).

How to read the output

  • DATA_OUT lane $r$ = time sample $n$ with $n \bmod R = r$; reading the lanes 0..R-1 at one DV cycle gives R consecutive samples.
  • FRAME_START pulses on the cycle carrying sample 0 of each reconstructed $N$-sample block, FRAME_END on the cycle carrying the last $R$ samples. One block = $N/R$ clock cycles.
  • DV goes high once the first block emerges and stays high continuously (gapless).

Scope view

Scaling

The raw chain gain is $N$ (unnormalized inverse transform), mirroring the unscaled forward block:

  • Scale (default): output divided by $N$ - if the input is the No Scaling spectrum of a signal $x$, the output is $x$ itself, InputBits wide (saturating).
  • No Scaling: full bit growth, output $= N \cdot x$, InputBits + log2(N) + 1 bits (saturating, capped at 32).
  • Grow to Max: same arithmetic, saturated to 27 bits.

Latency and resources

  • Throughput: R bins in / R samples out every clock, sustained.
  • Latency: dominated by the xfft cores (roughly $2 \cdot N/R$ clocks plus pipeline overhead).
  • Resources: $R$ xfft cores of $N/R$ points, $R-1$ twiddle ROMs ($N/R \times 32$ bit), $R$ complex multipliers, adders for the recombination. Slightly more than the forward block because the xfft input is InputBits + log2(R) + 1 wide.