As already described in my article about the BeagleBone Black the project consists of several steps which all must work together to bring the display to life. The first step was to develop an hardware interface which was able to drive the LEDs from content generated by the BeagleBone Black. I decided to use an FPGA which acts like a memory device towards the BeagleBone Black so I could use its general purpose memory controller (GPMC). This is a very fast interface and also rather simple to implement on the FPGA side as I am using the FPGA's block RAM modules as a dual-port RAM. Using this approach no clock synchronisation is needed between the two devices. The FPGA then sends the pixel data using the HUB75 protocol towards the LED matrices. As a first prototype I used the LOGI-Bone, but then built my own PCB. With this first revision of the PCB, which was very similar to the LOGI-Bone, I managed to display data on 4 LED matrices and could show that my approach works.
The next step was to decide the final size of the LED display. I opted for 8 × 5 modules of 32 × 32 pixels each with a 5 mm pixel pitch, which results in a resolution of 256 × 160 pixels and an aspect ratio of 16:10. The determining factors where
- At least 160 × 144 pixels resolution to be able to run a GameBoy emulator with native resolution
- A 16:10 or 16:9 aspect ratio for movies
- A manageable physical display size
- Less than 1k€ for LED modules
- Pixel data should fit into the FPGAs block RAM and the FPGA should be affordable and available in single quantities
As the 40 modules will need 80 kB of block RAM I choose a Xilinx Spartan 6 XC6SLX25-FTG256, which provides 52 block RAM modules of 18kbit each. As the I/O banks of the FPGA will run from 3.3V, but the ICs on the LED modules run from 5V, I added SN74ACT244 drivers to each output to have better voltage levels when using high frequencies on the HUB75 interface. This was one major thing I learnt from playing around with my first prototype. The XC6SLX25-FTG256 comes in an 256-pin BGA package and I had to use at least four layers for the PCB. You can find the complete schematics and gerbers for the PCB at the hardware repository.After receiving the PCBs the next challenge was to migrate the VHDL code from the old prototype board to the new version. Getting to run the old code on the new FPGA was rather easy, but as I wanted to use one HUB75 interface per row so that I could achieve higher framerates, almost everything of the code had to be rewritten to be scalable. As I only had four modules so far, testing the new code was trickier than thought, but at the end I was pretty sure that everything should work with 40 modules. The FPGA now gets its data as RGB565 pixel data (16bit) from the BeagleBone Black and then does a gamma correction to get a 10bit hardware depth with is then done using a time-dithered PCS for brightness with additional global brightness by changing the blanking times. The global settings can be configure via an I²C connection between the FPGA and the BeagleBone Black. Before ordering the 40 modules I also had to think about powering them. The modules I already had drew up to 2.2A when all LEDs were lit up at full brightness. So I estimated that I will need about 90A to supply everything not accounting for any losses in the cabling. 90A is a rather huge current, where you have to start thinking about losses in your cabling. To reduce those to a minimum I decided to use a big copper busbar at the backside of the display. To be able measure the power used by the LED screen I ordered an LEM HO 100-S current transducer. As a power supply I chose a cosel PLA600F-5 5V 100A power supply. Now I ordered 40+2 modules from Aliexpress. As it is difficult to get the exact same modules later on I ordered two modules as a spare. Three weeks later and only two weeks before the Maker Faire I finally received the modules. As I wasn't sure about the exact dimensions and positions of the mounting holes of the modules I wasn't able to design the exact mounting parts before, so I started immediately and then went to the local fablab, Die Werke, the next week-end to built it up. I took me around 8 hours of laser cutting to build two layers of 5mm MDF, which assure the perfect alignment of the modules. The add additional stability and especially torsion-resistantancy I mounted a framework of OpenBeam aluminium extrusion profiles.
After everything was built up I applied power, booted the BeagleBone Black and everything worked! But after five minutes the power supply started doing weird noises and died a few seconds later. What a bummer! I did some analysis and was pretty sure that everything was fine with my display and I was able to run it partly (one row at a time) from my bench power supply. So I ordered an MSP-600-5 5V 120A power supply from MeanWell as a spare part. I received it two days before the Maker Faire and with that power supply everything run fine.
The next steps will be to fix minor issues (e.g. some ghosting) and improve the design (power supply supervision, measure power consumption, even more sturdiness, maybe HDMI input, ...).