When a Project Gives You Lemons, Make Your Own FPGA Board: HUB75E Driver FPGA
A great example of engineering your own solutions looking at the design and origin of the HUB75E driver FPGA board.
Laying out your own FPGA board is no trivial task, which is probably why you don't see it very often in the maker community. So when it does happen, the project behind it is pretty much guaranteed to catch your interest.
While browsing through the seemingly endless inventory of AliExpress, Rik (the author behind the Just another electronics blog), stumbled across a deal for a HUB75E 64×64 RGB LED matrix that was just too good to pass up. If you're not familiar, RGB LED matrices such as the HUB75E are what the video panels such as those in Times Square in NYC are made up of.
Rik quickly decided that although a fast microcontroller could drive this LED matrix panel, an FPGA is much better suited for this type of application given the constant refreshing needed by this particular panel in order to display an image. The HUB75E does not have any sort of on board memory or built in PWM control, the IC chips simply switch each LED on/off based on the serial data fed into them.
Each of the individual LEDs in the 64x64 matrix on the panel are driven by 16-channel constant current sink output LED drivers (ICN2038S) which are fed input data clocked out via shift registers to convert the serial data stream to parallel so a single port can be used to drive all of the ICN2038S chips (and therefore LEDs) at once. While this is an extremely simplified description of how each of the LEDs are driven, Rik goes into a great more technical description in his original project blog for getting the HUB75E up and running.
It is in this same blog post that he runs into the issue of his initial FPGA setup using a Diligent Arty board with a custom PMOD breakout turning the test setup into a spaghetti-like mess, which wasn't exactly ideal for mounting to the back of the HUB75E. There was also the issue of not being able to leave the LED panel as a permanent setup if he ever desired to use his Arty board for another project.
Nothing a custom board layout can't solve. Based upon parameters such as memory requirements for the framebuffer code and the need to interface with a host PC to receive image files from to display on the HUB75E, Rik established the following parameters for his custom FPGA board:
- An FT232H for communication between the FPGA and PC.
- iCE40UP5K FPGA for its on board SRAM, affordability, and compatibility with the FOSS tools.
- 74HCT245 level shifters to upconvert the voltage levels of the IO signals coming from the FPGA to the required 5V the ICN2038S chips need.
- EEPROM for the FT232H's configuration.
- SPI flash for the FPGA to store and load its bitstream from.
- A power supply to feed each of the components on the board (powered by the USB C connector).
Detailing out the hardware build of the FPGA in a follow up blog, he ordered his boards with black solder mask with white silkscreen from PCBWay (also a favorite of mine for their quick turn around times and affordability) so that it would blend in with the back of the LED panel.
Taking advantage of the IO connector on the back of the HUB75E as the mount for the FPGA and the USB C also breaks out to provide the 5V power rail for the HUB75E itself.
And what better way to mark your success than with the baby fist pump meme...
Overall, this project is a great reference point for the process of identifying the need for a custom FPGA layout, determining board and peripheral requirements based on the elements of the project, and identifying dual use resources to optimize the board as much as possible. A couple of my favorite twists in this project included the use of FOSS toolset to synthesize the HDL design since it demonstrated a clear advantage for the design over the traditional FPGA vendor EDAs. And the use of SpinalHDL instead of VHDL or Verilog since it's a slightly higher level HDL language and allowed for the implementation of the framebuffer in only a few lines of code.
Check out the project code on GitHub and follow Rik on his blog here.