VGA1306 (VGA-out for DIY Arduboys implemented on an FPGA!)

The good thing about kickstarter is that if the goal isn’t reached then neither party loses anything.
(As long as you work out the cost and the shipping and what-not before hand.)

It would be great if you could add a audio out option.

I have this nagging that I need a consolized Arduboy in my life.

1 Like

VGA doesn’t include audio, so it doesn’t really have anything to do with this board. You could just add a separate audio mixer/amplifier on another board.

I could add flying monkeys and a hamster wheel… Either way adding the option for a board with audio out would still be a welcomed addition if going down the Kickstarter route.


I can’t imagine adding a jack would be to hard, but it might need another input pin or two to get the sound off the Arduboy.

(Presumably switching to DVI or HDMI would require a complete overhaul.)

That said, if you ever get into genetic research and managed to breed some flying monkeys,
I’d certainly be interested.
They’d certainly give my evil lair a bit of malevolent flare.
(Or at the very least give me an excuse to start saying “and your little dog too!”)

(Note to self: add flames to eyes of logo…)


I might have a peek at it later. I’ve only been tinkering around with VHDL in the past for a bit. So it may be a nice opportunity to do some Verilog

That doesn’t sound bad for a small production batch. I’ll keep them in mind.


Wouldn’t be too difficult - a lot of the information around for getting a ‘line level’ signal from an Arduino either suggests a simple circuit like this:

…or suggests using something like an LM386 because connecting directly to the pin could potentially cause havoc with power / current supply?

…another option could be seeing how @bateske would feel about talking with his contacts at Seeed and selling these boards in the Arduboy store? or integrating this design into an ‘official’ console version?

Or see if somewhere like Adafruit would be interested in producing them?

1 Like

For one of these to happen, I think as full as possible an implementation of the SSD1306 command set would be required, like invert, hardware scrolling, horizontal and vertical mirroring, contrast, etc.

At least if it were me selling them, I’d insist on it to avoid complaints and returns.

…some tweaks to the code, an old GameBoy DMG motherboard, and look what she can do now - gotta love FPGAs!


I’m dying to know what tweaks you made! How did you address the Gameboy having two data lines, and v and h sync?

Pins for the OLED emulation are:

  1. CLOCK
  2. DATA
  3. DC (effectively VSYNC)
  4. CS (which I’m using for inverse)

So I re-purposed the CS pin to use as the second DATA line, and ignored the GameBoy’s HSYNC - just writing the entire frame of pixels into a dual-port buffer, using VSYNC to signify the beginning of each frame. While simultaneously reading the pixels out of the buffer, and generating the VGA HSYNC & VSYNC!

1 Like

That’s fantastic! I’ve been watching for hardware DMG hacks for a while, especially where the display is concerned. I was toying with the idea of using 74 series logic to translate the signals to VGA or more likely, a nicer LCD panel.

I was also thinking SPI on a micro might work, though I’ve been at a loss for what to do with the second data pin. I’m not sure a uC would be fast enough though.

I got a 4 bit per clock LCD panel to work by doubling up the data pins, but obviously the image was smeared. I know I’m not breaking new ground here, but good info is hard to find.

I broke down and ordered a cheapo fpga dev board to play with with an integrated vga port the other day. I really like the look of your board. I like seeing Lego block solutions to stuff like this.

If you ever feel like making more, I’d probably be down for one. :slight_smile:

Hello @uXe,

I learned about your project from and I love it!

Any chance you could share the HDL code and/or PCB project?

1 Like

Hi! I’m also from Hackaday. I’m interested in getting one or two of these for the ZeroPhone, any chance you’re selling one, or maybe at least the PCBs? If desired, you can contact me directly on arsenijs at zerophone dot org. I can also help with routing if needed - I mostly use KiCad but I still remember some Eagle stuff =) I’m OK with not having the full command set support - ZeroPhone uses the bare minimum of commands, I’m mostly interested in using this for 1) presentation purposes 2) debugging screen drivers, and looking at the feature set, it seems to fit very well.

1 Like

Thanks for the feedback!

@Mpiazza I had the same idea at one point - to do it using logic ICs! Was thinking of a way to interface the GameBoy LCD signals into a FIFO RAM using only 74 series logic, and then have a Raspberry Pi read from the FIFO and act as an overpowered HDMI converter! :smile: Do you have any blogs / videos up of your work? I came to the same conclusion in the end as you have - FPGA is honestly the way to go! Let me know what FPGA dev board you have ordered, and we should be able to get the code running on it with a little tweaking?

@afiskon source is now up at

@CRImier will definitely E-Mail you, maybe we could do a trade - one of my boards for one of yours?! :slight_smile:


Testing on my little 7 inch portable LCD - not easy to take a good picture of it!

How many fps is it running the LCD at? How do you resolve there not being a vblank signal, obviously you are generating you’re own but since it it doesn’t match to the monitor refresh… or I guess there is just no vsync?

Sorry don’t fully know VGA spec. Either way the refresh rate looks really good!

60 FPS (it is standard 640 x 480 @ 60Hz), here are the timings:

There is no lock / sync in place at the moment between the Arduino and the FPGA, they are just simultaneously writing to / reading from the same dual-port RAM buffer - but I have not seen any tearing.

It would certainly be possible to lock the two together though - there are enough RAM ‘blocks’ available in the FPGA to be able to double-buffer (or even triple-buffer) frames if desired. And as you can see from the timings I linked to, there is 1.42999007ms of ‘VBLANK’ in between renders of the visible area - so plenty of time for switching buffers / or signalling from the Arduino (could use the CS pin for this).

Even more time available really, because the actual visible part is a centred 512 x 256 area (scaled up from 128 x 64) within the 640 x 480 frame.

Timings are slightly off on this batch of boards though - only because the minimum order quantity for a 25.175MHz oscillator is much more than the ten I needed, and so I ordered a 25MHz oscillator instead - analog VGA allows for a lot of tolerance though, have tested on five different monitors so far and they all recognise the signals as being ‘close enough’! :smile:


Thanks for mentioning the ZeroPhone.
It’s an interesting project.