Thought I'd make a post and share for anyone that might be interested. I've been working on a project for the last few months making a microcontroller based NES emulator. The goal is to design the least powerful, least expensive piece of hardware using off the shelf components that can emulate the nintendo at a level I consider "mostly accurate". Obviously I can't do cycle-by-cycle emulation, but I don't want to sacrifice accuracy too much. I'm currently aiming for a quality similar to loopynes.
The board uses an STMicro ARM Cortex-M3 (STM32F205ZE) microcontroller running at 120MHz. It comes with 512KB of flash, 128KB of RAM, 16-bit external bus, and a buffered internal DAC I'm going to use for audio (maybe). I needed more RAM, so I put a 512KB SRAM on the bus. I'm also using an Epson S1D13746 video controller. It has an internal frame buffer you can write to and it spits out s-video. It's intended for mobile applications, but has a lot of features that are useful for any embedded video system, such as double buffering, rotation, window support, etc. I have a micro SD slot for a flash card that will store ROMs, but I plan on switching to USB on the next board. I also wanted to use the NES joypads, so there's 2 connectors for those as well.
Here's what the board looks like now. It's a 4 inch x 3 inch 2 layer board, so the routing was a bit tight. Using an SOJ package for the RAM helped out a lot, and the analog and digital response actually ended up to be really good.
Originally I was going to start with a PIC32 or AVR32, but I got caught up in too much early optimization and it was making the project excessively limited. The AVR32 is more expensive, and the PIC32 has limited RAM and no external bus, so I decided to just use an ARM Cortex-M3 to start out with and get a platform designed that I could start working with. My intention is to move back to a lower powered micro, if possible, once I get the current system emulating basic mappers at 60 FPS. I'm at around 40 FPS right now on mapper 0 games, but I haven't done any PPU optimization really. It's all written in C and coded for simplicity just so I could get it functioning. I have some graphical glitches when scrolling, but once I figure that out I'll start rewriting for speed.
I'm using a 16-bit RGB pallette here.
Some more of the board.
The main 5V to 3.3V regulator has an exposed pad, so I hot plated the other ICs as well.
The predecessor. It was from another project and used a Wiznet microcontroller with a modified 8052 core. I was only getting 1 FPS on this My code is still written for an 8-bit micro, so when I change that, that should yield a significant bump in speed as well.
I'll post updates as I continue to make progress on the project if people are interested. I plan on open-sourcing it after it's fully functional.
The board uses an STMicro ARM Cortex-M3 (STM32F205ZE) microcontroller running at 120MHz. It comes with 512KB of flash, 128KB of RAM, 16-bit external bus, and a buffered internal DAC I'm going to use for audio (maybe). I needed more RAM, so I put a 512KB SRAM on the bus. I'm also using an Epson S1D13746 video controller. It has an internal frame buffer you can write to and it spits out s-video. It's intended for mobile applications, but has a lot of features that are useful for any embedded video system, such as double buffering, rotation, window support, etc. I have a micro SD slot for a flash card that will store ROMs, but I plan on switching to USB on the next board. I also wanted to use the NES joypads, so there's 2 connectors for those as well.
Here's what the board looks like now. It's a 4 inch x 3 inch 2 layer board, so the routing was a bit tight. Using an SOJ package for the RAM helped out a lot, and the analog and digital response actually ended up to be really good.
Originally I was going to start with a PIC32 or AVR32, but I got caught up in too much early optimization and it was making the project excessively limited. The AVR32 is more expensive, and the PIC32 has limited RAM and no external bus, so I decided to just use an ARM Cortex-M3 to start out with and get a platform designed that I could start working with. My intention is to move back to a lower powered micro, if possible, once I get the current system emulating basic mappers at 60 FPS. I'm at around 40 FPS right now on mapper 0 games, but I haven't done any PPU optimization really. It's all written in C and coded for simplicity just so I could get it functioning. I have some graphical glitches when scrolling, but once I figure that out I'll start rewriting for speed.
I'm using a 16-bit RGB pallette here.
Some more of the board.
The main 5V to 3.3V regulator has an exposed pad, so I hot plated the other ICs as well.
The predecessor. It was from another project and used a Wiznet microcontroller with a modified 8052 core. I was only getting 1 FPS on this My code is still written for an 8-bit micro, so when I change that, that should yield a significant bump in speed as well.
I'll post updates as I continue to make progress on the project if people are interested. I plan on open-sourcing it after it's fully functional.