The GA144 can drive a VGA display at 640x480 with no extra components. Using digital pins for the sync signals and analog for the RGB signals works quite well.
The connections are all made to headers J21 and J27. I got much better results connecting the ground signal to the DB25 shell, instead of the ground signal lines.
port | header | signal |
---|---|---|
GND | J27.1 | GROUND (black) |
713.ao | J27.5 | blue |
717.ao | J27.7 | red |
617.ao | J21.1 | green |
417.17 | J21.4 | HSYNC (white) |
317.17 | J21.5 | VSYNC (yellow) |
The code is part of the GA144 toolchain at https://github.com/jamesbowman/ga144tools in vga.ga.
Running the loader:
python asm.py /dev/ttyUSB0 vga.ga
should give one of these VGA outputs patterns
Here is the node layout:
Each purple node 500-515 produces RGB pixels and sends them south. Blue nodes 400-415 collect their outputs and pass the pixel stream into the VGA timing generators 416 and 417. The color values pass up to the analog outputs 617, 717, 713. Nodes 417 and 317 drive the two synchronization signals.
A VGA 640x480 picture is clocked at 25 MHz, so each pixel takes 40 ns. This is enough time for GA144 to execute 8-32 instructions -- not really long enough to do anything interesting. So this design uses 16 pixel generators, all running in parallel. At the top of the screen, the nodes all start working on pixels 0-15. Then when these are done they work on pixels 16-31, then 32-47 etc. With 16 pixel generators, the code can take 640 ns for each pixel.
The pixel generators all produce a color as a fixed function of input (x, y) coordinates. There are several sample generators: RAMPS, CHECKER, CIRCLES, RANDOM. The line:
define(BODY, CHECKER)
in the code selects the generator.