JUPITER-SDR HDL Project

Overview

This design allows controlling, receiving and transmitting sample stream from/to an ADRV9001/ADRV9002 device through two independent source-synchronous interfaces. Supports both CMOS and LVDS interface, but not at the same time. The selection of the I/O standard must be done by setting a parameter before building the project.

The design supports SDR or DDR modes in CMOS mode with 1 or 4 lanes, and in LVDS mode with 1 or 2 lanes. This is runtime configurable. The complete list of supported modes can be consulted in the AXI ADRV9001 Interface Core documentation.

Supported devices

Block design

The design has two receive paths and two transmit paths. One of the receive paths (Rx12) has 4 usable channels (I1, Q1, I2, Q2) and the other (Rx2) has two (I2,Q2) channels. These can work independently, each having two active channels Rx12 - I1, Q1 and Rx2 - I2, Q2), or just the Rx12 (I1, Q1, I2, Q2) path having four active channels, while Rx2 is disabled. The same applies to the transmit path but in the other direction.

When only the Rx12 path is active with four channels mode the core will take ownership of both source synchronous interfaces. The requirement in this case is that both interfaces run at the same rate.

In the receive direction, each component of the delineated data is passed to a PN monitor. The monitor validates the digital interface signal capture and timing. The data then optionally DC-filtered, corrected for I/Q offset and phase mismatches and is written to the DDR memory via DMA.

In the transmit direction, complex I and Q signals are generated for each RF channel. The digital source could either be an internal DDS or from the DDR via VDMA. The internal DDS phase and frequency are programmable.

Block diagram

The data path and clock domains are depicted in the below diagram.

Jupiter SDR block diagram

Configuration modes

The AXI ADRV9001 IP in this HDL project is configured to work in LVDS and CMOS interface; it supports two configuration modes:

  • 2R2T - 2x Rx and 2x Tx independent control and DMAs for the two RF channels

  • 1R1T - 1x Rx and 1x Tx common control and DMAs for the two RF channels also noted as R1_MODE (R12 and T12 path).

For any mode the, number of RF channels doesn’t change only the controlling instance and the data-paths (DMAs), this is if all modes are supported through at hdl build time through INDEPENDENT_1R1T_SUPPORT and COMMON_2R2T_SUPPORT.

Regarding the INDEPENDENT_1R1T_SUPPORT and COMMON_2R2T_SUPPORT parameters, related to the above modes, their purpose is to remove the unused data paths, reducing in this way the resource utilisation. By default all modes/paths are available.

For more info see the parameter section of AXI ADRV9001.

Clock scheme

The clocks are managed by the device and are software programmable. Please refer to the device datasheet for the various clocks within the device.

The board provides a 38.4MHz crystal for the ADRV9002. It can also use an external reference clock.

CPU/Memory interconnects addresses

Instance

ZynqMP

axi_adrv9001

0x84A0_0000

axi_adrv9001_rx1_dma

0x84A3_0000

axi_adrv9001_rx2_dma

0x84A4_0000

axi_adrv9001_tx1_dma

0x84A5_0000

axi_adrv9001_tx2_dma

0x84A6_0000

pl_sysmon

0x84A7_0000

axi_sysid_0

0x8500_0000

SPI connections

SPI type

SPI manager instance

SPI subordinate

CS

PS

SPI 0

ADRV9002

0

GPIOs

Zynq UltraScale PS EMIO GPIO signals translation from schematic to GPIO number.

PS8 EMIO offset = 78

HW Signal

HDL Signal

Software GPIO Zynq MP

HDL EMIOGPIO

Direction

IO_L7N_66_FAN_CTL

fan_ctl

145

67

O

IO_66_USB_FLASH_PROG_EN

usb_flash_prog_en

144

66

O

IO_L4N_64_ADRV9002_MCSSRC

adrv9002_mcssrc

143

65

O

– (internal)

mcs_or_system_sync_n

142

64

O

IO_L1P_T0L_N0_DBC_64

add_on_power

141

63

O

IO_L23N_T3U_N9_64

add_on_gpio[14]

140

62

I/O

IO_L23P_T3U_N8_64

add_on_gpio[13]

139

61

I/O

IO_L21N_T3L_N5_AD8N_64

add_on_gpio[12]

138

60

I/O

IO_L21P_T3L_N4_AD8P_64

add_on_gpio[11]

137

59

I/O

IO_L2N_T0L_N3_64

add_on_gpio[10]

136

58

I/O

IO_L2P_T0L_N2_64

add_on_gpio[ 9]

135

57

I/O

IO_L1N_T0L_N1_DBC_64

add_on_gpio[ 8]

134

56

I/O

IO_L12N_AD0N_26

add_on_gpio[ 7]

133

55

I/O

IO_L12P_AD0P_26

add_on_gpio[ 6]

132

54

I/O

IO_L11N_AD1N_26

add_on_gpio[ 5]

131

53

I/O

IO_L11P_AD1P_26

add_on_gpio[ 4]

130

52

I/O

IO_L10N_AD2N_26

add_on_gpio[ 3]

129

51

I/O

IO_L10P_AD2P_26

add_on_gpio[ 2]

128

50

I/O

IO_L9N_AD3N_26

add_on_gpio[ 1]

127

49

I/O

IO_L9P_AD3P_26

add_on_gpio[ 0]

126

48

I/O

– (internal)

gpio_rx1_enable_in

126

47

I/O

– (internal)

gpio_rx2_enable_in

126

46

I/O

– (internal)

gpio_tx1_enable_in

126

45

I/O

– (internal)

gpio_tx2_enable_in

126

44

I/O

IO_L18P_64_ADRV9002_DGPIO_11

dgpio[11]

121

43

I/O

IO_L18N_64_ADRV9002_DGPIO_10

dgpio[10]

120

42

I/O

IO_L9N_64_ADRV9002_DGPIO_9

dgpio[ 9]

119

41

I/O

IO_L9P_64_ADRV9002_DGPIO_8

dgpio[ 8]

118

40

I/O

IO_T2U_N12_64_ADRV9002_DGPIO_7

dgpio[ 7]

117

39

I/O

IO_L14N_64_ADRV9002_DGPIO_6

dgpio[ 6]

116

38

I/O

IO_L7N_64_ADRV9002_DGPIO_5

dgpio[ 5]

115

37

I/O

IO_L7P_64_ADRV9002_DGPIO_4

dgpio[ 4]

114

36

I/O

IO_L6N_64_ADRV9002_DGPIO_3

dgpio[ 3]

113

35

I/O

IO_L6P_64_ADRV9002_DGPIO_2

dgpio[ 2]

112

34

I/O

IO_L5N_64_ADRV9002_DGPIO_1

dgpio[ 1]

111

33

I/O

IO_L5P_64_ADRV9002_DGPIO_0

dgpio[ 0]

110

32

I/O

IO_L8N_AD4N_26

ext_gpio[15]

109

31

I/O

IO_L8P_AD4P_26

ext_gpio[14]

108

30

I/O

IO_L7N_AD5N_26

ext_gpio[13]

107

29

I/O

IO_L7P_AD5P_26

ext_gpio[12]

106

28

I/O

IO_L6N_AD6N_26

ext_gpio[11]

105

27

I/O

IO_L6P_AD6P_26

ext_gpio[10]

104

26

I/O

IO_L5N_AD7N_26

ext_gpio[ 9]

103

25

I/O

IO_L5P_AD7P_26

ext_gpio[ 8]

102

24

I/O

IO_L4N_AD8N_26

ext_gpio[ 7]

101

23

I/O

IO_L4P_AD8P_26

ext_gpio[ 6]

100

22

I/O

IO_L3N_AD9N_26

ext_gpio[ 5]

99

21

I/O

IO_L3P_AD9P_26

ext_gpio[ 4]

98

20

I/O

IO_L2N_AD10N_26

ext_gpio[ 3]

97

19

I/O

IO_L2P_AD10P_26

ext_gpio[ 2]

96

18

I/O

IO_L1N_AD11N_26

ext_gpio[ 1]

95

17

I/O

IO_L1P_AD11P_26

ext_gpio[ 0]

94

16

I/O

IO_L17N_RF_TX2_MUX_CTL2

rf_tx2_mux_ctl2

93

15

O

IO_L17P_RF_TX2_MUX_CTL1

rf_tx2_mux_ctl1

92

14

O

IO_L16N_RF_TX1_MUX_CTL2

rf_tx1_mux_ctl2

91

13

O

IO_L16P_RF_TX1_MUX_CTL1

rf_tx1_mux_ctl1

90

12

O

IO_L13P_RF_RX2B_MUX_CTL

rf_rx2b_mux_ctl

89

11

O

IO_L14P_RF_RX2A_MUX_CTL

rf_rx2a_mux_ctl

88

10

O

IO_L15P_RF_RX1B_MUX_CTL

rf_rx1b_mux_ctl

87

9

O

IO_L15N_RF_RX1A_MUX_CTL

rf_rx1a_mux_ctl

86

8

O

– (internal)

mssi_sync

85

7

O

VIN_POE_VALID_N

vin_poe_valid_n

84

6

I

VIN_USB2_VALID_N

vin_usb2_valid_n

83

5

I

VIN_USB1_VALID_N

vin_usb1_valid_n

82

4

I

IO_66_ADRV9002_CLKSRC

clksrc

81

3

O

IO_65_ADRV9002_MODE

mode

80

2

O

IO_65_ADRV9002_RST

resetb

79

1

O

IO_L24P_65_ADRV9002_GP_INT

gp_int

78

0

I

Interrupts

Below are the Programmable Logic interrupts used in the project.

Instance name

HDL

Linux ZynqMP

axi_ad9361_adc_dma

13

109

axi_ad9361_dac_dma

12

108

axi_ad9361_dac_dma

11

107

axi_ad9361_dac_dma

10

106

pl_sysmon

9

105

Resource Utilization of xczu3eg-sfva625-2-e

Resource

Utilization

Available

Utilization %

LUT

25131

70560

35.62

LUTRAM

1812

28800

6.29

FF

34789

141120

24.65

BRAM

4

216

1.85

DSP

12

360

3.33

IO

136

180

75.56

BUFG

13

196

6.63

Building the HDL project

The design is built upon ADI’s generic HDL reference design framework. ADI distributes the bit/elf files of these projects as part of the ADI Kuiper Linux. If you want to build the sources, ADI makes them available on the HDL repository. To get the source you must clone the HDL repository.

Linux/Cygwin/WSL

~$
cd hdl/projects/jupiter_sdr
~/hdl/projects/jupiter_sdr$
make

A more comprehensive build guide can be found in the Build an HDL project user guide.

Resources

More information

Support

Analog Devices, Inc. will provide limited online support for anyone using the reference design with ADI components via the EngineerZone FPGA reference designs forum.

For questions regarding the ADI Linux device drivers, device trees, etc. from our Linux GitHub repository, the team will offer support on the EngineerZone Linux software drivers forum.

For questions concerning the ADI No-OS drivers, from our No-OS GitHub repository, the team will offer support on the EngineerZone microcontroller No-OS drivers forum.

It should be noted, that the older the tools’ versions and release branches are, the lower the chances to receive support from ADI engineers.