Isle Display Modes
Published 01 Aug 2025, Updated 18 Dec 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 display and bitmap graphics chapters. If you're new to the project, read Isle FPGA Computer for an introduction.
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:
- Share the same vertical resolution; easy to adapt graphics for 16:9 and 4:3
- Pixel clocks within the range of affordable FPGAs (65 and 72 MHz)
- LCD panels readily available (new and from old computers)
- Supported by most computer displays
- Lend themselves to efficient memory use for bitmap graphics
However, these resolutions aren't suitable for everything, so the Isle display controller includes a total of 5 modes (all with a 60 Hz refresh rate), and it's easy to add your own:
- 640 x 480
- 1024 x 768
- 1366 x 768
- 672 x 384
- 1280 x 720
In the following discussion, kpix refers to 1024 pixels, a handy unit of measurement when considering graphic memory use.
640x480 is still just about a lowest common denominator. However, I decided against adopting 640x480 as a primary resolution as most displays these days are widescreen, and it's pixel count of 307,200 (300 kpix) doesn't fit well into 64 KiB (512 kilobits) of vram.
672x384 is custom-designed for simulations (Verilator/SDL), matching our native bitmap resolution and improving performance versus simulating higher resolutions. 672x384 has 258,048 pixels (252 kpix), which fits well into 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 displays typically use 1366x768 panels and scale the video up, which blurs text and simple graphics. By slightly cropping widescreen graphics, Isle supports 720p displays automatically (WIP).
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. If you do want to support 1080p, you can use the same approach as for 720p (above).
I have a blog post covering many standard display timings: Video Timings: VGA, 720p, 1080p.
Bitmap Resolution
Isle bitmap graphics are flexible, but it's helpful to define default resolutions that work well with our display modes and 64 KiB vram. We have low and high resolutions with different horizontal resolutions for widescreen and 4:3.
- LoRes: 336x192 (63 kpix) and 256x192 (48 kpix)
- Dual 16-colour (4-bit) buffers
- Single 256-colour (8-bit) buffer
- HiRes: 672x384 (252 kpix) and 512x384 (192 kpix)
- Dual 2-colour (1-bit) buffers
- Single 4-colour (2-bit) buffer
Keeping to 64 KiB of vram allows Isle to run on small, low-cost FPGAs, and I believe we've achieved a good balance here, with colourful and high-resolution options 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.
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 bitmap graphics chapter.
Isle has a dedicated Unicode text mode that you can overlay on bitmap graphics. You can have colourful graphics and good-quality text.
Resolution Summary
The follow table summarises Isle graphics resolutions, including text mode.
| Resolution | Native | 1366x768 | 1024x768 | 1280x720* |
|---|---|---|---|---|
| Text Mode | 84x24 | 84x24 | 64x24 | 80x22 |
| LoRes | 336x192 @2x | 336x192 @4x | 256x192 @4x | 320x180 @4x |
| HiRes | 672x384 @1x | 672x384 @2x | 512x384 @2x | 640x360 @2x |
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.
Isle includes the rgbconv tool to convert to/from 15-bit and 24-bit colours.
Next step: Display or Isle Index