Digital and Embedded Applications
RISC-V Microarchitectural Performance Characterization
Implementation: TCL, Verilog, Chisel
Links: Midterm report
This project is still in progress. Some of this description is already completed, other parts represent our final goals.
The project set out with a goal to design some enhancement to a RISC-V design using an FPGA for physical prototyping and verification. We started by analyzing a few different core designs (Ibex, RocketChip, and BOOM). A long term idea we devised was to add reconfiguring abilities to a core to facilitate autonomous reconfiguration. The first step in this, which is feasible for a semester project, is designing a performance monitor. Eventually, a reconfiguring controller can use the monitor to listen for events and reconfigure the core to improve performance and power consumption.
We mapped the top-down characterization approach (Yasin, 2014), which Intel uses for their out-of-order cores, to our selected RISC-V cores. Some of the basic RISC-V performance counters already facilitate the decisions that must be made in the approach. However, the cores needed extra counters for complete characterization. We implemented these additional counters along with the RTL module for making those decisions.
To evaluate and verify our design, we will implement a golden model in the transformed simulation model output by Verilator. We inject event monitors to check when certain events in the core happen during simulation, and used it to increment a counter in the testbench. Then, this count provides a reference to check the accuracy of our implementation. Once the simulation is functional, we can then inject benchmark programs to test the implementation. Modifying the internal core architecture should yield performance changes, which we hope to see reflected in the counters.
Apart from the simulation, we used an FPGA and an ASIC synthesis and place&route flow. The FPGA flow allows for hardware-based benchmarking of software programs that is orders of magnitude faster than software-based simulation. We are in the process of synthesizing the designs to a Zedboard FPGA. The Cadence ASIC flow, based on the ASAP7 physical design kit (Clark et al., 2016) verifies that our implementation does not compromise the processor's physical functionality if it were to be synthesized.
Cadence VLSI flow with power gating
Matrix Convolution FPGA Accelerator Module
Implementation: RTL design in VHDL; Verification in SystemVerilog; Modeling in SystemC; Board support package in C
Links: Source Code (not yet public)
Galaga-like game on an STM32
Implementation: C
Links: Source Code
As part of a team in a microprocessors course for university, I developed a Galaga-like videogame. It used the physical sensors and peripherals on the STM board to use the board as a video game controller. Since the board does not have a VGA output, we developed a renderer to output over the serial UART interface to a console using UTF-8 text. The program runs on FreeRTOS, and implements several different threads with shared resources that are synchronized and managed with semaphores.
Data Applications
CMathematics
Implementation: C
Links: Source Code, Creation Tutorial
This library implements various mathematical functions in C, including those in linear algebra, calculus, along with more algorithmic areas such as graph theory and big integer representation. In this project, I wanted to delve into translating mathematical ideas into computer code. To contribute to the interest and challenge, I programmed it using a lower-level language, which allowed me to learn more about computer architecture and memory representation. As of now, it primarily consists of basic functions in linear algebra, graph theory, and integer representation. However, in the future, I want to add on to these core concepts and create functionality in many other applications, such as encryption.
HttpServer
Implementation: C#
Links: Source Code
The http-server project is in some sense my attempt at replicating the .NET Core web application library. It consists of a web server interface, a static file server that can be hosted from any directory, and a framework that can be used to host a dynamic web server or API. This project helped me learn and experiment with numerous C# features, such as asynchronous functions, interfaces and other OOP concepts, and generics, along with a deep dive into the Type class and all its capabilities. The current capabilities of the library are as follows:
- HTTP server interface that accepts and responds to requests; can be customized
- Static file server that allows users to browse their local file system
- Dynamic web server library that allows users to program an API or host other content; involves route trees and customized endpoint responses
See the README.md file for more details
DataVault
Implementation: C
Links: Source Code, Creation Tutorial
This application is a lightweight secure data storage application that implements several forms of encryption and data security. It is the culmination of several other projects that I had been working on, such as the CMathematics library. It makes full use of its data security functions, namely encryption and decryption with AES, hashing with SHA, and key generation with PBKDF. The CMathematics library was my main motivation for this project as I wished to combine all those cryptography algorithms. So far, it has allowed me to see how these algorithms can work together to store data so that it cannot be stolen and decrypted. The application itself is relatively simple, storing data values corresponding to different categories for an entry. The project is currently ongoing, and has working account creation, data creation, and data access functions. In the future, I hope to implement a console interface along with functions to modify or delete data.
Plain Data Application
Implementation: Server - Python, Client - JavaScript (Node.js)
Links: Source Code, Demo Video
This application is a server-client model where anybody can upload a problem they have, a project in progress, a set of data, anything they need feedback on. And anybody can reply to it, creating a very wide range of incoming opinions. It encourages public contribution on a large scale because everybody has the opportunity to express their thoughts regarding the topics on the application.
The server was built in Python and the first desktop client was built using Javascript (Electron.js). They communicate using a secured form of TCP communication, with a combination of RSA and AES encryption to ensure the communications are private and not vulnerable to attacks.
I completed this project for the 2019 Camp Khan and it placed in the top 50 projects for the summer.
JSON Read/Write Library (C++)
Implementation: C++
Links: Source Code
Installation and usage instructions on the GitHub Repository.
This is a lightweight json reader, editor, and writer in a single .hpp file. In this project, I was able to enhance my skills with C++, including how to use references along with how to integrate more powerful string parsing into a program. The goal of this library is to provide a small but important tool that can be used to write and parse data in other applications such as games that are written in C++.
Graphical Applications
OpenGL Engine
Implementation: C++
Links: Source Code, Creation Tutorial
In the beginning of 2020, I began to learn OpenGL, a low level graphics library in C++. In learning it, I decided to implement my own 3D engine in order to experience the inner workings of the library along with creating something that would be useful later on. In the first half of the project, I followed the site, learnopengl.com, one of the most thorough OpenGL tutorials on the internet, created by Joey de Vries. I implemented a good portion of that tutorial in my engine while adding many of my own contributions such as organizing the code into many different classes to take full advantage of C++’s object oriented design. As of now, it encompasses environment interactions, model loading, object physics, user input, and a primitive collision algorithm that makes use of an octree. In the process, I went through several revisions of the code to add optimizations and organize the code into classes so that it would be easier to read. Currently, I am working on revising the collision algorithm to use planes from a collision model rather than bounding boxes or spheres.
OpenGL Mathematics Visualizer
Implementation: C++
Links: Source Code Tutorial
Taking some inspiration from the channel 3blue1brown on YouTube, I found myself interested in graphical displays of mathematics. This series is a deep dive into leveraging OpenGL’s rendering and shaders to display mathematical concepts. It makes extensive use of the geometry shaders and how it can be used to procedurally generate models.
Some of the included concepts are:
- 3D surfaces
- Procedurally generated sphere
- 3D arrows
- Transitions and path plotting
- To be continued…
GLPong
Links: Source Code, Creation Tutorial
GLConway
Links: Source Code, Creation Tutorial
Websites/Mobile Apps
English Civil War Website
Implementation: Weebly
Links: Site
This site was created for a history project and displays information about the English Civil War. It uses a chronological organization, with each page dedicated to one of the three time periods of the war. This site was created with Weebly as the competition rules dictated.
Metabolic Pathway Website
Implementation: HTML, JavaScript, CSS, Hosted on GitHub Pages
Links: Site, Source Code
This site was created to display a biological process. I was able to first try out hosting a site with GitHub pages with this project and experimented with different ways to present the information. I ended up with a JavaScript click-through slideshow to show the different steps in the process.
Quebec Architecture
Implementation: HTML, JavaScript, CSS (Bootstrap), Hosted on GitHub Pages
Links: Site, Source Code
I created this site in French class to present research I did on architecture in Quebec City. I opted to host with GitHub pages once again because of the ease in the process. This was the first time I experimented with Bootstrap, a CSS framework. Additionally, I incorporated many functions in CSS, such as a timeline, along with creating my own HTML element in JavaScript.
French Summer Work Website
Implementation: HTML, CSS, Hosted on GitHub Pages
Links: Site, Source Code
This website was created for French class as a journal for the tasks we were given to complete over the summer. There is a lot of media involved with this site, so I was able to learn the best manners in which I could display the audio and video clips. This site was built completely in HTML and CSS, without any JavaScript.
Portfolio de Thèmes Website
Implementation: HTML, CSS, Hosted on GitHub Pages
Links: Site, Source Code
I built this website as a portfolio to keep track of my work in French class. Each page is dedicated to one of the different themes in the class. Once again, I was able to experiment with different ways to display media and other content. Additionally, I used this as an opportunity to test a new navigation style.
SpaceX Launches Mobile App
Implementation: JavaScript (React Native)
Links: Source Code, Creation Tutorial
This React Native mobile app is very simple: it takes data about SpaceX launches from the SpaceX API and displays them. It displays images from the links along with information about the launches, which all come from the API data. This project allowed me to experiment with the structure of a React Native app, including how to integrate packages like React Navigation.