Lab 11.19 - Runtime self-timed bridge_txrx_mux bring-up¶
Objective¶
Run the full bridge_txrx_mux overlay (TX + RX both wired through the PL
modem) using a self-timed burst-control sequence and determine whether either
tx_valid_count or rx_valid_count advances when both PL TX and PL RX are
active simultaneously.
Previous labs used bridge_rx_only (PL RX only) with the stock host TX as a
witness. This lab returns to the full bidirectional overlay and uses a
self-timed mode where the PL TX starts first, waits a fixed settle time, then
RX polling begins — mimicking a hardware timing controller.
Why self-timed mode¶
In the standard burst-control mode, the host sends a start command and
immediately polls rx_valid_count. If the PL TX path needs time to prime the
AD9361 DMA pipeline before the RX path becomes active, polling too early always
sees zero. Self-timed mode introduces a configurable TX-settle window before
RX polling begins.
Files¶
| Path | Purpose |
|---|---|
blocks/block_11_integrated_sdr_project/python/lab_11_19_runtime_bridge_txrx_self_timed_bringup.py |
self-timed full-overlay bring-up, JSON evidence |
Run¶
python blocks/block_11_integrated_sdr_project/python/\
lab_11_19_runtime_bridge_txrx_self_timed_bringup.py \
--bit-bin tmp/bridge_txrx_mux.wordswap.bit.bin \
--tx-settle-ms 250 \
--poll-limit 256 \
--run-tag self_timed_live
Self-timed sequence¶
load overlay → verify axi_gpreg ID
configure AD9361 (915 MHz / 3.84 MS/s)
assert burst_start
wait tx_settle_ms
↓
poll loop:
read tx_valid_count, rx_valid_count, received_bits
if rx_valid_count > 0 or received_bits > 0 → success
if poll_limit reached → timeout
↓
restore AD9361 → optional reboot
save JSON evidence
Parameter guide¶
| Parameter | Meaning | Try first |
|---|---|---|
--tx-settle-ms |
wait after burst_start before RX polling | 250 ms |
--poll-limit |
max RX counter read attempts | 256 |
--poll-delay-ms |
pause between polls | 20 ms |
--start-offset |
PL framer start offset cycles | 62 |
Interpreting the result¶
| Outcome | Meaning |
|---|---|
tx_valid_count > 0, rx_valid_count > 0 |
full bidirectional bring-up successful |
tx_valid_count > 0, rx_valid_count = 0 |
PL TX works; RX starvation persists |
| both zero | TX DMA not primed; check burst_start AXI write |
Live result on 2026-06-23¶
Self-timed runs consistently showed tx_valid_count > 0 (PL TX is live) but
rx_valid_count = 0 regardless of tx_settle_ms values up to 500 ms. This
confirmed that TX priming is not the limiting factor — the RX starvation is
independent of how long TX has been running before RX polling starts.
This result, combined with the evidence from Labs 11.15–11.18, shifted the investigation toward RTL-SDR external monitoring (Labs 11.20–11.25) to confirm that the TX signal is actually radiated, while the RX path investigation continues at the bitstream level.
Report checklist¶
- [ ] Record
tx_valid_countafter first poll withtx_valid_count > 0. - [ ] Record
rx_valid_countandreceived_bitsat every poll. - [ ] State
tx_settle_msvalue used. - [ ] Attach
dmesgtail. - [ ] Compare with Lab 11.15
bridge_rx_onlyresult.
Engineering conclusion template¶
The self-timed bridge_txrx_mux bring-up ran with tx_settle_ms = ____ ms and
poll_limit = ____. tx_valid_count reached ____ after ____ ms.
rx_valid_count after full poll window: ____. received_bits: ____.
TX priming is / is not the cause of rx_valid_count = 0 because ______.