|
|
# Radio over Ethernet Frame Structure
|
|
|
|
|
|
We propose to utilise the common RoE frame structure.
|
|
|
|
|
|
![RoEv2.004](uploads/43c202beabc88d0d8d9960ea61df2001/RoEv2.004.png)
|
|
|
|
|
|
It is comprised of:
|
|
|
* Destination address [0xffffff - indicating broadcast]
|
|
|
* Source address
|
|
|
* RoE EtherType [0xFC3D]
|
|
|
|
|
|
Further, the common frame format contains an RoE header:
|
|
|
* **subType**, we propose to use the IEEE organizationally unique identifier (OUI). This field identifies the RoE payload structure as being structure aware DDS.
|
|
|
* **flowID** identifies the RF signal stream. **Mappers** and **deMappers** use an out of band method to enumerate and subscribe to each **flowID**. A single **flowID** can contain multiple RF signals.
|
|
|
* **length** field determines the RoE payload length
|
|
|
* **orderInfo** utilises a 32-bit sequence number that may be used by **deMappers** to identify out of sequence frame reception (lost or duplicate frames).
|
|
|
|
|
|
Our proposed format for structure aware DDS is a sequence of **.dds** words that contain the following fields:
|
|
|
* **.dds.type** - a 4-bit field.
|
|
|
* **.dds.index** - a 4-bit field.
|
|
|
* **.dds.data** - size is dependent on the **.dds.type**.
|
|
|
|
|
|
The **.dds.type** field identifies the contents and structure of the **.dds.data** field and its length.
|
|
|
The length (**.dds.length**) includes 4 bits for **.dds.type** and 4 bits for **.dds.index** fields plus the
|
|
|
size of the **.dds.data** field. The **.dds.index** can be used to address up to sixteen DDS subsystems
|
|
|
contained within a single **deMapper**.
|
|
|
|
|
|
These DDS words can be categorised as follows:
|
|
|
* DDS Time words, contain a presentation time that specifies when subsequent **.dds** words, in the same RoE frame, must be applied by the **deMapper**.
|
|
|
* DDS Configuration words, necessary for initialisation and configuration of **deMappers**. Generally a **deMapper** must receive DDS Configuration words before acting on any DDS Control words.
|
|
|
* DDS Control words, adjust the DDS output frequency and Events (enable, disable and triggering).
|
|
|
|
|
|
DDS Time words that specify a presentation time have two varieties:
|
|
|
* Temps Atomique International (TAI) timestamp.
|
|
|
* RFtime timestamp, an epoch that is determined by the number of RF oscillations since an arbitrary TAI timestamp, it is only valid within a specific **flowID**.
|
|
|
|
|
|
It is assumed that all **Mappers** and **deMappers** have a method to determine,
|
|
|
initialise and maintain TAI time. For example, by using PTP or HA-PTP (White Rabbit).
|
|
|
|
|
|
The presentation time transmitted with DDS Time words must be calculated by a **Mapper**. This presentation
|
|
|
time must account for the worst case network latency that may be encountered, due to factors such as
|
|
|
congestion and signal propagation delay.
|
|
|
If an RoE frame is received with a presentation time that has already
|
|
|
expired, subsequent DDS words linked to that presentation time must be
|
|
|
discarded. If an RoE frame contains multiple presentation time fields, they must be in temporal order.
|
|
|
|
|
|
![RoEv2.006](uploads/ad4685cd7d267ca9d6e13b6a6ff0297f/RoEv2.006.png)
|
|
|
|
|
|
DDS Configuration words may be sent periodically, such that **deMappers** can
|
|
|
join the Ethernet work and subscribe to a **flowID** to recreate RF signals dynamically.
|
|
|
Therefore we do not anticipate structure aware DDS **Mappers** and **deMappers** transmitting
|
|
|
or interpreting RoE control packets (With **flowID** = 0). The rate at which DDS Configuration
|
|
|
words are broadcast is application specific.
|
|
|
|
|
|
DDS Control words are preceded by a DDS Time word.
|
|
|
The presence of the presentation time allows a **deMapper** to determine when to apply
|
|
|
the changes to its local DDS functions. Multiple DDS Control words may be transmitted
|
|
|
in advance of the presentation time (providing there is sufficient buffering provided
|
|
|
by the **deMapper**), to create a burst of changes that could not be supported in realtime.
|
|
|
|
|
|
Finally, there are two **.dds.types** that are reserved:
|
|
|
* **.dds.type** = 0x0, is reserved for padding to the minimum sized Ethernet and RoE payload frame.
|
|
|
* **.dds.type** = 0xF, can be used to extend the RF type field by an additional 4 bits. This makes the format extensible.
|
|
|
|
|
|
|
|
|
## Structure aware DDS Protocol - DDS word properties
|
|
|
|
|
|
|Time |**.dds.type** ID | Requires presentation time | **.dds.length** |
|
|
|
|--------------|-----------|----------------------------|------|
|
|
|
|TAI timestamp | 0x1 | N/A | 4 + 4 + 56 bits |
|
|
|
|RFtime timestamp | 0x2 | N/A | 4 + 4 + 64 bits |
|
|
|
|
|
|
|Configuration |**.dds.type** ID | Requires presentation time | **.dds.length** |
|
|
|
|--------------|-----------|----------------------------|------|
|
|
|
|Phase | 0x3 | Yes | 4 + 4 + 64 bits |
|
|
|
|DDS Clock Frequency | 0x4 | No | 4 + 4 + 112 bits |
|
|
|
|
|
|
|Control |**.dds.type** ID | Requires presentation time | **.dds.length** |
|
|
|
|--------------|-----------|----------------------------|------|
|
|
|
|Frequency Tuning Word (FTW) | 0x5 | Yes | 4 + 4 + 64 bits |
|
|
|
|Maximum voltage | 0x6 | No | 4 + 4 + 16 bits |
|
|
|
|Event without data | 0x7 | Yes | 4 + 4 + 40 bits |
|
|
|
|Event with data | 0x8 | Yes | 4 + 4 + 112 bits |
|
|
|
|Control/Status Flags | 0x9 | Yes | 4 + 4 + 32 bits |
|
|
|
|
|
|
|Reserved |**.dds.type** ID | Requires presentation time | **.dds.length** |
|
|
|
|-----------------|-----------|----------------------------|------|
|
|
|
|Padding | 0x0 | N/A | 4 bits |
|
|
|
|Unused | 0xA-0xE | TBD | N/A |
|
|
|
|Extended | 0xF | TBD | 4 bits |
|
|
|
|
|
|
|
|
|
### TAI Timestamps ###
|
|
|
The TAI timestamp **.dds.data.TAI** contains three fields:
|
|
|
* 8 bits, least significant bits of seconds from epoch (**.dds.data.TAI.sec**).
|
|
|
* 32 bits, number of nanoseconds of TAI timestamp (**.dds.data.TAI.nsec**).
|
|
|
* 16 bits, fraction of a nanosecond, the unit is value x 2^(-16) ns (**.dds.data.TAI.nsecFRAC**).
|
|
|
|
|
|
### RFtime Timestamps ###
|
|
|
The RFtime timestamp (**.dds.data.RFtime**) is a 64-bit unsigned number, it represents the number of RF oscillations
|
|
|
since the beginning of the RFtime epoch.
|
|
|
|
|
|
### Phase ###
|
|
|
The **.dds.data.phase** is a 64-bit unsigned number that represents the phase (normalised to 2π) of the RF signal at some future TAI or RFtime timestamp. At the presentation time, the value of NCO is set equal to this value. To convert between phase and the NCO value use the following equation.
|
|
|
|
|
|
![normalised_phase](uploads/f456e1acca69e2e39f09a136abfa9dab/normalised_phase.png)
|
|
|
|
|
|
### Maximum voltage ###
|
|
|
The **.dds.data.maxVoltage** maximum voltage is a 16-bit unsigned number. It is the reference
|
|
|
voltage level in mV. The default is 1000 mV (0x3e8 mV).
|
|
|
|
|
|
### DDS Clock Frequency ###
|
|
|
This **.dds** word is used to describe the DDS clock frequency of the **Mapper** node. It is the frequency
|
|
|
at which Frequency Tuning Word (FTW) values (**.dds.data.FTW**) are accumulated on the **Mapper** node. It is expressed through multiple fields:
|
|
|
|
|
|
* 48-bit unsigned number, integer DDS clock frequency in Hz (**.dds.data.DDSclockFreq.integer**). The default is 125 MHz.
|
|
|
* 32-bit unsigned number, fractional DDS clock frequency, numerator value (**.dds.data.DDSclockFreq.numerator**). The default is 0.
|
|
|
* 32-bit unsigned number, fractional DDS clock frequency, denominator value(**.dds.data.DDSclockFreq.denominator**). The default is 0.
|
|
|
|
|
|
A **deMapper** must compare its DDS clock frequency with that of the **Mapper** node. If they are different, the **deMapper** must subsequently scale any received FTW (**.dds.data.FTW**) appropriately. This may introduce rounding errors. Therefore it is highly desirable that users operate **Mappers** and **deMappers** at the same DDS clock frequency.
|
|
|
|
|
|
![dds_clock_freq](uploads/4aeed6fc65c9635148d64fce9377cbc1/dds_clock_freq.png)
|
|
|
|
|
|
### Frequency Tuning Word (FTW) ###
|
|
|
The FTW (**.dds.data.FTW**) is a 64-bit unsigned number that represents a change in phase (normalised to 2π) per DDS clock cycle. It must be preceded by an TAI or RFtime timestamp earlier in the RoE frame.
|
|
|
|
|
|
### Events without Data ###
|
|
|
Events without data contain two fields:
|
|
|
* 8 bits represent the Event status (**.dds.data.event.status**).
|
|
|
* [0] - Event disabled (**.dds.data.event.status.disabled**).
|
|
|
* [1] - Event enabled (**.dds.data.event.status.enabled**).
|
|
|
* [2] - Event trigger (**.dds.data.event.status.trigger**).
|
|
|
* [7-3] - Undefined.
|
|
|
* 32-bit unsigned number that represents the Event identifer number (**.dds.data.event.id**).
|
|
|
|
|
|
Events identifiers are allocated to **Mappers** and **deMappers** using an out of band method.
|
|
|
Event actions are not defined here, but is anticipated that when Events are triggered they will
|
|
|
create output pulses or increment counters.
|
|
|
|
|
|
### Events with Data ###
|
|
|
This DDS Control word is the same an Event without data but with an additional 64-bit data field to be utilised by the **deMapper**. The association and definition of the data field with the Event ID is application specific.
|
|
|
* 8 bits represent the Event status (**.dds.data.event.status**).
|
|
|
* [0] - Event disabled (**.dds.data.event.status.disabled**).
|
|
|
* [1] - Event enabled (**.dds.data.event.status.enabled**).
|
|
|
* [2] - Event force triggered (**.dds.data.event.status.trigger**).
|
|
|
* [7-3] - Undefined.
|
|
|
* 32-bit unsigned number that represents the Event identifer number (**.dds.data.event.id**).
|
|
|
* 64-bit value. It is application specific how this (**.dds.data.event.data**) is formatted and associated with the Event identifier.
|
|
|
|
|
|
### Control and Status Flags ###
|
|
|
Control and status flags is a 32-bit value. It is hot-one encoded.
|
|
|
* [0] - **deMappers** NCO in reset (1), (0) normal operation (**.dds.data.ctrl.NCOreset**).
|
|
|
* [1] - **Mapper** has no input RF signal (1), (0) normal operation (**.dds.data.control.RFpresent**).
|
|
|
* [2] - **Mapper** unable to track input RF signal (1), (0) normal operation (**.dds.data.control.RFtrack**).
|
|
|
* [3] - **deMappers** RFtime in reset (1), (0) RFtime epoch has started (**.dds.data.control.RFtime**).
|
|
|
* [15-4] - Reserved.
|
|
|
* [31-16] - Application specific.
|
|
|
|
|
|
### Padding ###
|
|
|
This **.dds.type.padding** (value = 0x0) is used repeatedly to pad an Ethernet frame to the minimum size or alternately pad the RoE payload to its minimum size (64 bytes).
|
|
|
|
|
|
### Extended **.dds.type** ###
|
|
|
This **.dds.type.extended** (value = 0xF) is intended to create extensible **.dds.types**: 0xFn, 0xFFn, 0xFFFn etc, facilitating features not yet envisaged. |