Ten_GbE_v2 - david-macmahon/wiki_convert_test GitHub Wiki
Block: 10GbE Transceiver Mark II (ten_GbE_v2
)
Block Author: David George
Document Author: David George
Summary
This block sends and receives UDP frames (packets). It accepts a 64 bit wide data stream with user-determined frame breaks. The data stream is wrapped in a UDP frame for transmission. Incoming UDP packets are unwrapped and the data presented as a 64 bit wide stream.
Mask Parameters
Parameter | Variable | Description |
---|---|---|
Port | port | Selects the physical CX4 port. |
Shallow RX Fifo | rx_dist_ram | Selects shallow distributed RAM rather than BRAM for the RX FIFO. This option should only be used if the application clock is faster than 156.25 MHz. Constant overruns will most likely occur for clock frequency lower than this. |
Pre-emphasis | pre_emph | Selects the default pre-emaphasis to use over the physical link. Currently unused. |
Differential Swing | swing | Selects the size of the differential swing to use in mV. Currently unused. |
Enable Fabric on Startup | fab_en | This will enable the 10Ge interface on start-up, negating the requirement of software intervention. |
Fabric MAC Addresss | fab_mac | Sets the default MAC, usually configured by software. |
Fabric IP Addresss | fab_ip | Sets the default IP, usually configured by software. |
Fabric UDP Port | fab_port | Sets the default UDP Port, usually configured by software. |
Fabric Gateway | fab_gate | Sets the default gateway address, usually configured by software. |
Enable CPU RX | cpu_rx_en | Optionally disable the CPU receive interface to save 2 BRAMS, if that interface is not required. |
Enable CPU TX | cpu_tx_en | Optionally disable the CPU trasmit interface to save 2 BRAMS, if that interface is not required. |
Ports
Port | Dir | Data Type | Description |
---|---|---|---|
rst | in | boolean | Resets the transmit and receive memories when asserted |
tx_data | in | UFix_64_0 | The data stream to be transmitted |
tx_valid | in | boolean | The core accepts the data on tx_data into the buffer while this line is high |
tx_dest_ip | in | UFix_32_0 | Selects the IP address of the receiving device |
tx_dest_port | in | UFix_16_0 | Selects the listening port of the receiving device (UDP port) |
tx_end_of_frame | in | boolean | Signals the transceiver to begin transmitting the buffered frame (ie signals end of the frame). This signal must pulse high on the same clock cycle as the final tx_valid signal |
rx_ack | in | boolean | Used to acknowledge reception of the data currently on rx_data and signals the transceiver to produce the next 64 bits from the receiver FIFO. |
rx_overrun_ack | in | boolean | Used to reset the RX state machine when a RX overrun occurs. |
led_up | out | boolean | Indicates a link on the port |
led_rx | out | boolean | Represents received traffic on the port |
led_tx | out | boolean | Represents transmitted traffic on the port |
tx_afull | out | boolean | Indicates that the TX FIFO is almost full |
tx_overflow | out | boolean | Indicates that the TX FIFO has overflowed |
rx_data | out | UFix_64_0 | The received data stream. |
rx_valid | out | boolean | Indicates that the data on rx_data is valid (indicates a packet, or partial packet is in the RX buffer). |
rx_source_ip | out | UFix_32_0 | Represents the IP address of the sender of the current packet. |
rx_source_port | out | UFix_16_0 | Represents the sender's UDP port of the current packet. |
rx_end_of_frame | out | boolean | Goes high to indicate the end of the received frame. |
rx_bad_frame | out | UFix_16_0 | Indicates a CRC error on the frame immediately received when asserted simultaneously with rx_end_of_frame . |
rx_overrun | out | UFix_16_0 | Indicates that an RX buffer overrun when asserted simultaneously with rx_end_of_frame . |
Description
This document is a draft and requires verification.
Configuration
This core will typically be configured by software by setting the following OPB registers: MAC, IP, UDP port, ARP table, gateway and fabric enable. However, there are currently parameters to set these values (except for the ARP table) at build time.
Transmitting
To transmit, data is clocked into the TX buffer through tx_data
in 64
bit wide words using tx_valid
. When sending the final word of data in
the packet, simultaneously pulse the tx_end_of_frame
line; the
transceiver will add a UDP wrapper addressed to
tx_dest_ip:tx_dest_port
and begin transmission immediately. Note that
tx_dest_ip and tx_dest_port are only looked at when
tx_end_of_frame is pulsed high, thus the value must be valid for that
clock period but is irrelevant otherwise.
The transmit FIFO can only handle frame sizes of up to 8704 bytes, or
1088 64 bit words. As the TX FIFO approaches full, the tx_afull
signal
will be asserted. This is an indication that the application should stop
entering data into the core. If the application overflows the TX buffer,
the tx_overflow
signal will be asserted. When the overflow is asserted
the TX interface will block, requiring a reset (using rst
) to return
to full functionality.
Receiving
Upon receipt of a packet, rx_valid
will go high, with the received
data presented on rx_data
in 64 bit wide words. You acknowledge
receipt of this data using rx_ack
, at which point the next data word
will be presented. When the end of the packet is reached,
rx_end_of_frame
will go high. If the a CRC error occurred when
receiving the packet, the rx_bad_frame
signal will be asserted.
If the RX data overran the RX FIFO, the rx_overrun
signal will be
asserted along with rx_end_of_frame
. When this occurs the RX state
machine will block until the rx_overrun_ack
is asserted. It is
recommended that the rx_overrun
be directly connected to the
rx_overrun_ack
signal.
There is no hard maximum frame size for RX. However, care must be taken not to overrun the rx buffer.
Addressing
To transmit, the IPv4 address is represented as a 32 bit binary number
(whereas it's usually represented as four 8 bit decimal numbers). For
example, if you wanted to send all packets to 192.168.1.1
, you would
enter
(192\times2^{24} + 168\times2^{16} + 1\times2^8 + 1 = 3 232 235 777)
as the IP address. The port is represented by a 16 bit number, allowing full addressing of the UDP port range. Ports below 1024 are generally reserved for Linux kernel and Internet functions. Ports 1024 - 49151 are registered for specific applications and may not be used without IANA registration. To ensure inter-operability and compatibility, we recommend using dynamic (private) ports 49152 through 65535.
LED Outputs
The LED lines indicate port activity and can be connected to external GPIO LED interfaces. Bear in mind that even if no packets are being transmitted or received through the Simulink interface block, miscellaneous configuration packets are still sent and may be received by the microprocessor core. This activity will also be reflected on the activity LEDs.
Operation
Apart from configuring the block, the processor is also used to map the routing tables. ARP requests and responses are handled by the CPU.