PROJECTS

Below is a list of projects showcasing my technical abilities and professionalism.

MIPS Processor with VHDL

As part of my curriculum, I took CPRE 3810, a computer architecture and assembly programming course. In the course’s laboratory, we designed and simulated three different MIPS processor designs in VHDL.

The first design was single-cycle and featured an arithmetic logic unit (ALU), separate instruction and data memory, a control unit, and set of registers. The complete processor implemented over twenty instructions that included arithmetic, control flow, and memory access operations. My particular role was implementing the ALU, which included a barrel shifter, add-subtract unit, logic gate units, and an overflow detector. The final product was tested with the Modelsim framework and synthesized to an FPGA board for further testing.

After finishing this design, we implemented multi-cycle and pipelined versions and analyzed their performance. The design process of each iteration was involved and time-consuming, but the final payoff was worth it. I learned a lot about computer organization, and this knowledge laid a foundation that allowed me to learn about all sorts of other topics, such as operating systems, architecture security, and reverse engineering.

Real-Time Face Recognition on a Raspberry Pi

This fall semester, I was enrolled in CPRE 5580, a real-time systems course. For my final project, I emulated an embedded face recognition system on a Raspberry Pi. My system was built with real-time constraints, meaning there was a focus on reliability and predictability. The operating system I used was RT Linux, a real-time version of Linux that I implemented through a patch to the OS kernel. This rebuilt kernel allows for hard preemption of tasks to support real-time scheduling algorithms.

To establish predictability, I built my system with rate monotonic scheduling (RMS), which sets the priority of tasks based on the frequency at which they are issued. With this algorithm, a designer can prove that a given task set will meet deadline constraints mathematically using a “schedulability check” formula.

After building my system with a feasible schedule, I further enhanced it with a priority inheritance algorithm. Priority inheritance solves a real-time system issue known as priority inversion, which occurs when a lower priority task locks a resource needed by a higher priority task. Priority inheritance handles this by raising the priority of lower priority tasks as necessary.

Once I finished my system, it scanned faces, wrote known faces to a log, printed to an LCD screen, and enabled an LED if a flagged face is recognized. The face recognition component of the system used OpenCV libraries and a pretrained Histogram of Gradients model that can be set to recognize certain faces.

To evaluate my system, I performed basic testing with images of celebrities I found through Google. I compared the performance of my real-time system to a version of the system with real-time scheduling disabled, and I found the real-time version was slower on average but more predictable in its timing, and this is what’s expected of a real-time system. Through this project, I learned a lot about real-time systems, Linux, embedded programming, and the OpenCV library.

Wordle in MIPS Assembly Language

One of my favorite projects I’ve done is a NY Times “Wordle” remake using the MIPS assembly language. This was a solo project in my computer architecture and assembly programming course I did to meet an Iowa State honors college requirement.

The program functions similarly to actual Wordle, although my version is text-based and played in a console. The player is allowed 6 guesses that are graded on the closeness of each letter. I wrote this program using MARS, a MIPS IDE.

Input, output, and random integers are implemented through “syscall” instructions. The answer to each game is randomly picked from a word bank that’s stored in memory as an array of strings. The final program spans 362 lines and 10 functions, all written from scratch.

Through this project, I learned a lot about assembly language and assembly conventions and improved my design abilities.

MARS assembly IDE: https://dpetersanderson.github.io/

Quantum Key Distribution Research Paper

One of the neater technical electives courses I chose was PHYS 4220, Foundations of Quantum Computing. This course covered linear algebra, quantum mechanics, quantum circuits, quantum algorithms, and finished with a research project of our choosing. I wrote an essay on quantum key distribution, a secure method for distributing keys used in classical encryption. Below is the abstract and my paper

Abstract – Cryptography allows the sharing of private information over public, insecure mediums. The popular method of implementing cryptography is secure today; however, coming technology will break it. A proposed solution is quantum key distribution (QKD), a system that uses the laws of quantum mechanics to allow the sharing of a private key using qubits, the basic unit of quantum information. A transmitter encodes a message in these qubits that can be sent over a public medium to a recipient who performs measurements and creates a key. QKD’s security comes from the idea that measuring a qubit alters its state and that qubits are impossible to clone. The BB84 protocol outlines a way to implement QKD using 4 polarization states with a “prepare and measure” approach

Senior Design – Interactive Embedded Systems Learning

Client, Advisor: Dr. Phillip Jones, ECpE Department
Website: http://sdmay25-33.sd.ece.iastate.edu/

As part of my senior design requirement, my team and I are developing a learning application for use in CPRE 2880, an embedded systems course that uses “CyBot” iRobot Roomba cleaning robots as a platform to teach embedded programming. Our application is built on PrairieLearn, an open-source framework that allows course creators to create robust and unique teaching resources.

Using this framework, we uploaded and digitized the entire CPRE 2880 homework set. Students complete interactive assignments with randomized parameters allowing for practice and discouraging plagiarism. Most questions are autograded using Python scripts behind the scenes. For programming assignments, we have virtual machines that emulate real hardware to compile student code and analyze their output. An eventual goal for the platform is a complete simulated CyBot integrated into the platform.

My role in the project is Quality Assurance, so I’ve assessed our application on meeting client expectations and supervised improvements if needed. Through this project, I’ve strengthened my knowledge in embedded systems, learned about new technical systems (such as containers and emulators), and improved in soft skills such as communication and organization.

CyBot Roomba Project

As a student, I took the CPRE 2880 course discussed above. The laboratory component of the course focused on the CyBot with weekly tasking requiring implementation of different functionality. Throughout the semester, I improved my C programming abilities, learned about the basic architecture of computer systems, used analog and digital peripherals, and applied my problem solving skills.

The final assignment of this class was to navigate the CyBot through an obstacle course analogous to that of a rover on the surface of the moon. Obstacles included assorted objects, holes in the surface, and boundary lines. The major constraint of this project was that the operator of the robot could not see the course or the robot and instead relied on sensors such as a bump sensor and IR/Ping scanners. The solution was up to my team of three to create, and the design/testing process was a serious challenge of what we had learned in lecture and the laboratory.