An instrument that maps a contour with sound. An ultrasonic sensor rotates by a stepper motor through a ±90° arc, every (angle, distance) reading gets turned into cartesian coordinates by a CORDIC core in the fabric, and then rendered as a sonar trace on a 720p VGA display with audio pings that pitch up as things get closer.
Wrote the stepper controller IP in VHDL as an AXI4-Lite slave, with a signed live step counter the PS can always know exactly where the sensor is pointing.
Built all of the application logic across both ARM cores: core 0 handles interrupts and every input driver (buttons, UART keyboard, analog joystick over an I2C ADC, rotary encoder), core 1 runs the application logic and VGA output, and the two pass inputs and hardware commands through a cache disabled shared memory region.
Wrote the sweep state machine that starts on a fast scan and transitions into a precise 3°/s pass the moment it gets a valid hit, and feeds those samples through a rolling median and average.
Preprocessed the frame buffer into a double buffer with a saved background region, so the static grid, range rings and info panel get restored instead of redrawn and the sweep stays smooth (even with 5 MB frame copies).
Offloaded the polar to Cartesian trig to the CORDIC core in the fabric to do instead of burning CPU on it, which kept the rendering core free.
A 2-axis plotter that parses coordinate files and traces vector drawings with two NEMA 17 steppers and a servo pen lift, driven by a multithreaded pipeline.
Streams coordinate commands, clamps each against axis bounds, dispatches X/Y targets to motor threads and synchronizes on completion.
One dedicated pthread per axis with mutex-protected queues and condition variables, stepping X and Y in parallel and cutting travel time up to 50%.
Benchmarked parallel against sequential runs on hardware to verify the speedup and the threading model.
plotter tracing a vector file
C · pthreads · mutex · GPIO · SPI · I2C · PWM · Linux
Transparent Ethernet Bridge
Jan to Mar 2026
RP2350 · dual W5500
An inline two-port bridge that forwards raw L2 frames between two nodes, with the W5500 driver written from the register map up.
Register-level driver in C for dual W5500 controllers over a shared SPI bus, handling link bring-up and MACRAW configuration.
Interrupt-driven forwarding path that drains received frames and rechecks pending data before returning to the main loop.
Validated inline between two devices exchanging ICMP pings, with no packet loss observed.
Embedded C · SPI · W5500 MACRAW · interrupts
HUB75 LED Matrix Controller
Dec 2024
DE10-Standard FPGA
VHDL driver for a 64×32 HUB75 RGB panel, handling row addressing, pixel shifting and refresh timing straight over GPIO.
4-state FSM sequencing shift, latch and output-enable to meet the panel's timing requirements.
1/16 multiplexed row scanning with dual RGB channels, refreshing the full panel without visible flicker.
Timing and FSM behaviour verified in ModelSim testbenches covering normal operation and edge cases.
dice animation on the panel driven from the DE10-Standard
VHDL · FSM · Quartus Prime · ModelSim
Parking Space Availability
Dec 2023
Raspberry Pi 4 · NoIR camera
Camera-based occupancy detector that processes a live feed to find open stalls through changing light and weather.
Detection pipeline using Gaussian blur and contour analysis to isolate cars from the feed.
Adaptive thresholding to hold sensitivity steady across lighting and weather shifts.
open vs. closed stalls, live
Python · OpenCV · image processing
Education
BASc, Computer Engineering
expected Jan 2028
Simon Fraser University · Burnaby, BC
3.39 GPA · 4× Dean's Honour Roll: Fall 2024, Summer 2025, Fall 2025, Spring 2026