The data offload engine is, in essence, a clock-domain crossing store-and-forward buffer (or FIFO) with some extra features useful in bursty RF applications. More specifically, it was designed to sit between a DMA and DAC for the TX and ADC and DAC for the RX path of a digital RF chain. This is reflected in the synthesis settings of the device, that also enable or disable certain other settings of features where appropriate. For example in the receive path cyclic operation isn't supported.
Utilization is estimated without a storage unit. The size and complexity of your storage unit depends completely on the kind of storage in use. For Block-RAM the complexity will be dependent on the amount of storage, while with external DRAM a fixed cost can be assumed.
Device Family | LUTs | FFs |
---|---|---|
Xilinx Zynq UltraScale+ | 750 | 2000 |
Name | Description |
---|---|
data_offload HDL | Verilog source for the peripheral. |
adi-axi-data-offload.c | Linux Driver |
xilinx/zynqmp-zcu102-rev10-ad9081-m8-l4-do.dts | Example device tree using the data offload |
The main role of our data paths, is to stream data from point A to point B in a particular system. There are always a SOURCE and a DESTINATION point, which can be a device (ADC or DAC), a DMA (for system memory) or any other data processing IP.
In the context of Data Offload IP, we don't need to know who is the source and who is the destination. Both interface is a AXI4 Stream interface, which can be supported in both Xilinx's an Intel's architecture, and can be connected to any device core or DMA.
The storage unit is connected to the Data Offload controller via two FIFO interface. This way the same controller can be used for various storage solutions. (BRAM, URAM, external memory etc.)
Name | Description | Default |
---|---|---|
ID | Instance identification number. | 0 |
MEM_TYPE | Define the used storage type: 0: BlockRAM; 1: external DDR | 0 |
MEM_SIZE_LOG2 | Define the log2 size of the storage element in bytes | 10 |
TX_OR_RXN_PATH | If set TX path enabled, otherwise RX | 1 |
SRC_DATA_WIDTH | The data width of the source interface | 64 |
DST_DATA_WIDTH | The data width of the destination interface | 64 |
DST_CYCLIC_EN | Enables CYCLIC mode for destinations like DAC | 0 |
AUTO_BRINUP | If enabled the IP runs automatically after bootup | 0 |
SYNC_EXT_ADD_INTERNAL_CDC | If enabled the CDC circuitry for the external sync signal is added | 0 |
HAS_BYPASS | If enabled the bypass circuitry is added | 0 |
Interface | Pin | Type | Description |
---|---|---|---|
Control Signals | |||
s_axi_aclk | input | AXI4-Lite clock signal | |
s_axi_aresetn | input | Control-Domain Reset Input | |
s_axi | MM AXI4-Lite control interface | ||
init_req | input | Indicator that the signal source (e.g. DMA) intends to provide new data soon | |
init_ack | output | Init acknowledgement | |
sync_ext | input | External synchronization signal, with or without internal clock-domain crossing logic. Can be used to couple certain state machine transitions to external processes | |
ddr_calib_done | input | Allows the user to read back status information about the DDR calibration status from software | |
Source Domain | |||
s_axis_aclk | input | Source Domain Clock Signal Input | |
s_axis | input | AXI4-Stream slave data input | |
Destination Domain | |||
m_axis_aclk | input | Destination Domain Clock Signal Input | |
m_axis | output | AXI4-Stream master output stream |
Access Type | Name | Description |
---|---|---|
RO | Read-only | Reads will return the current register value. Writes have no effect. |
RW | Read-write | Reads will return the current register value. Writes will change the current register value. |
RW1C | Write-1-to-clear | Reads will return the current register value. Writing the register will clear those bits of the register which were set to 1 in the value written. Bits are set by hardware. |
RW1S | Write-1-to-set | Reads will return the current register value. Writing the register will set those bits of the register which were set to 1 in the value written. Bits are cleared by hardware. |
V | Volatile | The V suffix indicates that the register is volatile and its content might change without software interaction. The value of registers without the volatile designation will not change without an explicit write done by software. |
The linux driver has two responsibilities:
The former of those two is covered by the device tree, which implements five options:
axi_data_offload_tx: axi-data-offload-0@9c440000 { compatible = "adi,axi-data-offload-1.0.a"; reg = <0x9c440000 0x10000>; // adi,bringup; // adi,oneshot; // adi,bypass; // adi,sync-config = <2>; // adi,transfer-length = /bits/ 64 <0x10000>; // 2**16 bytes };
adi,bringup
will automatically enable the data offload on startup. Note that this option isn't always necessary, because the HDL itself may have been synthesized with auto-bringup.adi,oneshot
configures the default mode of operation for TX data offloads. This will usually be overridden by the IIO buffer integration and thus doesn't have an effect in most situations.adi,bypass
enables bypass mode, i.e. disables all functionality and makes the data offload act like a small async fifo.adi,sync-config
: The sync config determines how the synchronization mechanism should operate. More information about this value can be found in the register map.adi,transfer-length
: This option is useful for RX instances, where the size of the receive buffer can be reduced from the default (All available storage).The latter is addressed by the integration into cf_axi_dds.c and cf_axi_dds_buffer_stream.c, which allow the drivers to control the oneshot functionality of the data offload based on what was requested with the current IIO buffer, assuming bypass was disabled.