Close

Quick test bitstream for ya

A project log for BARCO NX-4 GROUP REVERSING ADVENTURE

This a project for a group of folks working to reverse engineer the Barco NX-4 LED panels.

richard-aplinRichard Aplin 10/31/2017 at 22:1312 Comments

I've got a bit carried away in the weeds with adding bells and whistles to my xilinx stuff (and it's broken right now) but I uploaded a .bit and .svf (use whichever your jtag supports), which zips some pixels along the top row of each scan. It's just a very rough thing from last week so you can see some pixels light up.

Programming this image won't affect your board; reset it and it's back to normal.

Note that on this image I used pin 7 on the input connector (that's the male connector on the left of the back, the top-left pin) as a chip reset, so jumper it to GND to make stuff work. 

Discussions

Ian Hanschen wrote 11/01/2017 at 05:01 point

Richard, the whole purpose of the 12 bit space is to allow for a gamma ramp of the intensity values.

  Are you sure? yes | no

Richard Aplin wrote 11/01/2017 at 19:38 point

well sure, it's great they used a 12-bit driver, I find 8 bits insufficient for LED modulation, I usually go for 10 to 12 myself depending on the required dynamic range (I used 16 bits on a 500W RGB driver I did) but in terms of the pixels you send to the NX4, I feel 8 bits is ample. In the xilinx stuff I'm playing with I use two 8-bit frame buffers, then upconvert to 12 bit via a lookup table before blending and global intensity control

  Are you sure? yes | no

Ian Hanschen wrote 11/02/2017 at 00:00 point

Gotcha. I've been using 10 in my designs. Upload that source :)

  Are you sure? yes | no

modder_mike wrote 11/02/2017 at 00:06 point

Curiously, Barco claims the NX-4 system is capable of 16-bit colors.  Not sure yet how they manage that, some magic with the grayscale input maybe.

  Are you sure? yes | no

Ian Hanschen wrote 11/02/2017 at 18:33 point

Maybe they're using the dot correction on top of the 12 bits?

  Are you sure? yes | no

Richard Aplin wrote 11/02/2017 at 19:37 point

They could be using the dot correct for extra bits (although I'm not sure it works like that, the datasheet is a bit unclear, but you don't get any light output if the d.c. is set to zero). They could also be dithering the pixels; if the max TI driver clock rate is 20mhz and you have to load (16x3x6rows=288) pixels per frame (*12 bits=3456) then you can refresh the tile at 5.7khz; a 4-bit temporal dither on that would still give you 361fps so it sounds doable ... but I think it's more likely just marketing; 16bpp is an extremely high resolution for a small LED.

  Are you sure? yes | no

Ian Hanschen wrote 11/01/2017 at 03:56 point

Scratch my request - I'm up and running with verilog.

  Are you sure? yes | no

modder_mike wrote 11/01/2017 at 01:47 point

I can confirm that this bitstream works, although mine displays on row 4... go figure.  Also the first LED on each segment is stuck on red, is that an intentional feature?

  Are you sure? yes | no

Richard Aplin wrote 11/01/2017 at 19:33 point

yeah that's how it's meant to to look, was just random testing  :-) The row select is an odd one; mine displays on the second row of six but I imagine it's fairly arbitrary. Clearly the CPLD on the front PCB expects some sort of control sequence to step through the rows. It's odd they put that chip on there; I can't quite see what their thinking was, it doesn't seem necessary; I'd kinda expect just three control lines from the main FPGA (row select 0..7) or even just 6 discrete row select lines. hmm

  Are you sure? yes | no

Ian Hanschen wrote 11/01/2017 at 01:45 point

Upload the code :) I need a project to start with since I'm new at this Xilinx toolchain.

  Are you sure? yes | no

Richard Aplin wrote 10/31/2017 at 22:23 point

btw the 8->12 bit conversion doesn't result in any meaningful loss of visual resolution; the eye's response means that much of the 12bit space isn't useful (looks the same) so I used the cie1931 curve to upconvert it. 

  Are you sure? yes | no

Richard Aplin wrote 10/31/2017 at 22:17 point

By 'carried away' I mean I've implemented dual framebuffer (so you can load one while displaying the other) with programmable fading between the two, SRAM and Flash controller, 8 bit -> 12 bit pixel conversion via a programmable lookup table,  and in terms of host interfaces SPI interface and WS2812 emulation (UART, I2C etc coming).  I'm still wrinking out various bugs, and I still haven't figured out the row mux select yet (!) but hey... Verilog is fun

  Are you sure? yes | no