在前面的基础上,将mac,数据两通道仲裁,arp,ip,icmp,udp等模块搭建完毕。进行组帧处理,预留的axi_user中包含了分片用于巨帧的处理。目前完成的版本是普通数据长度。巨帧协议栈版本需要等到后续与udp层一起修改。
1,udp_stack(不包含巨帧)
对前面的各个模块的代码进行连接,
module _10g_ehternet_udp_stack
#(
parameter P_SOURCE_MAC = 48'h00_00_00_00_00_00,
parameter P_TARGET_MAC = 48'h00_00_00_00_00_00,
parameter P_SOURCE_IP = 32'hc0_01_01_01,
parameter P_TARGET_IP = 32'hc0_01_01_01,
parameter P_SOURCE_PORT = 16'h8080 ,
parameter P_TARGET_PORT = 16'h8080
)
(
input i_clk ,
input i_rst ,
/************** xgmii *********************/
input [ 63:0] i_xgmii_rxd ,
input [ 7:0] i_xgmii_rxc ,
output [ 63:0] o_xgmii_txd ,
output [ 7:0] o_xgmii_txc ,
/************** drp_interdace *********************/
input [ 47:0] i_set_source_mac ,
input i_set_source_mac_valid ,
input [ 47:0] i_set_target_mac ,
input i_set_target_mac_valid ,
input [ 31:0] i_dynamic_source_ip ,
input i_dynamic_source_valid ,
input [ 31:0] i_dynamic_target_ip ,
input i_dynamic_target_valid ,
input i_arp_active ,//主动arp
/************** user_interface *********************/
input [ 63:0] s_axis_user_data ,
input [ 31:0] s_axis_user_user ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
input [ 7:0] s_axis_user_keep ,
input s_axis_user_last ,
input s_axis_user_valid ,
output s_axis_user_ready ,
output [ 63:0] m_axis_user_data ,
output [ 31:0] m_axis_user_user ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
output [ 7:0] m_axis_user_keep ,
output m_axis_user_last ,
output m_axis_user_valid
);
/*******************************************************/
/************** mac *********************/
/*******************************************************/
wire [ 63:0] w_m_axis_mac_out_data ;
wire [ 79:0] w_m_axis_mac_out_user ;
wire [ 7:0] w_m_axis_mac_out_keep ;
wire w_m_axis_mac_out_last ;
wire w_m_axis_mac_out_valid ;
wire [ 63:0] w_s_axis_arbiter2mac_data ;
wire [ 79:0] w_s_axis_arbiter2mac_user ;
wire [ 7:0] w_s_axis_arbiter2mac_keep ;
wire w_s_axis_arbiter2mac_last ;
wire w_s_axis_arbiter2mac_valid ;
/*******************************************************/
/************** ip *********************/
/*******************************************************/
wire [ 31:0] w_ip2arp_find_ip ;
wire w_ip2arp_find_valid ;
wire [ 47:0] w_arp2mac_find_mac ;
wire w_arp2mac_find_valid ;
wire [ 63:0] w_m_axis_ip2mac_data ;
wire [ 79:0] w_m_axis_ip2mac_user ;
wire [ 7:0] w_m_axis_ip2mac_keep ;
wire w_m_axis_ip2mac_last ;
wire w_m_axis_ip2mac_valid ;
wire [ 63:0] w_s_axis_arbiter2ip_data ;
wire [ 79:0] w_s_axis_arbiter2ip_user ;
wire [ 7:0] w_s_axis_arbiter2ip_keep ;
wire w_s_axis_arbiter2ip_last ;
wire w_s_axis_arbiter2ip_valid ;
wire [ 63:0] w_m_axis_ip_out_data ;
wire [ 55:0] w_m_axis_ip_out_user ;
wire [ 7:0] w_m_axis_ip_out_keep ;
wire w_m_axis_ip_out_last ;
wire w_m_axis_ip_out_valid ;
/*******************************************************/
/************** arp *********************/
/*******************************************************/
wire [ 63:0] w_m_axis_arp2mac_data ;
wire [ 79:0] w_m_axis_arp2mac_user ;
wire [ 7:0] w_m_axis_arp2mac_keep ;
wire w_m_axis_arp2mac_last ;
wire w_m_axis_arp2mac_valid ;
/*******************************************************/
/************** icmp *********************/
/*******************************************************/
wire [ 63:0] w_m_axis_icmp2ip_data ;
wire [ 55:0] w_m_axis_icmp2ip_user ;
wire [ 7:0] w_m_axis_icmp2ip_keep ;
wire w_m_axis_icmp2ip_last ;
wire w_m_axis_icmp2ip_valid ;
/*******************************************************/
/************** udp *********************/
/*******************************************************/
wire [ 63:0] w_m_axis_udp2ip_data ;
wire [ 55:0] w_m_axis_udp2ip_user ;
wire [ 7:0] w_m_axis_udp2ip_keep ;
wire w_m_axis_udp2ip_last ;
wire w_m_axis_udp2ip_valid ;
_10g_mac_module
#(
.P_SOURCE_MAC (P_SOURCE_MAC ),
.P_TARGET_MAC (P_TARGET_MAC )
)
_10g_mac_module_inst
(
.i_xgmii_clk (i_clk ),
.i_xgmii_rst (i_rst ),
.i_xgmii_rxd (i_xgmii_rxd ),
.i_xgmii_rxc (i_xgmii_rxc ),
.o_xgmii_txd (o_xgmii_txd ),
.o_xgmii_txc (o_xgmii_txc ),
.i_find_mac (w_arp2mac_find_mac ),
.i_find_mac_valid (w_arp2mac_find_valid ),
//动态配置mac
.i_set_source_mac ( ),
.i_set_source_mac_valid ( ),
.i_set_target_mac ( ),
.i_set_target_mac_valid ( ),
.m_axis_data (w_m_axis_mac_out_data ),
.m_axis_user (w_m_axis_mac_out_user ),//24'd0,6'dsource_mac,2'dtype
.m_axis_keep (w_m_axis_mac_out_keep ),
.m_axis_last (w_m_axis_mac_out_last ),
.m_axis_valid (w_m_axis_mac_out_valid ),
.s_axis_data (w_s_axis_arbiter2mac_data ),
.s_axis_user (w_s_axis_arbiter2mac_user ),//24'd0,6'dsource_mac,2'dtype
.s_axis_keep (w_s_axis_arbiter2mac_keep ),
.s_axis_last (w_s_axis_arbiter2mac_last ),
.s_axis_valid (w_s_axis_arbiter2mac_valid)
);
arbiter_2_channel arbiter_2_channel_mac_ip
(
.i_clk (i_clk ),
.i_rst (i_rst ),
//c1
.s_c1_axis_data (w_m_axis_arp2mac_data ),
.s_c1_axis_user (w_m_axis_arp2mac_user ),//len(16)+source_mac(48)+type(16)
.s_c1_axis_keep (w_m_axis_arp2mac_keep ),
.s_c1_axis_last (w_m_axis_arp2mac_last ),
.s_c1_axis_valid (w_m_axis_arp2mac_valid ),
.s_c1_axis_ready ( ),//
//c2
.s_c2_axis_data (w_m_axis_ip2mac_data ),
.s_c2_axis_user (w_m_axis_ip2mac_user ),//len(16)+source_mac(48)+type(16)
.s_c2_axis_keep (w_m_axis_ip2mac_keep ),
.s_c2_axis_last (w_m_axis_ip2mac_last ),
.s_c2_axis_valid (w_m_axis_ip2mac_valid ),
.s_c2_axis_ready ( ),//
//arbiter
//c1
.m_axis_data (w_s_axis_arbiter2mac_data ),
.m_axis_user (w_s_axis_arbiter2mac_user ),
.m_axis_keep (w_s_axis_arbiter2mac_keep ),
.m_axis_last (w_s_axis_arbiter2mac_last ),
.m_axis_valid (w_s_axis_arbiter2mac_valid)
);
_10g_arp_module
#(
.P_SOURCE_MAC (P_SOURCE_MAC ),
.P_SOURCE_IP (P_SOURCE_IP ),
.P_TABLE_DEEP (8 )
)
_10g_arp_module
(
.i_clk (i_clk ),
.i_rst (i_rst ),
//drp
.i_set_source_mac (i_set_source_mac ),
.i_set_source_mac_valid (i_set_source_mac_valid ),
.i_dynamic_source_ip (i_dynamic_source_ip ),
.i_dynamic_source_valid (i_dynamic_source_valid ),
.i_arp_active (i_arp_active ),//主动arp
//写入table的mac,ip
.i_write_mac ( ),
.i_write_ip ( ),
.i_write_valid ( ),
//查找table的mac
.i_find_ip (w_ip2arp_find_ip ),
.i_find_valid (w_ip2arp_find_valid ),
.o_find_mac (w_arp2mac_find_mac ),
.o_find_valid (w_arp2mac_find_valid ),
/************** arp_tx *********************/
.m_axis_data (w_m_axis_arp2mac_data ),
.m_axis_user (w_m_axis_arp2mac_user ),//len(16)+source_mac(48)+type(16)
.m_axis_keep (w_m_axis_arp2mac_keep ),
.m_axis_last (w_m_axis_arp2mac_last ),
.m_axis_valid (w_m_axis_arp2mac_valid ),
/************** arp_rx *********************/
.s_axis_data (w_m_axis_mac_out_data ),
.s_axis_user (w_m_axis_mac_out_user ),//len(16)+source_mac(48)+type(16)
.s_axis_keep (w_m_axis_mac_out_keep ),
.s_axis_last (w_m_axis_mac_out_last ),
.s_axis_valid (w_m_axis_mac_out_valid )
);
_10g_ip_module
#(
.P_SOURCE_IP (P_SOURCE_IP ),
.P_TARGET_IP (P_TARGET_IP )
)
_10g_ip_module_inst
(
.i_clk (i_clk ),
.i_rst (i_rst ),
.o_find_ip (w_ip2arp_find_ip ),
.o_find_valid (w_ip2arp_find_valid ),
//drp
.i_dynamic_source_ip (i_dynamic_source_ip ),
.i_dynamic_source_valid (i_dynamic_source_valid ),
.i_dynamic_target_ip (i_dynamic_target_ip ),
.i_dynamic_target_valid (i_dynamic_target_valid ),
/************** axi_mac *********************/
.m_axis_mac_data (w_m_axis_ip2mac_data ),
.m_axis_mac_user (w_m_axis_ip2mac_user ),//len(16)+source_mac(48)+type(16)
.m_axis_mac_keep (w_m_axis_ip2mac_keep ),
.m_axis_mac_last (w_m_axis_ip2mac_last ),
.m_axis_mac_valid (w_m_axis_ip2mac_valid ),
.s_axis_mac_data (w_m_axis_mac_out_data ),
.s_axis_mac_user (w_m_axis_mac_out_user ),//len(16)+source_mac(48)+type(16)
.s_axis_mac_keep (w_m_axis_mac_out_keep ),
.s_axis_mac_last (w_m_axis_mac_out_last ),
.s_axis_mac_valid (w_m_axis_mac_out_valid ),
/************** axi_out *********************/
//与UDP或者ICMP层的交互
.m_axis_out_data (w_m_axis_ip_out_data ),
.m_axis_out_user (w_m_axis_ip_out_user ),//16len + 8type + 16ip + 3mflag + 13offset
.m_axis_out_keep (w_m_axis_ip_out_keep ),
.m_axis_out_last (w_m_axis_ip_out_last ),
.m_axis_out_valid (w_m_axis_ip_out_valid ),
.s_axis_out_data (w_s_axis_arbiter2ip_data ),
.s_axis_out_user (w_s_axis_arbiter2ip_user[55:0]),//16len + 8type + 16ip + 3mflag + 13offset
.s_axis_out_keep (w_s_axis_arbiter2ip_keep ),
.s_axis_out_last (w_s_axis_arbiter2ip_last ),
.s_axis_out_valid (w_s_axis_arbiter2ip_valid )
);
arbiter_2_channel arbiter_2_channel_icmp_udp
(
.i_clk (i_clk ),
.i_rst (i_rst ),
//c1
.s_c1_axis_data (w_m_axis_icmp2ip_data ),
.s_c1_axis_user ({24'd0,w_m_axis_icmp2ip_user}),//len(16)+source_mac(48)+type(16)
.s_c1_axis_keep (w_m_axis_icmp2ip_keep ),
.s_c1_axis_last (w_m_axis_icmp2ip_last ),
.s_c1_axis_valid (w_m_axis_icmp2ip_valid ),
.s_c1_axis_ready ( ),//
//c2
.s_c2_axis_data (w_m_axis_udp2ip_data ),
.s_c2_axis_user ({24'd0,w_m_axis_udp2ip_user}),//len(16)+source_mac(48)+type(16)
.s_c2_axis_keep (w_m_axis_udp2ip_keep ),
.s_c2_axis_last (w_m_axis_udp2ip_last ),
.s_c2_axis_valid (w_m_axis_udp2ip_valid ),
.s_c2_axis_ready ( ),//
//arbiter
//c1
.m_axis_data (w_s_axis_arbiter2ip_data ),
.m_axis_user (w_s_axis_arbiter2ip_user ),
.m_axis_keep (w_s_axis_arbiter2ip_keep ),
.m_axis_last (w_s_axis_arbiter2ip_last ),
.m_axis_valid (w_s_axis_arbiter2ip_valid )
);
_10g_icmp_module _10g_icmp_module_inst
(
.i_clk (i_clk ),
.i_rst (i_rst ),
.m_axis_icmp2ip_data (w_m_axis_icmp2ip_data ),
.m_axis_icmp2ip_user (w_m_axis_icmp2ip_user ),//16len + 8type + 16ip + 3mflag + 13offset
.m_axis_icmp2ip_keep (w_m_axis_icmp2ip_keep ),
.m_axis_icmp2ip_last (w_m_axis_icmp2ip_last ),
.m_axis_icmp2ip_valid (w_m_axis_icmp2ip_valid ),
.s_axis_ip2icmp_data (w_m_axis_ip_out_data ),
.s_axis_ip2icmp_user (w_m_axis_ip_out_user ),//16len + 8type + 16ip + 3mflag + 13offset
.s_axis_ip2icmp_keep (w_m_axis_ip_out_keep ),
.s_axis_ip2icmp_last (w_m_axis_ip_out_last ),
.s_axis_ip2icmp_valid (w_m_axis_ip_out_valid )
);
_10g_udp_module
#(
.P_SOURCE_PORT (P_SOURCE_PORT ),
.P_TARGET_PORT (P_TARGET_PORT )
)
_10g_udp_module_inst
(
.i_clk (i_clk ),
.i_rst (i_rst ),
/************** drp *********************/
.i_dynamic_source_port (i_dynamic_source_port ),
.i_dynamic_source_valid (i_dynamic_source_valid ),
.i_dynamic_target_port (i_dynamic_target_port ),
.i_dynamic_target_valid (i_dynamic_target_valid ),
/************** ip_interface *********************/
.m_axis_udp2ip_data (w_m_axis_udp2ip_data ),
.m_axis_udp2ip_user (w_m_axis_udp2ip_user ),//16len + 8type + 16ip + 3mflag + 13offset
.m_axis_udp2ip_keep (w_m_axis_udp2ip_keep ),
.m_axis_udp2ip_last (w_m_axis_udp2ip_last ),
.m_axis_udp2ip_valid (w_m_axis_udp2ip_valid ),
.s_axis_ip2udp_data (w_m_axis_ip_out_data ),
.s_axis_ip2udp_user (w_m_axis_ip_out_user ),//16len + 8type + 16ip + 3mflag + 13offset
.s_axis_ip2udp_keep (w_m_axis_ip_out_keep ),
.s_axis_ip2udp_last (w_m_axis_ip_out_last ),
.s_axis_ip2udp_valid (w_m_axis_ip_out_valid ),
/************** user_interface *********************/
.s_axis_user_data (s_axis_user_data ),
.s_axis_user_user (s_axis_user_user ),//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
.s_axis_user_keep (s_axis_user_keep ),
.s_axis_user_last (s_axis_user_last ),
.s_axis_user_valid (s_axis_user_valid ),
.s_axis_user_ready (s_axis_user_ready ),
.m_axis_user_data (m_axis_user_data ),
.m_axis_user_user (m_axis_user_user ),//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
.m_axis_user_keep (m_axis_user_keep ),
.m_axis_user_last (m_axis_user_last ),
.m_axis_user_valid (m_axis_user_valid )
);
将两个顶层模块连接在一起进行整体仿真,内部有一个自产生的test模块,产生数据:
连接:
xcku060_10g_ethernet_top
#(
.P_SOURCE_MAC (P_SOURCE_MAC ),
.P_TARGET_MAC (P_TARGET_MAC ),
.P_SOURCE_IP (P_SOURCE_IP ),
.P_TARGET_IP (P_TARGET_IP ),
.P_SOURCE_PORT (P_SOURCE_PORT ),
.P_TARGET_PORT (P_TARGET_PORT )
)
xcku060_10g_ethernet_top_send
(
.i_sys_clk_p (r_sys_clk ),
.i_sys_clk_n (~r_sys_clk ),
.i_mgtrefclk_p (r_mgtref_clk ),
.i_mgtrefclk_n (~r_mgtref_clk ),
.o_gt_tx_p (w_send_send_gt_tx_p ),
.o_gt_tx_n (w_send_send_gt_tx_n ),
.i_gt_rx_p (w_send_rec_gt_rx_p ),
.i_gt_rx_n (w_send_rec_gt_rx_n ),
.o_sfp_disable ( )
);
xcku060_10g_ethernet_top
#(
.P_SOURCE_MAC (P_TARGET_MAC ),
.P_TARGET_MAC (P_SOURCE_MAC ),
.P_SOURCE_IP (P_TARGET_IP ),
.P_TARGET_IP (P_SOURCE_IP ),
.P_SOURCE_PORT (P_TARGET_PORT ),
.P_TARGET_PORT (P_SOURCE_PORT )
)
xcku060_10g_ethernet_top_rec
(
.i_sys_clk_p (r_sys_clk ),
.i_sys_clk_n (~r_sys_clk ),
.i_mgtrefclk_p (r_mgtref_clk ),
.i_mgtrefclk_n (~r_mgtref_clk ),
.o_gt_tx_p (w_send_rec_gt_rx_p ),
.o_gt_tx_n (w_send_rec_gt_rx_n ),
.i_gt_rx_p (w_send_send_gt_tx_p ),
.i_gt_rx_n (w_send_send_gt_tx_n ),
.o_sfp_disable ( )
);
自产生数据模块:
module mac_speed_test
#(
parameter P_LAST_KEEP = 8'b1111_1111,
parameter P_SOURCE_MAC = 48'h00_00_00_00_00_00,
parameter P_TARGET_MAC = 48'h00_00_00_00_00_00
)
(
input i_clk ,
input i_rst ,
input [ 63:0] s_axis_data ,
input [ 31:0] s_axis_user ,
input [ 7:0] s_axis_keep ,
input s_axis_last ,
input s_axis_valid ,
input m_axis_ready ,
output [ 63:0] m_axis_data ,
output [ 31:0] m_axis_user ,//{16'data_len,16'axi_len} //包含两种len,一种时用于传输的len,一种适用于udp头部中的数据长度len
output [ 7:0] m_axis_keep ,
output m_axis_last ,
output m_axis_valid
);
仿真波形:
2,udp_stack(包含巨帧)
等待施工。。。