SpyDrNet-TMR is a plugin for SpyDrNet, an open source tool for analyzing and transforming netlists, that applies triple modular reduncancy to FPGA netlist designs for fault tolerance.
I managed the release of SpyDrNet TMR, pulling from previous work done on an private version of the tool. I implemented reduction voter placement, as well two voter insertion algorithms (voter before/after every flip-flop) for cutting feedback in a design. I also created tests, documentation, and tests for each of these features.
The Bit Inspector Tool provides information on all possible features associated with individual bits that either appear or do not appear in a given bitstream for programming FPGAs. This tool relies on the Symbiflow Project X-Ray database and is compatible with all devices that the database supports. Below is a flow chart of how this tool is used.
With Xilinx's Vivado Design Suite, a string of bits can be created from a SystemVerilog design to program an FPGA for a specific purpose. Each bit is associated with a "feature" related to some element in the FPGA (flip-flops, muxes, interconnects, etc.) In some circumstances (such as in satellite applications), FPGAs are prone to radiation-induced faults that will "flip" bits to incorrect values. With this tool, more can be understood about what happens when these faults occur.
By using a .bits file (a human readable file that shows each bit set to "1" on separate lines) to select certain bit locations and a normal bitstream file used to program an FPGA, this tool can show every feature that each bit in the .bits file affects (whether in the actual design or not) and whether it is found in the original bitstream.
I built upon pre-existing Project X-Ray tools that utilize open source FPGA databases, and used Python to create this tool. I wrote documentation and created an easy to follow demo intended to help someone with minimal knowledge of Linux terminal commands and FPGA programming to be able to use this tool. I created this tool as a Research Assistant at BYU and it is only available on a private GitHub repository.
The Femto-Satellite (femto- refers to the unit prefix denoting a factor of 10-15) is a small satellite that can record several different motion and atmospheric measurements and send them back to a base station by radio. I worked on this project with a fellow BYU student as a part of the BYU Spacecraft Group. We worked side-by-side, collaberating on every step of the process.
We started by choosing the different modules that we would use to take measurements, as well as a radio module to send the data. We chose the 9-axis MPU-9250 TDK InvenSense for motion, the BME280 by Bosch Sensortech for atmospheric measurements, and the RFM69 for radio communication.
During the design process we used a breadboard and breakoutboards for each module to create and test the software required for the satellite. We had to read through documentation for each module and choose the features/functions that would best fit out needs. At a 9600 baudrate, we sent 30 character packets (for simplicity reasons) with data from the different modules to a radio base station provided by the club.
To create the custom PCB, we used EAGLE. After several iterations, we were able to fit all of the modules on a board sized 22mm x 70mm. We used placed solder paste on the appropriate surfaces on the PCB using a stencil, and after placing our modules and various components on the PCB, we used a reflow oven to join everything.
Due to a mistake with our PCB design, a ground overlapped with another wire. We tried many jerry-rigging techniques to get it to work, but the bad connection ultimately led to the femto-satellite not working in its final form. We were unable to launch our satellite, but we gained invaluable experience. I learned a lot about working in a team, scheduling milestones, finding compromises, and making the best of failures.
The Family Map App is an Android App that allows you to create a user account and then generate several generations of random family data. The family data generated includes different types of events such as birth, marriage, and death, but can also support several more kinds of events.
All family events can be viewed using Google Maps with clickable markers for each event that open interactive menus to navigate a person's events/immediate family. Between each event are lines that show a person's life story, lines that show genealogy, and lines that connect spouses.
All of these lines, as well as filters for events of family members on the father's/mother's side and events of male/female family members, can be turned on and off in the settings menu. There is also a search menu that allows the user to search for any person or event depending on the filters set.
The Family Map server allows for several users to be logged in simultaneously and view their own family data. This is done with a Java HTTP server that recieves requests and to read and write information from an SQLite database.
This project was created as a part of the Advanced Programming Concepts (CS 240) course at Brigham Young University.
This is a touch-screen version of the classic Whack-A-Mole game. In the game, moles pop out of holes and your job is to “whack” them by touching the screen before they go back into their hole. The game gets progressively harder, including faster movement from the moles, and multiple moles appearing at the same time. By using the switches on the board, the user can choose between four, six, and nine mole modes. Once a certain amount of moles are missed, the game ends, and the score is shown at the end.
The game was developed in two parts: the display, and the control. The display code is responsible for drawing the mole display, supporting the three different modes, activating/deactivating random moles, showing user stats, etc. The control code is responsible for waiting for the user to touch the display, waiting for the touch analog-to-digital converters to settle, and sending those coordinates to the display code to determine what needs to be drawn/erased on the screen.
I used graphic routines provided by the Adafruit LCD display library, and created low-level C code to communicate with the GPIO IP blocks for the switches and buttons on the ZYBO.The GCC compiler was used to compile the C code into executable programs that can be run on the ARM processor on the Digilent ZYBO. The demo shown above was run on an emulator for the ZYBO.
This project was created as a part of the Intro to Embedded Programming (ECEn 330) course at Brigham Young University.
This is a touch-screen version of Simon Says. In the game, a sequence of colors is played to you and you attempt to re-key in the sequence correctly. If you correctly re-key the sequence, you continue and the sequence gets longer.
The game was developed with four different state machines: one for drawing the buttons and detecting touches/time-outs (buttonHandler), one for flashing the current random sequence that the player will try to match (flashSequence), one for verifying that the sequence of button touches match the random sequence (verifySequence), and one for controlling everything at a top level (simonControl).
I used graphic routines provided by the Adafruit LCD display library, and created low-level C code to communicate with the GPIO IP blocks for the switches and buttons on the ZYBO.The GCC compiler was used to compile the C code into executable programs that can be run on the ARM processor on the Digilent ZYBO. The demo shown above was run on an emulator for the ZYBO.
This project was created as a part of the Intro to Embedded Programming (ECEn 330) course at Brigham Young University.
This is a version of pong designed for both the Digilent Nexys 4 and the Basys 3 FPGA boards. Both players control their paddles with the buttons on the board and hit the ball back and forth. If a player fails to return the ball, the other player earns a point, and their score is updated on the board's built-in seven segment display.
The game was created with a module to draw the ball, a module to draw the paddles, as well as a module to handle the ball movement, player input, and to update the score. These modules, in conjunction with a bitmap to VGA module and seven segment display module provided by BYU, make up all the circuitry for this project. With a constraints file mapping the I/O signals to the correct pins, the game is ready to be played.
The game is ready to be played on both the Nexys 4 board and the Basys 3 board (with a modified seven segment controller module).
This project was created as a part of the Fundamentals of Digital Systems (ECEn 220) course at Brigham Young University.