fft_64k: overlapped 64K-point FFT/IFFT#
New · AMD UltraScale+
Long FFTs, full overlap, no dropped samples. fft_64k is a run-time configurable FFT/IFFT core that transforms 64 to 65,536 points at a continuous 275 MSPS, with up to 75% frame overlap.
64K points, max length
275 MSPS continuous input
75% maximum frame overlap
Overview#
fft_64k is a high-throughput FFT/IFFT core for AMD UltraScale+ FPGAs. Length, direction, scaling and overlap can all change from frame to frame. Thirty-two radix-2 butterflies work in parallel, so the core keeps up with one complex sample per clock at 275 MHz, including frames that overlap by up to 75%.
The fixed-point datapath carries 12 to 32-bit I/Q (24 by default), with twiddle factors selectable from 16 to 24 bits. There is no processor bus and no registers to program: all settings travel with the frame, so there is no software in the loop and no reconfiguration time between frames. Results come out in natural order, four samples per clock. The core ships with a bit-accurate C and Octave/MATLAB model and a self-checking testbench, so you can predict the hardware output to the bit before you build anything.
Block diagram#
Signal flow through fft_64k. Each frame’s settings travel with its data and come back with the output frame.#
- Overlap buffer
Accepts one sample per clock and keeps the tail of the previous frame, combining it with the new samples to build each overlapped frame. Only the new samples need to be supplied. Held in UltraRAM.
- Input buffer
Reorders each frame into bit-reversed order and widens it from 4 lanes to the engine’s 64 ports.
- Parallel butterfly engine
Radix-2 decimation-in-time. 32 butterflies process one rank at a time, in place, from a 64-port processing buffer. Twiddles come from 16 dual-port octant ROMs, each shared by two butterflies. The sequencer adapts automatically to short lengths.
- Output buffer
Returns the result in natural order, 4 samples per clock.
Features#
64 to 65,536 points (26 to 216), selected per frame
FFT or IFFT selected per frame
Overlap per frame: 0, 1/8, 1/4, 3/8, 1/2, 5/8 or 3/4
Per-rank scaling (divide by 2 at any stage), per frame
User tag returned with each output frame, along with its settings
1 complex sample per clock in, continuous: 275 MSPS at 275 MHz
Back-to-back frames with no gaps
4 complex samples per clock out (1.1 GSPS), absorbing the data growth from overlap
32 parallel radix-2 butterflies (64 data ports)
Fixed point, two’s complement
Data 12 to 32 bits per component (24 by default)
Twiddles of 16, 18, 20, 22 or 24 bits, chosen at build time
Rounding at each rank; RTL verified bit-exact against the model
Sticky arithmetic overflow detection
Octant-folded twiddle ROMs store 1/8 of the circle, bit-exact
Overlap buffer in UltraRAM, leaving block RAM for processing
Single clock, with clock crossings in place for a later split
Out-of-context core, ready to drop into a larger design
Maximum length set at build time (MAX_LOG2_N = 6 to 16)
Performance#
Kintex UltraScale+ KU5P, -1 speed grade (the slowest), 275 MHz.
Frame rate with continuous input:
Transform length |
Overlap 0 |
Overlap 1/2 |
Overlap 3/4 |
|---|---|---|---|
1,024 |
268,555 /s |
537,109 /s |
1,074,219 /s |
4,096 |
67,139 /s |
134,277 /s |
268,555 /s |
16,384 |
16,785 /s |
33,569 /s |
67,139 /s |
65,536 |
4,196 /s |
8,392 /s |
16,785 /s |
Engine time for one transform is roughly \((N/64)\log_2 N\) clocks plus a small overhead: about 0.6 µs at 1K points and 60 µs at 64K. At 3/4 overlap the core produces four times as many transformed points as it takes in: a 275 MSPS input yields 1.1 G transformed points per second.
Maximum overlap by length#
Length |
Maximum overlap |
|---|---|
64 |
1/4 |
128 |
1/2 |
256 |
5/8 |
512 to 65,536 |
3/4 |
Short lengths are limited by per-rank pipeline latency, not by the arithmetic.
Numerical accuracy#
Estimated signal-to-quantization-noise ratio at the default widths (24-bit data, 18-bit twiddles) ranges from about 78 to 106 dB, depending on length, signal and scaling. The datasheet has latency, overlap limits and full numerical results.
Device utilization#
Full 64K-point build, 24-bit data, 18-bit twiddles, overlap enabled. AMD Kintex UltraScale+ xcku5p-ffva676-1-e, Vivado 2025.2, out-of-context, post-route. Timing met at 277.8 MHz.
Resource |
Used |
Available |
Utilization |
|---|---|---|---|
CLB LUTs |
96,263 |
216,960 |
44.4% |
CLB registers |
61,697 |
433,920 |
14.2% |
Block RAM (36 Kb) |
363 |
480 |
75.6% |
UltraRAM |
16 |
64 |
25.0% |
DSP48E2 |
96 |
1,824 |
5.3% |
Results are from a single out-of-context run; in a full system they vary with placement and surrounding logic. A smaller maximum length or narrower data reduces memory use.
Deliverables#
Synthesizable RTL source and implementation constraints
Bit-accurate fixed-point model: pure Octave/MATLAB, and compiled C with an Octave/MATLAB (MEX) interface for speed
Self-checking SystemVerilog testbench, test-vector generator and test vectors; the regression covers every length, swept up and down, at every supported overlap
Simulation (Vivado xsim), synthesis and implementation scripts, with reference build reports
Status outputs for buffer overflow, missed frames and side-FIFO errors
User guide and full design document
Applications#
- Radar
Pulse compression, range and Doppler processing on long, overlapped frames.
- Lidar
Range and velocity processing where long transforms and continuous input matter.
- Communications
OFDM, channelization and frequency-domain equalization across a wide range of FFT sizes, with the length changeable on every frame.
Availability and licensing#
fft_64k is available immediately under a project license. Contact us with your transform lengths, overlap and target device for pricing.
Full design document#
The full design document, covering detailed timing, configuration options and integration guidance, is available on request. Email info@dilloneng.com or see our contact page.