Skip to content

Computer EngineeringDesign, Verification & Embedded

I build hardwareand prove it works.

Computer engineering student working across RTL design, UVM verification, and embedded firmware — from a store-and-forward packet FIFO with exact drop prediction, to FreeRTOS telemetry nodes, to a robot that maps rooms on its own.

  • RTL Design
  • UVM Verification
  • Embedded / RTOS
  • FPGA Acceleration
  • Robotics
Peter Feng — Computer Engineering Student

Peter Feng

Computer Engineering Student

University of Florida

Embedded systems · PCB design · Design & verification

Public projects
10+
Languages & HDLs
6
Verification focus
UVM
01 / About

Who I am

I'm a computer engineering student who likes the part of the stack where software stops being an abstraction — RTL, firmware, and the boards they run on. Most of what I build starts as a question about how something actually behaves under load, then turns into a testbench or a scope trace that answers it.

Lately that's meant writing a store-and-forward packet FIFO and a UVM environment that predicts every dropped frame exactly, tuning FreeRTOS task priorities on an STM32 telemetry node, and teaching a robot car to map a room with a spinning LiDAR. I care about designs that are provably correct, not just ones that pass a smoke test.

Passionate about solving problems efficiently and building intelligent systems.

Interests

  • RTL Design & Functional Verification
  • Embedded Systems & Real-Time Operating Systems
  • FPGA & Hardware Acceleration
  • Robotics, SLAM & Sensor Fusion
  • PCB Design & Hardware Bring-up

Education

  • B.S. Computer Engineering

    Expected 2027

    University of Florida

    Coursework in operating systems, SystemVerilog verification, computer architecture, and analog circuits.

Languages & HDLs

  • C
  • C++
  • Python
  • SystemVerilog
  • VHDL
  • Rust
  • Java
  • JavaScript
03 / Deep dives

Five projects, end to end.

Ordered by what I'd want you to read first. Each one links straight to the repository — the commit history is part of the argument.

Design & Verification2026

AXI4-Stream Packet FIFO

Store-and-forward RTL with a UVM environment that predicts every drop exactly

  • SystemVerilog
  • UVM 1.2
  • AXI4-Stream
  • Questa
  • Verilator
  • SVA
  • Functional coverage

A store-and-forward packet FIFO that sits upstream of a network MAC and buffers whole frames so the MAC never underruns when the source stalls mid-packet. The design is built around a three-pointer commit/rewind scheme, and the UVM environment verifies it against a timing-independent contract rather than a cycle-by-cycle occupancy mirror.

Block diagram of the store-and-forward packet FIFO datapath and its three pointers
Datapath and the commit/rewind pointer scheme.
6
UVM tests in the regression
5 / 5
Injected bugs caught
445
Packets in RTL pre-validation
0
Scoreboard discrepancies
  1. 01

    Three-pointer commit and rewind

    wr_ptr advances speculatively on every accepted beat, wr_ptr_commit marks the end of the last whole packet and doubles as the rewind target, and rd_ptr only ever sees committed packets. A dropped frame costs one pointer assignment.

  2. 02

    Drop-on-overflow without deadlock

    A packet is dropped only when the entire buffer holds a single in-progress packet, so anything that fits is never dropped. Once dropping starts the FIFO holds tready high and sinks the rest of the doomed frame to tlast, so the AXI4-Stream master never locks up.

  3. 03

    Exact scoreboarding from a design contract

    Because the drop rule collapses to length > DEPTH always drops and length <= DEPTH never drops, the scoreboard predicts drops deterministically instead of racing the DUT's internal occupancy. That removes the false-failure problem that plagues cycle-accurate monitors.

  4. 04

    Configurable slave-side backpressure VIP

    A new axi4_stream_slave_driver generates tready under four policies — always ready, random, stall, and blocked — layered onto Greg Stitt's parameterized AXI4-Stream agent, which is reused unchanged.

  5. 05

    Mutation-tested checkers

    Five bugs were deliberately injected — overeager drop, commit pointer off-by-one, missing rewind, stall-during-drop, and plain FIFO instead of store-and-forward. All five were caught by the assertions and scoreboard, proving the checkers actually check.

Simulation waveform of a dropped oversize packet and the pointer rewind
Rewind on overflow: tready stays high while the doomed frame is sunk to tlast.
Functional coverage report for the packet FIFO regression
Coverage closure across length bins and backpressure policies.
UVM testbench hierarchy diagram
Testbench topology — reused agent, new slave driver, packet-level scoreboard.

Embedded / RTOS2026

RTOS Environmental Monitoring Node

Five-task FreeRTOS firmware on STM32F103 streaming telemetry to an MQTT gateway

  • C
  • FreeRTOS 11.1
  • STM32F103RB
  • BME680
  • I²C
  • DMA + IDLE
  • CMake
  • ESP32
  • MQTT
  • pytest

FreeRTOS firmware for an STM32 NUCLEO-F103RB that samples a BME680 over I²C, filters and scores the readings, and streams formatted telemetry over UART to an ESP32 that republishes it as MQTT. Built around explicit priority assignment, priority-inheritance locking, and a command interface that reconfigures the sampling period at runtime.

The NUCLEO-F103RB, BME680 sensor and ESP32 gateway wired together
The node on the bench — NUCLEO-F103RB, BME680, ESP32 gateway.
5
FreeRTOS tasks
36.3 KB
Flash — 27.7% of 128 KB
13.0 KB
SRAM — 65% of 20 KB
93+
Host-side unit tests
  1. 01

    Five tasks with deliberate priorities

    Sensor at priority 3, processing and comm at 2, logging and health at 1. The health task uses absolute wake times rather than relative delays so its 5-second cadence holds even when execution time varies.

  2. 02

    Zero-interrupt UART reception

    Circular DMA with IDLE-line framing means a burst of incoming bytes costs no interrupts at all — the line goes idle, one event fires, and the whole message is already in memory.

  3. 03

    Priority inheritance on the I²C bus

    The BME680 bus is guarded by a priority-inheritance mutex, and the button ISR uses direct task notifications instead of a semaphore, keeping the interrupt path short and the sensor task unblocked.

  4. 04

    Runtime command interface

    STATUS, SAMPLE_NOW, SET_PERIOD, GET_PERIOD and PING are accepted on either UART link, with responses returned on the originating link. The sampling period retunes from 100 ms to 60 s without stopping the application.

  5. 05

    Hardware-free unit testing

    processing.c, telemetry.c and cmd_parser.c contain no HAL or kernel calls, so they compile for the host and run 93+ tests under pytest via ctypes. Hardware tests then check round-trip latency and telemetry jitter separately.

FreeRTOS task and queue architecture diagram
Task graph, queues, and the notification paths between them.
Serial console output showing the telemetry line format
Telemetry stream and the health task's heap/stack report.
Chart of telemetry scheduling jitter measurements
Measured scheduling jitter across sampling periods.

Robotics / ROS 22026

AutoCar SLAM

A self-mapping robot car — ROS 2, RPLIDAR, and live floor plans over Wi-Fi

  • ROS 2 Jazzy
  • Python 3
  • micro-ROS
  • RPLIDAR A1
  • Raspberry Pi 5
  • ESP32
  • L298N
  • Foxglove
  • Ubuntu 24.04

A robot car that drives itself around a room and builds a floor plan while it goes. An ESP32 handles motors and encoder counting, a Raspberry Pi 5 runs the LiDAR, odometry and SLAM stack under ROS 2 Jazzy, and a laptop watches the map build in real time through Foxglove Studio over Wi-Fi.

The assembled AutoCar with RPLIDAR mounted on top
The car, fully assembled — RPLIDAR A1 up top, Pi 5 and ESP32 below.
12 m
RPLIDAR A1 range
10 Hz
Scan rate
10.2 mm
Per encoder tick
11.1 V
3S Li-ion pack
  1. 01

    Split-brain architecture

    The ESP32 does only what needs hard real-time — PWM and encoder ticks — and bridges into ROS 2 through micro-ROS. Everything with a compute budget lives on the Pi 5, so the motor loop never competes with scan matching.

  2. 02

    Encoder odometry from first principles

    Wheel position is integrated from 20-slot encoder ticks calibrated at 10.2 mm per tick, then fused with RPLIDAR A1 scans at 10 Hz to close loops and correct drift.

  3. 03

    Live remote visualization

    Map, scan point cloud and odometry stream to Foxglove Studio on a client machine over Wi-Fi, so you watch the floor plan assemble as the car drives rather than after the fact.

  4. 04

    Teleop and autonomous modes

    WASD keyboard teleop with tunable speed for careful mapping runs, plus an autonomous obstacle-avoidance mode. Finished maps persist as PGM images with YAML metadata.

  5. 05

    Honest hardware limits, documented

    Motor deadband near 20% duty, single-channel encoders that infer direction rather than measure it, and a battery that sags when motors and LiDAR draw together — all characterized in HARDWARE.md rather than hidden.

A completed SLAM floor plan rendered in Foxglove Studio
A finished room map after loop closure.
ROS 2 node and topic graph for the AutoCar stack
Node graph across the ESP32, Pi 5 and client.
The occupancy map filling in during a mapping run
Map assembling live during a slow mapping pass.

FPGA / Acceleration2026

DE10-Nano OpenCL Acceleration

Standing up an ARM-to-FPGA OpenCL platform from BSP to running kernels

  • OpenCL
  • C++
  • Quartus Prime 18.1
  • Qsys
  • Cyclone V
  • ARM Cortex-A9
  • arm-linux-gnueabihf
  • GNU Make

An end-to-end OpenCL acceleration platform on the Terasic DE10-Nano, where a host application on the ARM Cortex-A9 dispatches compute kernels into the Cyclone V fabric. The work spans the whole stack — Quartus hardware, the MMD layer and device driver, the board support package, and the host code — kept in clean separation.

The Terasic DE10-Nano development board
The DE10-Nano — Cortex-A9 HPS beside the Cyclone V fabric.
Cyclone V
FPGA fabric
Cortex-A9
Hard processor system
OpenCL 18.1
Intel FPGA SDK
2
Demonstration kernels
  1. 01

    Full-stack board bring-up

    Quartus hardware and Qsys system integration, the MMD implementation and ARM device driver, the OpenCL board support package, and the host application — each in its own layer with an explicit boundary between them.

  2. 02

    Host-to-fabric dispatch over OpenCL

    The ARM host enumerates the FPGA as an OpenCL device through the BSP and MMD library, then queues kernels onto the Cyclone V fabric like any other accelerator.

  3. 03

    Two demonstration kernels

    Vector addition establishes the dispatch path end to end, then a 3×3 image convolution exercises a real signal-processing workload with memory access patterns that matter.

  4. 04

    Cross-compiled and reproducible

    Host code builds with the ARM hard-float toolchain under GNU Make, and prebuilt .aocx device binaries and FPGA artifacts ship with the repo so the platform can be validated without a full toolchain install.

Layer diagram of the ARM-to-FPGA OpenCL software stack
How a kernel call travels from host code down into the fabric.
Board diagnostics output confirming the OpenCL device enumerates
Board validation — the FPGA enumerating as an OpenCL device.
Output of the 3x3 convolution kernel running on the fabric
The 3×3 convolution kernel running on fabric.

Design & Verification2026

APB UART Master Core Verification

A two-agent UVM environment closing 100% functional coverage on a 16550-compatible core

Verification environment built on a forked RTL core

  • SystemVerilog
  • UVM 1.2
  • APB
  • UART 16550
  • QuestaSim
  • VCS
  • SVA

A UVM environment that verifies an APB-based UART master core by instantiating two cores and wiring them to talk to each other, so transmit and receive are checked against real traffic rather than a model. Two APB agents drive the pair, a central scoreboard validates end to end, and assertions police APB protocol compliance throughout.

UVM testbench architecture with two APB agents and a shared scoreboard
Two agents, two cores, one scoreboard.
100%
Functional coverage
9
Test scenarios
2
APB agents
0
Assertion failures
  1. 01

    Two DUVs, one closed loop

    Rather than verify a transmitter against a predicted bitstream, two UART cores face each other. Whatever one sends the other must receive, which turns serialization, framing and timing into an end-to-end check.

  2. 02

    Per-agent drivers, monitors and sequencers

    Each APB agent carries its own driver, monitor and sequencer, feeding a shared scoreboard so traffic from either side is checked against the same reference.

  3. 03

    Error injection across nine scenarios

    Parity errors, break conditions, buffer overrun, framing errors, transmit register states and timeouts — each with a dedicated test rather than being folded into a random soak.

  4. 04

    Assertion-backed protocol compliance

    SystemVerilog assertions check APB transaction legality continuously, so a protocol violation fails at the moment it happens rather than as a downstream data mismatch.

Functional coverage report at 100%
Coverage closure across all nine scenarios.
Waveform of an APB transaction and the resulting UART frame
APB write to serial frame, captured end to end.
04 / More work

Smaller builds and experiments.

Hackathon hardware, driver ports, browser tooling, and coursework simulation.

The chest-worn ESP32 sender unit

Embedded / IoT2026

SAVE YOUR GRANDPA

A wearable fall detector with a four-state confirmation machine

A chest-worn ESP32 watches motion and impact and reports over ESP-NOW to a base station that logs telemetry and serves a dashboard. The detector only confirms a fall after four conditions line up in sequence, which is what separates a real fall from sitting down hard.

  • ESP32
  • ESP-NOW
  • MPU6050
  • HC-SR04
  • Python
  • +2
The Pico 2350 wired to the VL53L1X and ultrasonic sensors

Embedded / Drivers2026

ToF + Ultrasonic on Pico 2350

An Arduino-free port of the VL53L1X driver to the bare Pico SDK

Distance sensing on the RP2350 from two different physical principles at once — a VL53L1X time-of-flight sensor and an ultrasonic rangefinder — with the Adafruit VL53L1X driver ported off Arduino and onto the raw Pico C/C++ SDK.

  • C / C++
  • Pico SDK
  • RP2350
  • VL53L1X
  • HC-SR04
  • +2
The WatchMark extension popup

Web / Tools2026

WatchMark

A Chrome extension that watches one element and tells you the moment it changes

Pick any element on any page and WatchMark tells you when its text changes — seat availability, appointment slots, stock, ticket drops. Built on MutationObserver with auto-reload for pages that only update on refresh, and selections that survive the reload.

  • JavaScript
  • Chrome Extension APIs
  • MutationObserver
  • EmailJS
  • HTML / CSS
The 3D particle heart rendered from text
The cloud, rendered from text glyphs.

Graphics / WebGL2026

The Beauty and Math

A parametric heart, drawn from 2,500 particles of whatever you type

A closed-form heart curve turned into a 3D particle cloud in Three.js, where every particle is a glyph of the message you type. Drag to spin it, scroll to zoom, and the whole cloud breathes on a slow sine. It is the one project here whose correctness criterion is whether it looks right.

  • Three.js r128
  • WebGL
  • JavaScript
  • Parametric geometry
  • Canvas textures
Regression Sim output

Tools2026

Regression Sim

A Python harness for running simulation regressions

A small Python tool for driving repeated simulation runs and collecting their results. Placeholder copy — send me a line about what this one actually does and I'll rewrite it properly.

  • Python
An LTspice schematic

Analog / Simulation2026

LTspice Circuit Studies

Analog simulation work — bias points, transient response, frequency sweeps

LTspice schematics and simulation runs from analog circuits coursework. Placeholder copy — tell me which circuits these are and what you were characterizing, and I'll write this up properly.

  • LTspice
  • Analog design
Toolchain

What I actually work in.

Languages, simulators and boards I reach for by default — the ones I've taped a project out with, not the ones I've only read about.

  • SystemVerilog
  • UVM 1.2
  • VHDL
  • SVA
  • Functional Coverage
  • Questa
  • Vivado XSim
  • VCS
  • Verilator
  • Quartus Prime
  • LTspice
  • C / C++
  • FreeRTOS
  • STM32 HAL
  • Pico SDK
  • ESP32
  • CMake
  • AXI4-Stream
  • APB
  • I²C
  • UART
  • SPI
  • ESP-NOW
  • Python
  • ROS 2
  • Linux
  • Git
  • Altium
  • Foxglove

HDL & Verification

  • SystemVerilog
  • UVM 1.2
  • VHDL
  • SVA
  • Functional Coverage

Simulators & EDA

  • Questa
  • Vivado XSim
  • VCS
  • Verilator
  • Quartus Prime
  • LTspice

Embedded

  • C / C++
  • FreeRTOS
  • STM32 HAL
  • Pico SDK
  • ESP32
  • CMake

Protocols

  • AXI4-Stream
  • APB
  • I²C
  • UART
  • SPI
  • ESP-NOW

Systems & Tools

  • Python
  • ROS 2
  • Linux
  • Git
  • Altium
  • Foxglove