
PROJECT
| Rishti Kulkarni | AUTHOR | ACTIVE |
| Sohan Aiyappa | COORDINATOR | ACTIVE |

Link to Full Report Here – Check out the detailed technical report for a deep dive!
This project focuses on creating a miniscule 16-bit computer on the Basys 3 Artix 7 FPGA. We adopted the NAND2Tetris architecture and implemented it using Verilog. The computer was constructed from first principles, starting with the universal NAND logic gate and building up to individual components like RAM, ROM, and the Processing Unit. Throughout the project, this bottom-up approach made learning the architecture and debugging the system much easier.
To understand how this computer works, we first need to look at the instructions it follows. The CPU handles two specific types of 16-bit instructions:
Hack CPU:

The computer consists of three major components:
Inside the CPU, there are a few key players:
One of the main goals of my implementation was usability. To make testing and running programs easier, I designed the system to operate in two distinct modes.
This mode executes the program automatically, fetching instructions one by one using the Program Counter.
In this mode, instructions are fed manually, and we step through the program one click at a time.
Block Diagram of My Implementation:

NAND2Tetris Block Diagram:

If you compare my final block diagram with the original NAND2Tetris architecture, you will notice some key additions needed to make this work on real hardware (the FPGA).
Since I needed to support both Auto and Manual modes, I couldn't just wire the clock directly.
debouncer blocks for the mode_btn and step_btn to ensure that one press equals exactly one signal.led_output stage to decide what to show on the LEDs based on which mode is currently active.Here is a quick look at the signals used in the design, as seen in the block diagram:
| Signal Name | Direction | Description |
|---|---|---|
| clk | Input | The main 100MHz system clock from the FPGA. |
| switches [15:0] | Input | 16-bit input used for entering manual instructions. |
| mode_btn | Input | Button to toggle between Auto and Manual modes. |
| step_btn | Input | Button used as the clock pulse in Manual mode. |
| reset | Input | Resets the Program Counter (PC) to 0. |
| initialise | Input | Used to load the ROM with the program. |
| led_output [15:0] | Output | Displays the 16-bit result or memory value. |
I would like to keep this brief, but this project wouldn't have been possible without the support of some amazing people.
Huge thanks to UVCEGA and MARVEL (our student-run lab) for providing the platform and resources for innovation. I am deeply grateful to our Alumni Coordinator, Adrian P Isaac, for the opportunity and support.
I must thank Shimon Schocken and Noam Nisan, the creators of NAND2Tetris, for their exceptional course that served as my roadmap. Special thanks to my mentor, Anish Krishnakumar, for his patience and for helping me navigate the steep learning curve.
Thank you to my peers, A V Sohan Aiyappa and Virajit G P, for keeping me motivated with their dedication. And finally, a special thanks to my friend Priyamvada K C, whose encouragement pushed me to start this journey in the first place.