After I took my first FPGA class at UCSC Extension, I was so amazed with the power these devices gave to the average person I decided to study them more in-depth. I eventually realized I had enough logic design knowledge that I could build my own simple processor. I started to build my own processor after learning about the KCPSM (nanoblaze) and I called it the NMPSM (Nick Mikstas Programmable State Machine). It took three iterations before I was able to make a fully functional processor, hence the name NMPSM3. Even though the NMPSM3 is inspired by the nanoblaze IO scheme, its internal structure is completely different. The NMPSM3 is a 16-bit processor with four independent interrupts and a reset. The NMPSM needs a minimum of four 18Kb BRAMS to be implemented: one for the registers, one for the stack, one for the decoder and at least 1 for the program ROM. Once I got the processor working, I wrote an assembler for it and created a large project to show its capabilities.
When I first designed the NMPSM3, it was implemented on a Digilent Nexys 2 board. The Nexys 2 had a Xilinx Spartan 3 part on it. After the successful implementation of the project, I did nothing with the NMPSM3 for several years. I eventually took a class at SCU that was basically the same class I took at UCSC Extension. I decided to breath some life back into the NMPSM3 by updating the project to work on a Digilent Basys 3 FPGA board. Since the new FPGA part (Artyx 7) had so much more capability than the Spartan 3, I also added some upgrades to the project. I wrote an extensive report on the project for the class.
Along with the processor, I built several other modules including a UART and picture processing unit (PPU) based on the 8-bit Nintendo. Some of the Verilog code is rough because I was learning Verilog as I was creating this project.
An assembler was also written for the NMPSM3. It is a basic assembler but it works quite well and has been used to write code for the NMPSM3 on several FPGA projects.
The first file below is the assembly language program that controls the project. The next file is a compiled version of the assembler. The third file is a simple batch file that runs the assembler and assembles the NMPSM3 code into a .coe file.