This project implements a 4-point, 8-bit fixed-point Fast Fourier Transform (FFT) engine using SystemVerilog, designed to be deployed on a TinyTapeout-compatible chip and evaluated through a PCB. The FFT engine is based on a radix-2 decimation-in-time (DIT) architecture, structured in two stages using butterfly modules and twiddle factor multiplication to compute the frequency-domain representation of four complex time-domain samples.
The system interfaces with users through a simple control scheme consisting of 8 input switches, bidirectional I/O pins, and a single-digit 7-segment display. Switches 0 and 1 control the data flow into and out of the system, respectively.
The architecture consists of several key components:
The FFT computation follows a two-stage butterfly architecture:
Stage 1:
Stage 2:
The system uses a simple 2-button interface:
Switch 0 (Load Control):
Switch 1 (Output Control):
The display provides real-time operation feedback:
FFT Engine INITIAL Design Document, NOT UP TO DATE USE DOCS IN REPO INSTEAD
Required Components:
uo_out[7:0]
ui_in[1:0]
uio[7:0]
uio[7:0]
Display shows "1", "2", "3", "4" during respective loading phases
uio[7:0]
Display shows "5", "6", "7", "8" during respective output phases
Input Samples: Each 8-bit word represents one complex sample
Output Results: Each 8-bit word represents one frequency bin
rst_n
for system initializationPin Connections:
ui_in[0]
: Load/Input control switchui_in[1]
: Output/Read control switchuo_out[7:0]
: 7-segment displayuio[7:0]
: Bidirectional data bus (input samples / output results)rst_n
: Active-low resetclk
: 50 MHz system clockThis project was completed collaboratively, with both team members contributing to various components at different stages. A project proposal was designed jointly, and the initial division of responsibilities was as follows:
Hadi Zaidi: I/O Control, FFT Engine, Top Level design, Static Timing Analysis
Mariam El Sahhar: Memory, Butterfly Unit, Design Verification, Testbenches, Waveform Analysis
Throughout the project, both members provided support and input across all areas as needed. An earlier iteration can be found here.
# | Input | Output | Bidirectional |
---|---|---|---|
0 | LOAD_BTN | SEG_0 | DATA_0 (sample input / FFT output) (bits 7:4 = real, bits 3:0 = imag for output) |
1 | OUTPUT_BTN | SEG_1 | DATA_1 |
2 | Unused | SEG_2 | DATA_2 |
3 | Unused | SEG_3 | DATA_3 |
4 | Unused | SEG_4 | DATA_4 |
5 | Unused | SEG_5 | DATA_5 |
6 | Unused | SEG_6 | DATA_6 |
7 | Unused | SEG_7 | DATA_7 |