ad9361_dac_sub HDL Worker
Detail
The ad9361_dac_sub.hdl subdevice worker handles registering and interleaving of two independent TX data streams which are sent to this worker via the dev_data_ch0_in and dev_data_ch1_in devsignal ports. Data is sent out via the dev_data_to_pins devsignal port which ad9361_data_sub.hdl routes to the AD9361:ref:ad9361_data_sub. This worker’s LVDS_p, HALF_DUPLEX_p, SINGLE_PORT_p, and DATA_RATE_CONFIG_p parameter properties enforce build-time configuration for all of the possible AD9361 TX data time-interleaved modes. The currently supported modes and their limitations are shown in the following table.
Platform/Cards which |
AD9361 Data Port Mode |
AD9361 Channel Mode |
Max AD9361- |
Max |
allow the AD9361 |
Supported Sampling |
ad9361_dac_sub.hdl- |
||
Data Port/Channel |
Rate per TX channel |
Supported Sampling |
||
Mode |
Rate per TX channel |
|||
E310 |
CMOS Single Port Half Duplex SDR |
not yet supported |
||
E310 |
CMOS Single Port Half Duplex DDR |
not yet supported |
||
E310 |
CMOS Single Port Full Duplex SDR |
not yet supported |
||
E310 |
CMOS Single Port Full Duplex DDR |
not yet supported |
||
E310 |
CMOS Dual Port Half Duplex SDR |
not yet supported |
||
E310 |
CMOS Dual Port Half Duplex DDR |
not yet supported |
||
E310 |
CMOS Dual Port Full Duplex SDR |
not yet supported |
||
E310 |
CMOS Dual Port Full Duplex DDR |
not yet supported |
||
E310 |
CMOS Single Port Full Duplex DDR |
1R1T, 2R2T Timing=0 |
30.72 Msps |
30.72 Msps |
E310 |
CMOS Single Port Full Duplex DDR |
1R1T, 2R2T Timing=1, 2R1T, 1R2T |
15.36 Msps |
15.36 Msps |
FMCOMMS2/3 |
LVDS (Dual Port Full Duplex DDR) |
all configs |
61.44 Msps |
61.44 Msps (There are limited guarantees of data fidelity on the FMCOMMS2/3 cards for certain multichannel modes on certain platforms, although tests at room temperature have always yielded 100% fidelity.) |
Note that “channel 0” within the context of this worker corresponds to the AD9361 T1 channel and “channel 1” corresponds to the AD9361 T2 channel in the AD9361 timing diagrams . The mapping between the AD9361’s T1/T2 channels and the AD9361 physical TX connector outputs is variable depending on the AD9361 register configuration. This relationship is shown in the following table. Due to the AD9361’s T2 behavior , channel 1 should only ever be used when 2 TX channels are desired.
ad9361_dac_sub.hdl devsignal channel |
AD9361 timing diagram |
AD9361 TX RF Port |
AD9361 Register 0x010 Bit D5 (channel swap) |
AD9361 Register 0x002 Bits [D7 D6] (channel enable) |
AD9361 Register 0x004 Bit D6 (port select) |
0 |
T1 |
TX1A |
0 |
[D.C. 1] |
0 |
0 |
T1 |
TX1B |
0 |
[D.C. 1] |
1 |
0 |
T1 |
TX2A |
1 |
[1 D.C.] |
0 |
0 |
T1 |
TX2B |
1 |
[1 D.C.] |
1 |
1 |
T2 |
TX2A |
0 |
[1 1] |
0 |
1 |
T2 |
TX2B |
0 |
[1 1] |
1 |
1 |
T2 |
TX1A |
1 |
[1 1] |
0 |
1 |
T2 |
TX1B |
1 |
[1 1] |
1 |
Control Timing and Signals
The AD9361 DAC Sub subdevice worker contains four clock domains: control plane, FB_CLK_P, “dac_clk” and “dacd2_clk”.
Control Plane Clock Domain
The data_cfg_tx signals enter this worker in the control plane clock domain. Inside this worker, they are combined combinatorially into a single signal which is subsequently synchronized to the dacd2_clk domain. The dacd2_clk domain signal is then used to handle time-interleaving of multiple channel’s data.
DATA CLK P/FB CLK P Clock Domain
The AD9361 DATA_CLK_P clock enters this worker via the dev_data_clk devsignal. DATA_CLK_P clock is forwarded to the FB_CLK_P device signal as well as used to generate dac_clk.
“dac clk” Clock Domain
The “dac_clk” clock is an inverted version of DATA_CLK_P. Note that data transitions for the TX data sent out via the dev_data_to_pins devsignal port are falling-edge aligned with FB_CLK_P since the falling edge is what the AD9361 datasheets specifies its setup/hold requirements against. The dac_clk domain allows for logic within this worker to be falling edge aligned with FB_CLK_P.
“dacd2 clk” Clock Domain
The “dacd2_clk” clock is a divided by 2 version of “dac_clk”. TX data for channel 0 and channel 1 enter this worker in the dacd2_clk domain from the dev_data_ch0_in and dev_data_ch1_in devsignal ports, respectively. The dacd2_clk clock was a necessary replacement for some of the dac_clk logic in order to alleviate timing violations in the dac_clk domain for the zed_ise platform. Note that because dacd2_clk is a divided version of dac_clk, synchronization logic between the two is not necessary and not included.
Data latency
LVDS mode and CMOS Single Port Full Duplex
Latency for these modes is given as the number of clock cycles from a given channel’s data becoming ready on the dac_data_I and dac_data_Q devsignals to the starting edge of the high 6-bit I word on the AD9361 data bus output. Note that, for multichannel modes, latency can be two possible values depending on the current state of the 2-state channel serialization state machine when dac_data_I/dac_data_Q becomes ready. The latency for the various LVDS and CMOS Single Port Full Duplex configurations are as follows:
1R1T
channel 0 data latency = 3 FB_CLK_P cycles (2 are pipeline delay which are arguably unnecessary and 1 is a 12-bit word to 6-bit word serialization register)
2R1T/1R2T/2R2T
channel 0 data latency = 3 or 5 FB_CLK_P cycles (2 are pipeline delay which are arguably unnecessary, 2 are possible channel serialization register delay, and 1 is a 12-bit word to 6-bit word serialization register)
channel 1 data latency = 3 or 5 FB_CLK_P cycles (2 are pipeline delay which are arguably unnecessary, 2 are possible channel serialization register delay, and 1 is a 12-bit word to 6-bit word serialization register)
Multichannel Phase Coherency
Note that the two channel data made available via dev_data_ch0_in and dev_data_ch1_in are only ever considered to be phase coherent if coherency is guaranteed by the worker(s) that dev_data_ch0_in and dev_data_ch1_in are connected to. For example, multiple instances of ad9361_dac.hdl would not guarantee phase coherence because their datastreams would be independent. However, if a single device worker was created which interfaced with both dev_data_ch0_in and dev_data_ch1_in, phase coherency could be guaranteed by updating the values for the two channels in an every-other-clock fashion.
Performance and Resource Utilization
Fmax refers to the maximum allowable clock rate for any registered signal paths within a given clock domain for an FPGA design. Fmax in the table below is specific only to this worker and represents the maximum possible Fmax for any OpenCPI bitstream built with this worker included. Note that the Fmax value for a given clock domain for the final bitstream is often worse than the Fmax specific to this worker, even if this worker is the only one included in the bitstream.
Configuration |
OCPI Target |
Tool |
Version |
Device |
Registers (Typ) |
LUTs (Typ) |
Fmax (MHz) (Typ) control plane clock |
Fmax (MHz) (Typ) dev_data_clk clock |
Memory/Special Functions |
0 |
zynq |
Vivado |
2017.1 |
xc7z020clg484-1 |
94 |
89 |
477 1 |
267 1 |
ODDR: 7 BUFR: 1 |
0 |
virtex6 |
ISE |
14.7 |
6vlx240tff1156-1 |
101 |
113 |
689.655 |
632.511 |
ODDR: 7 BUFR: 1 |
1 |
zynq |
Vivado |
2017.1 |
xc7z020clg484-1 |
24 |
36 |
477 1 |
297 1 |
ODDR: 7 |
1 |
virtex6 |
ISE |
14.7 |
6vlx240tff1156-1 |
29 |
44 |
689.655 |
496.416 |
ODDR: 7 |
- 1(1,2,3,4)
These measurements were the result of a Vivado timing analysis which was different from the Vivado analysis performed by default for OpenCPI worker builds. For more info see Appendix.
Worker Properties
LVDS_pType:
boolAccess:
Parameter:
TrueWritable:
FalseInitial:
FalseVolatile:
FalseRead back:
False
Default value:
None
HALF_DUPLEX_pType:
boolAccess:
Parameter:
TrueWritable:
FalseInitial:
FalseVolatile:
FalseRead back:
False
Default value:
None
SINGLE_PORT_pType:
boolAccess:
Parameter:
TrueWritable:
FalseInitial:
FalseVolatile:
FalseRead back:
False
Default value:
None
DATA_RATE_CONFIG_pType:
enumAllowed values:
['SDR', 'DDR']
Access:
Parameter:
TrueWritable:
FalseInitial:
FalseVolatile:
FalseRead back:
False
Default value:
None
Worker Ports
dev_cfg_dataType:
devsignal
dev_cfg_data_txType:
devsignal
dev_data_clkType:
devsignal
dev_data_to_pinsType:
devsignal
dev_txenType:
devsignal
dev_data_ch0_inType:
devsignal
dev_data_ch1_inType:
devsignal
dev_tx_event_ch0Type:
devsignal
dev_tx_event_ch1Type:
devsignal
Supported device worker:
ad9361_dacConnections:
Subdevice port:
dev_dacSupported worker port:
dev_data_ch1_inIndex:
None
Subdevice port:
dev_tx_eventSupported worker port:
dev_tx_event_ch1Index:
None
Interfaces (other than data I/O ports):
Subdevice Connections:
Worker Signals
config_is_two_rDirection:
inDifferential:
falsePin:
false
ch0_handler_is_presentDirection:
outDifferential:
falsePin:
false
ch1_handler_is_presentDirection:
outDifferential:
falsePin:
false
data_bus_index_directionDirection:
outDifferential:
falsePin:
false
data_clk_is_invertedDirection:
outDifferential:
falsePin:
false
islvdsDirection:
outDifferential:
falsePin:
false
isdualportDirection:
outDifferential:
falsePin:
false
isfullduplexDirection:
outDifferential:
falsePin:
false
isDDRDirection:
outDifferential:
falsePin:
false
presentDirection:
outDifferential:
falsePin:
false
config_is_two_tDirection:
inDifferential:
falsePin:
false
force_two_r_two_t_timingDirection:
inDifferential:
falsePin:
false
DATA_CLK_PDirection:
inDifferential:
falsePin:
false
dataDirection:
outWidth:
24Differential:
falsePin:
false
tx_frameDirection:
outDifferential:
falsePin:
false
txenDirection:
outDifferential:
falsePin:
false
dac_clkDirection:
inDifferential:
falsePin:
false
dac_readyDirection:
outDifferential:
falsePin:
false
dac_takeDirection:
inDifferential:
falsePin:
false
dac_data_IDirection:
outWidth:
12Differential:
falsePin:
false
dac_data_QDirection:
outWidth:
12Differential:
falsePin:
false
txon_pulseDirection:
outDifferential:
falsePin:
false
txoff_pulseDirection:
outDifferential:
falsePin:
false
event_in_connectedDirection:
outDifferential:
falsePin:
false
is_operatingDirection:
outDifferential:
falsePin:
false
Utilization
Utilization reporting is not currently implemented.