Line 1... |
Line 1... |
# A Double-Clocked FFT Core Generator
|
# A Generic Piplined FFT Core Generator
|
|
|
The Double Clocked FFT project contains all of the software necessary to
|
This generic pipelined FFT project contains all of the software necessary to
|
create the IP to generate an arbitrary sized FFT that will clock two samples
|
create the IP to generate an arbitrary sized FFT. The FFT has been modified
|
in at each clock cycle, and after some pipeline delay it will clock two
|
for operation in one of the following modes:
|
samples out at every clock cycle.
|
|
|
- Two samples in per clock and, after some delay, two samples out per clock.
|
|
This uses 6 multiplies per FFT stage in the butterflies. This was the purpose
|
|
of the original `dblclkfft`. (Why double clock? I don't know. Double-sample
|
|
FFT might've been a better name.)
|
|
|
|
- One sample in per clock, with the `i_ce` line being high for every incoming
|
|
sample--up to one sample per clock. There's also options to run with at
|
|
least one clock between samples, or even two clocks between samples (or more).
|
|
This mode uses 3, 2, or 1 multiplies per FFT stage respectively.
|
|
|
|
- Eventually, I want to support a real FFT mode which will accept real samples
|
|
input, and alternately produce real and imaginary samples output--or the
|
|
converse for the inverse FFT.
|
|
|
The FFT generated by this approach is very configurable. By simple adjustment
|
The FFT generated by this project is very configurable. By simple adjustment
|
of a command line parameter, the FFT may be made to be a forward FFT or an
|
of a command line parameter, the FFT created will either be a forward FFT or an
|
inverse FFT. The number of bits processed, kept, and maintained by this
|
inverse FFT. The number of bits processed, kept, and maintained by this
|
FFT are also configurable. Even the number of bits used for the twiddle
|
FFT are also configurable. Even the number of bits used for the twiddle
|
factors, or whether or not to bit reverse the outputs, are all configurable
|
factors, or whether or not to bit reverse the outputs, are all configurable
|
parts to this FFT core.
|
parts to this FFT core.
|
|
|
These features make the Double Clocked FFT very different and unique among the
|
These features make this open source pipelined FFT module very different
|
other open HDL cores you may fine.
|
and unique among the other open HDL cores you may find.
|
|
|
For those who wish to get started right away, please download the package,
|
For those who wish to get started right away, please download the package,
|
change into the ``sw`` directory and run ``make``. There is no need to
|
change into the ``sw`` directory and run ``make``. There is no need to
|
run a configure script, ``fftgen`` is completely portable C++. Then, once
|
run a configure script, ``fftgen`` is completely portable C++. Then, once
|
built, go ahead and run ``fftgen`` without any arguments. This will cause
|
built, go ahead and run ``fftgen`` without any arguments. This will cause
|
``fftgen`` to print a usage statement to the screen. Review the usage
|
``fftgen`` to print a usage statement to the screen. Review the usage
|
statement, and run ``fftgen`` a second time with the arguments you need.
|
statement, and run ``fftgen`` a second time with the arguments you need.
|
|
|
Alternatively, you _could_ read the specification.
|
# Current State
|
|
|
## Genesis
|
This particular version of the FFT core now passes all my tests. It has
|
This FFT comes from my attempts to design and implement a signal processing
|
yet to meet hardware to be finally verified.
|
algorithm inside a generic FPGA, but only on a limited budget. As such,
|
|
I don't yet have the FPGA board I wish to place this algorithm onto, neither
|
|
do I have any expensive modeling or simulation capabilities. I'm using
|
|
Verilator for my modeling and simulation needs. This makes
|
|
using a vendor supplied IP core, such as an FFT, difficult if not impossible
|
|
to use.
|
|
|
|
My problem was made worse when I learned that the published maximum clock
|
|
speed for a device wasn't necessarily the maximum clock speed that I could
|
|
achieve. My design needed to process the incoming signal at 500 MHz to be
|
|
commercially viable. 500 MHz is not necessarily a clock speed
|
|
that can be easily achieved. 250 MHz, on the other hand, is much more within
|
|
the realm of possibility. Achieving a 500 MHz performance with a 250 MHz
|
|
clock, however, requires an FFT that accepts two samples per clock.
|
|
|
|
This, then, was and is the genesis of this project.
|
- The [FFT test bench](bench/cpp/fft_tb.cpp) doesn't yet have a threshold that
|
|
adjusts with input parameters to determine success or failure (yet).
|
|
|
|
- I haven't started on the real-only version of this FFT.
|
|
|
|
While my previously stated goal ws to continue working with this core until it
|
|
has a real-FFT capability before releasing it back into the master branch,
|
|
I'm actually so excited that I got it to this point that I'm going to move
|
|
it from dev to master earlier, and come back to get the real only version.
|
|
|
# Commercial Applications
|
# Commercial Applications
|
|
|
Should you find the GPLv3 license insufficient for your needs, other licenses
|
Should you find the GPLv3 license insufficient for your needs, other licenses
|
can be purchased from Gisselquist Technology, LLC.
|
can be purchased from Gisselquist Technology, LLC.
|
|
|
Likewise, please contact us should you wish to fund the further development
|
Likewise, please contact us should you wish to fund the further development
|
of this core.
|
of this core.
|
|
|
|
Watch this space if you are interested in a release under another license.
|
|
I'm thinking about relicensing this with a more permissive license.
|