This guide assumes you are building the controller from source for a PYNQ-Z2 and using a direct Ethernet link from a host computer to the board.
Required:
- PYNQ-Z2 board.
- MicroSD card that can boot the board.
- USB cable for JTAG/UART.
- Ethernet cable from host to PYNQ-Z2.
- 5 V power supply sized for the LED load.
- WS281x-compatible pixels or downstream line drivers.
- Shared ground between the board-side signal interface and LED power supply.
The PYNQ-Z2 PL pins are 3.3 V LVCMOS outputs. Many WS281x installations need level shifting, buffering, fusing, power injection, and careful grounding. The FPGA pins are signal outputs only; do not power LED strips from the board.
Install and expose these tools on PATH:
- Vivado
- Vitis
- Bootgen
- XSDB
hw_server- Python 3
make- A C compiler for host tests, exposed as
gccor viaHOST_CC=<compiler>
Install the PYNQ-Z2 board files before make hw. The build script requires board part:
tul.com.tw:pynq-z2:part0:1.0
See PYNQ-Z2 board files for the expected installation model. Dawn does not vendor these files in the repo.
Install Python dependencies:
python -m pip install -r requirements-regs.txtUsing a virtual environment is recommended if you do not want PeakRDL and pyserial installed globally.
Run the normal source build:
make clean
make check
make hw
make ps
make bootOutputs:
build/vivado/dawn_controller.xsabuild/vivado/dawn_controller.runs/impl_1/dawn_system_wrapper.bitbuild/sd/BOOT.BIN
BOOT.BIN contains the FSBL, FPGA bitstream, and bare-metal Dawn controller app.
Connect the USB cable and start the controller:
make runIn a second terminal, stream UART telemetry:
make serial-ports
make logsIf auto-detection selects the wrong port, specify it:
make logs PORT=COMxExpected startup lines include:
dawn controller starting
strand_config active_outputs=30 ... total_pixels=3390 ... expected_universes=20
foundation ready source=e131
e131_status link=...
After make boot, copy this file to the FAT partition of the PYNQ-Z2 SD card:
build/sd/BOOT.BIN
Insert the SD card, set the board for SD boot, power cycle, and use UART logs to confirm startup.
Use a direct Ethernet link from the host to the PYNQ-Z2.
Configure the host adapter manually:
IP address: 192.168.7.1
Netmask: 255.255.255.0
Gateway: blank or 0.0.0.0
The board listens at:
IP address: 192.168.7.2
UDP port: 5568
These defaults are generated from hw/regs/pl_control.rdl into ps/tools/generated/pl_config.py and ps/app/generated/pl_config.h.
With the controller running and UART logs open, send a generated E1.31 pattern:
make e131-sendUseful direct sender commands:
python ps/tools/e131_send.py --pattern bars --packet-count 10 --rate 30
python ps/tools/e131_send.py --pattern chase --duration 20 --rate 30
python ps/tools/e131_send.py --outputs 30 --pixels-per-output 113 --pattern white --packet-count 1The sender is transmit-only. Use UART telemetry as the source of truth.
Successful receive should show these counters increasing:
rx_packets
e131_valid
frames_committed
complete_frames
Rejected packets increment e131_rejected. Common causes are the wrong destination IP, wrong UDP port, wrong first universe, preview packets, malformed packets, or universes outside the configured active frame.
Configure show software for unicast E1.31/sACN:
Destination IP: 192.168.7.2
UDP port: 5568
First universe: 1
Color order: RGB
Universe size: 510 channels
The controller consumes a linear output-major RGB stream:
Output 0 pixels first, then output 1, then output 2, and so on.
For the default 30 outputs by 113 pixels per output:
Pixels: 3390
RGB channels: 10170
Universes: 20
For maximum 30 outputs by 1024 pixels per output:
Pixels: 30720
RGB channels: 92160
Universes: 181
The PL frame word format is 0x00RRGGBB. E1.31 input is normal RGB slot order.
Use make serial-ports if UART does not open. Close other serial terminals, Vitis consoles, or Vivado terminals if the port is busy.
If make run fails to connect, unplug and reconnect USB, close stale Xilinx tools, then rerun. The wrapper starts hw_server and writes logs under build/jtag/.
If no packets arrive, verify the host adapter IP, destination IP, UDP port, firewall rules, and direct Ethernet cabling.
If packets arrive but frames do not commit, check e131_rejected, last_error, last_universe, and expected_universes in UART logs.
If LEDs flicker or show wrong colors, verify shared ground, level shifting, output mapping, color order, strand length, and whether the physical output needs inversion.