Isle Display Modes

Published 01 Aug 2025 (DRAFT)

Over the years, I've experimented with many resolutions and colour depths for my FPGA projects. For Isle, I think I've struck the right balance between simplicity, resolution, and display support. However, these are just the display choices I've made. I've designed Isle so that you can easily make different choices when it comes to graphics and video output.

This page accompanies the chapter on Display and forthcoming chapter on Bitmap Graphics.

Display Resolution

I wanted Isle to support 16:9 and 4:3 displays while minimising the differences between resolutions. I've settled on two primary resolutions, 1366 x 768 for widescreen and 1024 x 768 for 4:3. While not the most obvious choices, these resolutions have significant advantages:

However, these resolutions aren't suitable for everything, so the Isle display controller includes 5 modes (all with a 60 Hz refresh rate), and it's easy to add your own.

  1. 640 x 480
  2. 1024 x 768
  3. 1366 x 768
  4. 672 x 384
  5. 1280 x 720

640x480 remains the lowest common denominator for displays and works almost everywhere, but it isn't ideal for Isle. Isle graphics are based on 672x384 or 512x384, neither of which fits well in 640x480. I decided against adopting 640x480 as the primary resolution as most displays these days are widescreen, and it's pixel count of 307,200 makes it difficult to fit into 64 KiB of vram.

672x384 is custom-designed for simulations (Verilator/SDL), matching our default bitmap resolution and improving simulation performance. 672x384 has 258,048 pixels, which fits well into our 64 KiB of vram.

1280x720 is good for TVs and video capture. So, why not 1280x720 as the primary resolution? 1280x720 LCD panels are rare. 720p TVs typically use 1366x768 panels and scale the video up, which isn't good for text or simple graphics. However, I wanted to support 720p for TVs and video capture, which we can do by cropping 672x384 bitmaps (discussed in the next chapter) to 640x360.

You'll notice that 1920x1080 is not on this list, despite being the most prevalent resolution for TVs and computer monitors. The reason is frequency. A standard 1920x1080p60 display timing runs at 148.5 MHz. When encoded for DVI/HDMI using TMDS, this requires I/O at 1,485 MHz. 1.5 GHz is beyond the capabilities of small FPGAs, at least those without transceivers.

I have a blog post covering many standard display timings: Video Timings: VGA, 720p, 1080p.

ULX3S dev board connected to 1024x768 LCD panel via HDMI to LVDS adaptor.
Driving a 1024x768 LCD panel.

Bitmap Resolution

Isle's bitmap graphics come in two resolution levels that match the recommended display modes. Given we have 64 KiB of vram, we can support the following:

Keeping to 64 KiB of vram is vital for Isle to work with small, low-cost FPGAs, but I believe we've achieved a good balance here, with colourful and high-resolution graphics for widescreen and 4:3 displays.

Looking at computer history, we can see there's a jump in what's possible once we reach a horizontal resolution of around 600 pixels: GUIs, paint programs, music software, strategy games, and high-quality text. Above 600 pixels, things become sharper and more detailed, but the advantages are more modest, and the hardware demands rise quickly. Early computer programmers and users were prepared to sacrifice colour to reach a high horizontal resolution.

Our vram is bit write, so even in monochrome mode, the graphics engine can update individual pixels directly. You can read more about the hardware design of vram in the (forthcoming) chapter on Bitmap Graphics.

PS. Isle has a dedicated Unicode text mode that you can overlay on bitmap graphics. You can have colourful graphics and high-quality text. I'll be writing about text mode soon.

Colour Palette

Isle uses a 15-bit (RGB555) colour palette; a pragmatic choice between the range of colours and hardware resources. Each channel of red, green, and blue has 32 possible values, ranging from 0x0 to 0x1F in hexadecimal. Two 15-bit colours fit into a 32-bit word. 16-bit (RGB565) offers more colours by assigning an extra bit to green, but this gives greys a colour tint and makes it harder for people to interpret colours values. Instead, we use the 16th bit for transparency and other effects.

Contemporary computers almost invariably use 24-bit colour (RGB888). However, using 24-bit colour doubles memory storage and bandwidth requirements for relatively little gain for our simple graphics system.

I also considered 12-bit (RGB444) colour, but it still consumes two bytes of memory while reducing the colour palette from 32,768 to 4,096 colours. The main advantage of 12-bit colour is that it's easy to read as three hex digits, e.g. 0xFC0 for bright yellow.

Next step: Display or Isle Index