1概述
在米联客老版本的MIA701开发板(2017版本)中,米联开源了1套原创的UDP IP协议栈。在后续开发过程中,我们对协议栈进行了改进和升级,在新一代开发板中发布新版UDP IP协议栈。出于保护知识产权的目的,新版的UDP IP协议栈不再开源,仅以网表的形式免费提供大家使用。
新版UDP IP协议栈将原MAC协议实现部分移除,留出MAC接口。将用户接口数据位宽由8bit增加到64bit。另外,增加和升级了若干功能,整体的逻辑框架与原协议栈基本保持一致,如下图所示。
2特点
2特点
>支持UDP接收校验和检验功能,暂不支持UDP发送校验和生成。
>支持IP首部校验和的生成和校验,同时支持ICMP协议中的PING功能,可接收并响应同一个子网内部设备的PING请求。
>可自动发起或响应同一个子网内设备的ARP请求,ARP收发完全自适应。ARP表可保存同一个子网内部256个IP和MAC地址对。
>支持ARP超时机制,可检测所需发送数据包的目的IP地址是否可达。
>协议栈发送带宽利用率可达93%,高发送带宽下,内部仲裁机制保证PING和ARP功能不受任何影响。
>发送过程不会造成丢包。
>提供64bit位宽AXI4-Stream形式的MAC接口,可与Xilinx官方的千兆以太网IP核Tri Mode Ethernet MAC,以及万兆以太网IP核10 Gigabit Ethernet Subsystem、10 Gigabit Ethernet MAC配合使用。
3协议栈使用
3.1接口定义
协议栈接口定义
模块信号接口名称 |
信号方向 |
信号说明 |
LOCAL_PORT_NUM[15:0] |
input |
(Paramter类信号)本地UDP端口号 |
LOCAL_IP_ADDRESS[31:0] |
input |
(Paramter类信号)本地IP地址 |
LOCAL_MAC_ADDRESS[47:0] |
input |
(Paramter类信号)本地MAC地址 |
ICMP_EN |
input |
(Paramter类信号)使能ICMP功能,1使能,0关闭 |
ARP_REPLY_EN |
input |
(Paramter类信号)使能ARP应答,1使能,0关闭 |
ARP_REQUEST_EN |
input |
(Paramter类信号)使能ARP请求,1使能,0关闭 |
ARP_TIMEOUT_VALUE[29:0] |
input |
(Paramter类信号)ARP超时检测超时值(时钟周期数) |
ARP_RETRY_NUM[3:0] |
input |
(Paramter类信号)ARP超时重传次数 |
core_clk |
input |
用户接口时钟 |
reset |
input |
复位信号,高电平有效 |
udp_tx_ready |
output |
可接收外部用户数据输入标志信号,高电平有效。 |
app_tx_ack |
output |
app_tx_request的反馈信号,高电平有效。表示此时外部模块可通过用户接口可向本模块输入数据 |
app_tx_request |
input |
用户接口数据发送请求,高电平有效 |
app_tx_data_valid |
input |
用户发送AXI-Stream接口 |
app_tx_data[63:0] |
input |
|
app_tx_data_keep[7:0] |
input |
|
app_tx_data_last |
input |
|
app_tx_data_length[15:0] |
input |
用户接口一次发送的数据包长度(不含udp、ip、mac首部),单位:字节 |
app_tx_dst_port[15:0] |
input |
用户接口数据包的发送目的端口号 |
ip_tx_dst_address[31:0] |
input |
用户接口数据包的发送目的ip地址 |
app_rx_data_valid |
output |
用户接收AXI-Stream接口 |
app_rx_data[63:0] |
output |
|
app_rx_data_keep[7:0] |
output |
|
app_rx_data_last |
output |
|
app_rx_data_length[15:0] |
output |
从外部所接收的当前数据包的长度(不含udp、ip、mac首部),单位:字节 |
app_rx_port_num[15:0] |
output |
从外部所接收的数据包的源端口号 |
udp_rx_error |
output |
接收数据包udp检验错误指示信号,高电平有效,仅在app_rx_data_last拉高时有效 |
mac_tx_data_valid |
output |
AXI-Stream形式的MAC发送接口, (现版本mac_tx_user信号在内部被恒置为0) |
mac_tx_data[63:0] |
output |
|
mac_tx_keep[7:0] |
output |
|
mac_tx_ready |
input |
|
mac_tx_last |
output |
|
mac_tx_user |
output |
|
mac_rx_data_valid |
input |
AXI-Stream形式的MAC接收接口, (现版本mac_rx_user信号在内部不被使用) |
mac_rx_data[63:0] |
input |
|
mac_rx_keep[7:0] |
input |
|
mac_rx_last |
input |
|
mac_rx_user |
input |
|
ip_rx_error |
output |
接收数据包ip首部检验错误指示信号,低电平有效。作为调试使用,用户无需关注该信号 |
dst_ip_unreachable |
output |
当前请求发送的目的IP地址不可达指示信号,高电平有效 |
3.2用户接口
3.2.1发送时序
3.2.1.1正常发送时序
用户需通过协议栈发送一个UDP数据包时发送接口的正常时序如下图所示。需要注意的是,在一个数据包持续期间app_tx_data_valid信号必须持续为1。
3.2.1.2IP地址不可达,ARP超时发送时序
若遇到目的IP地址不可达的情况,app_tx_ack将不会拉高。当ARP请求重传次数达到ARP_RETRY_NUM所设置的上限时, dst_ip_unreachable将持续拉高,此时用户需要将app_tx_request拉低撤销当前发送请求,dst_ip_unreachable才会变为0,用户才可发起下一次发送请求。如下图所示。
3.2.2接收时序
3.2.2.1正常接收时序
用户接口接收UDP校验和正确的UDP包的时序如下图所示。需要注意的是,在一个数据包持续期间app_rx_data_valid信号持续为1。
3.2.2接收错误时序
当接收的UDP包中的校验和产生错误时,udp_rx_error信号会在app_rx_data_last拉高的同时拉高。如下图所示。
3.4MAC接口
3.4.1发送时序
MAC接口数据发送时序如下图所示。需要注意的是,在一个数据包持续期间mac_tx_data_valid信号持续为1。
3.4.2接收时序
MAC接口数据接收时序如下图所示。需要注意的是,在一个数据包持续期间mac_rx_data_valid信号必须持续为1。
3.5注意事项
可发送数据的长度范围为1~1472字节(不含UDP、IP、MAC协议首部)。
虽然协议栈的用户接口和MAC接口都采用了AXI-Stream形式,但是由于设计架构的限制,在一个数据包持续期间AXI-Stream的valid信号都持续为高,直到1个数据包结束。若用户需要将协议栈的用户接口和MAC接口与支持valid信号不持续为高的标准AXI-Stream接口连接,建议中间采用AXI-Stream DATA FIFO配合其packet mode功能进行数据缓冲。关于协议栈的使用在新一代开发板开发板的后续教程中给出了应用实例。