Nope, you did great. I also would have accepted:
ram_read_pointer_x <= ram_read_pointer_x + ( 1 << pixel_per_byte );
So, you truly need me to prepare graphics...
Maybe on Sunday.
Next, X - Zoom, or scale. Also known as X period or horizontal period.
The setting is stored in ' period_x[3:0] '.
The goal, when 'period_x[3:0]' = '0', the picture you get should be the same.
When 'period_x[3:0]' = '1' then the picture should be twice as wide, or, every X pixel is repeated twice.
When 'period_x[3:0]' = '2' then the picture should be 3 times as wide, or, every X pixel is repeated 3 times.
When 'period_x[3:0]' = '3' then the picture should be 4 times as wide, or, every X pixel is repeated 4 times.
......
When 'period_x[3:0]' = '7' then the picture should be 8 times as wide, or, every X pixel is repeated 8 times.
You get the idea.
Around 3 controls left, then some fancy manipulation to get the text working.
Now you understand the text you saw was only a sprite set to 8 pixels wide, 1 bit color, 1 byte per line and 32 lines tall pointing to the letter 'A' in the GPU ram's current font. You could play with the base address to vertically shift the image to a new letter, or, increased the size of the window to show more letters as the font is stored vertically, all 256 characters in 1 straight line.
You also could adjust the bg_ & fg_ color to your liking, or, try 4 color mode messing up the graphic, but you would recognize a font squeezed half-width as 2 bits now generate 1 4 colour pixel. Also, now, the bg_color now would select which 4 colors in the palette would be used for those 4 possible colors.