Neural Network Inference Accelerator
Python, PyTorch, Verilog, Vivado
On-chip neural network inference — PyTorch to FPGA fabric.
Hardware
Xilinx Artix-7 XC7A35T, Digilent Basys 3
RTL
Verilog, Vivado, DSP48E1 MAC Array
ML Pipeline
PyTorch, INT8 Post-Training Quantization
Verification
Golden Model, Self-Checking Testbenches, SymbiYosys
- Trained a 784→128→24 classifier in PyTorch for 24-class ASL hand-sign recognition, then
built a custom accelerator to run inference at 100 MHz with no external memory and no CPU
- Wrote an end-to-end Python quantization toolchain that computes per-layer scale factors,
converts FP32 weights to INT8 using power-of-two shifts so rescaling reduces to bit shifts
in hardware, and emits memory initialization files; held INT8 accuracy at ~92% against a 93%
FP32 baseline
- Built a cycle-accurate Python golden model and self-checking test harness that validated the
implementation as bit-exact before deployment, catching quantization and overflow defects
early
- Extending verification with SystemVerilog assertions discharged formally via SymbiYosys,
proving accumulator overflow cannot occur for any legal input sequence and that the datapath
handshake is deadlock-free
Demo on GitHub
Model Rocket Avionics & Airframe In Progress
Embedded C++, ESP32-S3, KiCad, LTspice
A scratch-built 2.5" rocket and the flight computer that measures it.
Avionics
ESP32-S3, BME280 over I2C, TPS61023 Boost Converter
Firmware
Embedded C++, microSD Logging at 20 Hz
Board Design
KiCad Two-Layer PCB, LTspice
Airframe
OpenSCAD, OpenRocket, 3D Printing
- Designing and building a scratch-built 2.5" model rocket with a custom onboard altimeter to
compare OpenRocket-simulated apogee against measured flight data and validate the simulation
model
- Built a standalone flight computer from discrete components rather than an off-the-shelf
altimeter: ESP32-S3, BME280 barometric sensor over I2C, and a TPS61023 boost converter
stepping a 3.7V LiPo to a 5V rail; bench-validated on breadboard, then migrated to soldered
perfboard sized to fit the nose cone
- Wrote embedded C++ firmware that captures a 10-sample ground-level pressure baseline on boot
and logs timestamped pressure, temperature, and relative altitude to microSD at 20 Hz
- Migrating from perfboard to a custom two-layer PCB in KiCad — schematic capture, footprint
selection, power routing, fabrication-ready Gerbers — with the boost converter modeled in
LTspice and simulated rail transients checked against bench measurements
- Modeled the nose cone, fin can, and avionics deck parametrically in OpenSCAD; sited avionics
in the nose cone rather than a mid-body bay to shift CG forward and isolate the sensor from
ejection gas, validating stability margin in OpenRocket
Barbell Velocity Tracker
C++, Arduino, Signal Processing, OpenSCAD
Instrumenting a piece of gym equipment end to end.
Hardware
Arduino Uno, 600P/R Rotary Encoder, C++
Frontend
React 19, Vite 7, Tailwind 4
Backend
FastAPI, Python, pyserial
Mechanical
OpenSCAD, 3D Printing
- Built a real-time C++ data acquisition system reading high-precision rotary encoders to
compute bar velocity, with digital filtering to improve signal-to-noise ratio
- Packaged the sensor in 3D-printed housings designed in parametric CAD, with a local web app
for live feedback — all data stays on device, no accounts and no cloud
Demo on X