Page 6 · Receiving it in an FPGA

Zynq-7020 CSI-2 Receiver

The Zynq-7000 family has no hard MIPI PHY and no CSI-2 controller. The receiver is built from general-purpose HR-bank I/O, an external resistor network, the SelectIO deserializers, and fabric logic. It works well at the AWR2243's 600 Mb/s per lane.

PS2 × Cortex-A9, up to 667–866 MHz by speed grade
PL85K logic cells, 53,200 LUTs, 106,400 FFs
Memory / DSP140 × 36 Kb BRAM (4.9 Mb), 220 DSP48E1
I/OHR banks only, VCCO 1.2–3.3 V; no HP banks
PS–PL data4 × 64-bit AXI HP ports, ACP, GP ports
MIPINo hard PHY. Soft receiver with XAPP894-style network

The public teardown photo shows the automotive XA7Z020 on the radar board, paired with 1 Gb of DDR3L on a 16-bit bus. The receiver itself uses a small fraction of the device; the fabric budget goes to the range FFT and data reduction that follow it. The design is the same on a 7010, which has about a third of the 7020's logic.

Why an external network is needed

A D-PHY receiver needs 1.2 V CMOS LP inputs, a differential HS receiver near a 200 mV common mode, and a termination that switches in and out within tens of nanoseconds. A 7-series HR bank can do the first two on separate pins at VCCO = 1.2 V, but it cannot switch its internal termination at run time, and its internal 100 Ω DIFF_TERM is only available when the bank runs at 2.5 V. So the termination and the HS/LP split move onto the board.

Dp from sensorDn from sensorresistornetworkfixed, not switchedZynq HR bank (VCCO = 1.2 V)IBUF HSUL_12 / LVCMOS12IBUF HSUL_12 / LVCMOS12IBUFDS differentialLP Dp → SoT logicHS data → IDELAY → ISERDESLP Dn → SoT logic
Four FPGA pins per lane: an HS pair and two LP inputs. The network is a compromise. It terminates well enough for HS at the rates a 7-series HR bank can capture, and stays light enough that the sensor's LP drivers still reach the 880 mV VIH threshold. Use the topology and values from XAPP894 for the exact part.

The datapath

BoardPL (Artix-7 fabric, HR bank)PSR networkXAPP894R networkclock laneIBUFDS (HS)IBUF ×2 (LP)IDELAYE2ISERDESE21:8 DDRLP stateSoT detectsync search0xB8, bit-slip× 4 data laneslane merge4 B / byte clkpacket parserECC · CRC · DT/VCasync FIFObyte clk → AXI clkAXI DMA / VDMAS2MMIBUFDSBUFIO300 MHzBUFR ÷475 MHzCLKCLKDIV = byte clockS_AXI_HP064-bit, to DDR ctrlDDR controller→ DDR3 / DDR3LCortex-A9 ×2IRQ on frame end
A soft CSI-2 receiver on Zynq-7000. The HR bank cannot be a D-PHY by itself, so an external network splits each lane into an HS pair and two LP inputs. The clock lane drives BUFIO and BUFR, which clock the ISERDES in its own region. Everything after the ISERDES is ordinary fabric logic, and the PS sees only a DMA writing frames into DDR.

1. Capture: IDELAY and ISERDES

Each lane's HS input goes through an IDELAYE2 (78 ps taps with the 200 MHz IDELAYCTRL reference) into an ISERDESE2 in DDR mode with a 1:8 ratio. The clock lane's HS input enters on a clock-capable pin (MRCC or SRCC) and drives two regional buffers:

BUFIO and BUFR only reach their own clock region, so the clock lane and all four data lanes of one link must sit in the same bank and region. Two cascaded AWR2243s need two banks with their own clock-capable pins. On the 7020 in CLG400 that is banks 34 and 35, which also have to carry everything else in the PL.

D-PHY places the clock edge in the middle of the data eye, so in principle no delay is needed. In practice per-lane trace skew and the IBUFDS/BUFIO insertion delay shift the sampling point. Set IDELAY taps per lane, either fixed from a calibration sweep at bring-up or adjusted in the field by sweeping taps and watching the ECC error count.

600 Mb/s is well within the HR-bank ISERDES range on any speed grade. AMD's D-PHY IP lists 7-series throughput at line rates up to 1,250 Mb/s; check DS187 for the exact limit of your speed grade before going higher.

2. Burst detection and byte alignment

The LP inputs feed a small state machine per lane that detects LP-11 → LP-01 → LP-00 and starts an HS-SETTLE timer, counted in byte clocks. After the timer expires, a sync search looks at two consecutive deserialized bytes (16 bits) for 0xB8 at each of the eight bit offsets. The match offset drives either the ISERDES BITSLIP input or a barrel shifter in fabric. The lane then outputs aligned bytes until it returns to LP-11.

3. Lane merge

Lanes find sync on slightly different byte clocks. A shallow FIFO per lane absorbs that. Once all four lanes report sync, the merger reads one byte from each in lane order and outputs 32 bits per byte clock. When the word count says the packet has ended, it stops each lane at the right byte and ignores the trail.

4. Packet parser

5. Clock crossing and DMA

The receiver runs on the recovered 75 MHz byte clock, which only exists while the sensor is running. An asynchronous FIFO moves data to the system AXI clock (for example 150 MHz) before anything else. Then a DMA engine writes it to DDR through an HP port:

Bandwidth is not tight. One AWR2243 peaks at 300 MB/s; two peak at 600 MB/s. A 64-bit HP port at 150 MHz moves about 1.2 GB/s. DDR3 at 1,066 MT/s gives about 2.1 GB/s peak on a 16-bit bus and 4.3 GB/s on 32-bit, roughly 60–70% of that in practice. The pressure comes from the PS and PL reading the same DDR for FFTs while new frames land. Ping-pong frame buffers and a few KB of BRAM FIFO per link (one chirp's worth) keep a DMA stall from dropping data. A full frame from both chips (2 × 512 KB in the example on the AWR2243 page) is small next to 128 MB of DDR.

Three ways to build it

ApproachWhat you getTrade-offs
AMD MIPI CSI-2 RX Subsystem (PG232) with the D-PHY IP (PG202)D-PHY RX, CSI-2 controller, ECC/CRC, AXI4-Stream out, AXI4-Lite registers7-series supported with an external network and manual clock-pin choice. Fastest route to a working link. Built around video formats, so a radar data type may need configuration care.
Custom RTL on SelectIO primitivesExactly the blocks above, sized for one data type and rateSmallest footprint and full control over error handling and time stamps. You own the verification and the timing closure.
Bridge chip (CSI-2 to parallel, e.g. Toshiba TC358746-class, or a Lattice CrossLink)A hard D-PHY receiver; the FPGA sees a parallel bus or LVDSNo resistor-network risk. Adds a part, power and board area, and the parallel side may cap throughput.

Constraints sketch

## One 4-lane link, 600 Mb/s, bank 35 at VCCO = 1.2 V (pins are placeholders)
create_clock -name csi_bitclk -period 3.333 [get_ports csi_clk_p]

set_property IOSTANDARD LVDS_25  [get_ports {csi_clk_p csi_d_p[*]}]
set_property DIFF_TERM  FALSE    [get_ports {csi_clk_p csi_d_p[*]}]
set_property IOSTANDARD HSUL_12  [get_ports {csi_lp_dp[*] csi_lp_dn[*]}]

## BUFR is CLKDIV for the ISERDES; Vivado derives the /4 clock.
## Data capture is source-synchronous on BUFIO; per-lane alignment
## comes from IDELAY taps and sync search, not from input-delay constraints.
set_property IODELAY_GROUP csi_grp [get_cells -hier *idelay*]
set_property IODELAY_GROUP csi_grp [get_cells -hier *idelayctrl*]
set_clock_groups -asynchronous -group csi_bitclk -group clk_fpga_0

Failure modes from bring-up

SymptomLikely cause
No SoT ever detectedLP-11 loaded below 880 mV by the network or ESD parts; LP pins in a bank at the wrong VCCO.
Byte clock present but no sync foundHS-SETTLE too short or too long for the lane rate; data lanes not in the clock lane's region; P/N swapped on one lane (sync appears inverted).
Headers parse, CRC fails on every lineWord count or lane count mismatch with the AWR2243 configuration; lane merge order wrong.
Occasional ECC or CRC errors that move with temperatureIDELAY taps near the eye edge. Re-sweep at hot and cold corners and center the taps.
Errors that correlate with TX on or particular chirp profilesSupply noise or coupling from the RF section into the receiver or the clock lane. Check the 1.2 V bank rail and routing near the PA and LO.
Data good, frames dropped under loadDMA or DDR stalls while the PS runs FFTs. Deepen the FIFO, use ping-pong buffers, check HP port QoS.

Questions to expect

The Zynq-7000 has no MIPI PHY. How did you receive CSI-2?

With an external resistor network that splits each lane into an HS differential input and LP single-ended inputs on a 1.2 V HR bank, following XAPP894. The clock lane drives BUFIO for the ISERDES and BUFR ÷ 4 for byte logic. A sync-byte search sets byte alignment, the lanes are merged, and a packet parser checks ECC and CRC and outputs AXI4-Stream to a DMA engine writing DDR.

Why does every lane need to be in the same bank?

The bit clock is distributed on BUFIO, which only reaches the I/O of its own clock region. Each data lane's ISERDES needs that clock, so the data lanes must sit in the same region as the clock-capable pin that receives the clock lane.

Why is a continuous clock easier for an FPGA receiver?

With a non-continuous clock, BUFIO and BUFR lose their clock between bursts. The BUFR divider can restart in a different phase, the ISERDES needs a reset, and any logic on the byte clock stops mid-state. With a continuous clock, the byte clock is stable from configuration onward, and only the data lanes go in and out of HS.

How much of the 7020 does the receiver use?

Very little: a few ISERDES and IDELAY sites per lane, a few thousand LUTs for alignment, merge and parsing, and a few BRAMs for FIFOs. Most of the device is left for range FFT and data reduction in the PL.

← PreviousAWR2243