This circuit generates a 640x480 VGA signal and renders an 160x120 16 color image in it. The resolution is limited by the memory capacity and speed. The parrot image is stored in the right EEPROM (32kB) as 4-bit "RGBI". This 150 ns grade ROM is barely fast enough to keep up with the pixel clock: in fact, technically it is slightly too slow, but it works nonetheless..
The low address byte comes from the X counter below counting from 0 to 199 (2 IC's). This counter is driven by a 25MHz clock that gets divided by 4 by a separate counter chip. The pixel ROM output includes the VGA H/V sync signals.
A 10-bit Y counter (3 IC's) enumerates the 525 VGA scan lines per frame and drives the left EEPROM (8kB). This left ROM selects the active display line by feeding into the pixel ROM's high address bits. Each line is programmed to be repeated 4 times this way. The vertical blank is programmed similarly.
The 3 control signals into the counters come from the ROMs. You can therefore say that this is a simple programmable computer with just 3 instructions: nextPixel, nextLine and nextFrame.
The pixel ROM's output is buffered by flip-flops to get stable pixels out. The 4-bit digital RGBI gets mixed with a bunch of resistors and diodes into analog RGB which then enters the VGA plug.
This project was completed in two days and included learning how to burn an EEPROM in two different ways using an Arduino: one of these ways revolves around not noticing that Vcc and GND are interchanged while debugging failing verifications, literally burning both the chip and the ZIF socket in the process. This explains the scorch marks on the left chip markings. Almost no other chips were harmed in this project.
The AT28C64-15 seems to have been obsoleted/discontinued, and a product search from my supplier of choice returned this as the closest replacement:
Unfortunately I am not yet knowledgeable enough to know from the datasheets if it really is a good replacement, but thought you might want to know and possibly update the parts list.