FPGA computer has got a new VGA mode: 640x480 in two colors. One byte of
the video memory holds 8 pixels, each being 1 or 0 (white or black):
Pixel 7
|
Pixel 6
|
Pixel 5
|
Pixel 4
|
Pixel 3
|
Pixel 2
|
Pixel 1
|
Pixel 0
|
If you want to put four white and four black pixels at the top left corner of the screen (from the
(0,0) to the (7,0) coordinates), you need to type:
mov.w r0, 0xF0st.b [1024],
r0This mode is made out of existing
VGA text
mode, since it does almost all the job. The text mode shows characters made of 8x8 pixels on the 640x480
VGA screen. I have inserted additional Verilog code inside the text mode module, in a way that when the
640x480x2 mode is set, it shows the pixels, not the characters.
First of all, the programmer needs to set
the display mode to 640x480x2:
mov.w r0, 2out [128], r0The VGA
module detects this and changes the signal generation on the VGA connector:
if (valid)
begin if (vga_mode == 0) begin r <= inverse ^
(pixels[7 - (x & 7)] ? !curr_char[6+8] : curr_char[2+8]); g <= inverse
^ (pixels[7 - (x & 7)] ? !curr_char[5+8] : curr_char[1+8]); b <=
inverse ^ (pixels[7 - (x & 7)] ? !curr_char[4+8] : curr_char[0+8]);
end else if (vga_mode == 2) begin r <= inverse ^
(curr_char[15 - (x & 15)]); g <= inverse ^ (curr_char[15 - (x &
15)]); b <= inverse ^ (curr_char[15 - (x &
15)]); endend
What we see above is the Verilog code that sets the R, G and B wires of the VGA connector to the
corresponding values, depending of the display mode. If the mode is text (
vga_mode == 0), it
outputs the font pixels of the character that was found in the video memory (
pixels module
returns actual pixels of the
current_char register). However, if the mode is graphics
(
vga_mode == 2), then the actual byte found in the video memory is outputted to the wires
(actual bits of the byte are pixels).
All this means is that
current_char register
holds two bytes from the video memory, and it is periodically loaded from the video memory. At the beginning, it
is loaded from the very first word of the video memory, and after that VGA module loads two bytes of the video
memory periodically:
- at the end of each character in text mode, it fetches the next character,
- at the
end of each 16 pixels of the graphics mode, it fetches next 16 bits (pixels),
- at the end of each scan line
it fetches the content of the beginning of the next scan line,
- at the lower right corner scanline end, it
fetches the content of the top left corner.
This is the photo of the actual monitor:
And, this is the screenshot of the emulator:
Conclusion
Before this feature was introduced, the FPGA computer had two video
modes:
-
text 80x60 mode characters text mode (made of 640x480 pixels and each character
is 8x8 pixels in size).
-
graphics 320x240 mode, each pixel being in one of 8 colors.
This new mode
is added to the existing VGA text module (80x60 characters) since that module already works with 640x480 pixels.
The only additional thing was to show pixels, not characters. So, the computer now has one more mode: 640x480 in
two colors (black and white). You can look at the Verilog code:
https://github.com/milanvidakovic/FPGAComputer32/blob/master/vga_module.vAnd,
you can look at the assembly code which draws everything here:
https://github.com/milanvidakovic/Assembler32/blob/master/raspbootin/graphics640.asm