
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 |