diff options
Diffstat (limited to 'fpga/usrp3/top/x300/x300_eth_interface.v')
-rw-r--r-- | fpga/usrp3/top/x300/x300_eth_interface.v | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x300/x300_eth_interface.v b/fpga/usrp3/top/x300/x300_eth_interface.v new file mode 100644 index 000000000..fc1cbe115 --- /dev/null +++ b/fpga/usrp3/top/x300/x300_eth_interface.v @@ -0,0 +1,114 @@ +// +// Copyright 2014 Ettus Research LLC +// Copyright 2018 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Adapts from internal VITA to ethernet packets. Also handles ZPU and ethernet crossover interfaces. + +module x300_eth_interface #( + parameter [15:0] PROTOVER = {8'd1, 8'd0}, + parameter MTU = 10, + parameter NODE_INST = 0, + parameter RT_TBL_SIZE = 6, + parameter BASE = 0 +) ( + input clk, input reset, + input [15:0] device_id, + input set_stb, input [7:0] set_addr, input [31:0] set_data, + // Eth ports + output [63:0] eth_tx_tdata, output [3:0] eth_tx_tuser, output eth_tx_tlast, output eth_tx_tvalid, input eth_tx_tready, + input [63:0] eth_rx_tdata, input [3:0] eth_rx_tuser, input eth_rx_tlast, input eth_rx_tvalid, output eth_rx_tready, + // Vita router interface + output [63:0] e2v_tdata, output e2v_tlast, output e2v_tvalid, input e2v_tready, + input [63:0] v2e_tdata, input v2e_tlast, input v2e_tvalid, output v2e_tready, + // ZPU + output [63:0] e2z_tdata, output [3:0] e2z_tuser, output e2z_tlast, output e2z_tvalid, input e2z_tready, + input [63:0] z2e_tdata, input [3:0] z2e_tuser, input z2e_tlast, input z2e_tvalid, output z2e_tready +); + + // UNUSED: BASE to BASE+7 + localparam MY_ETH_ADDR_LO_REG = BASE + 8; + localparam MY_ETH_ADDR_HI_REG = BASE + 9; + localparam MY_IP_ADDR_REG = BASE + 10; + localparam MY_UDP_PORT_REG = BASE + 11; + // UNUSED: BASE+12 to BASE+15 + + wire [47:0] my_eth_addr; + wire [31:0] my_ipv4_addr; + wire [15:0] my_udp_chdr_port; + + // MAC address for the dispatcher module. + // This value is used to determine if the packet is meant + // for this device should be consumed + setting_reg #(.my_addr(MY_ETH_ADDR_LO_REG), .awidth(8), .width(32)) sr_my_mac_lsb + (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), + .in(set_data),.out(my_eth_addr[31:0]),.changed()); + setting_reg #(.my_addr(MY_ETH_ADDR_HI_REG), .awidth(8), .width(16)) sr_my_mac_msb + (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), + .in(set_data),.out(my_eth_addr[47:32]),.changed()); + + // IP address for the dispatcher module. + // This value is used to determine if the packet is addressed + // to this device + setting_reg #(.my_addr(MY_IP_ADDR_REG), .awidth(8), .width(32)) sr_my_ip + (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), + .in(set_data),.out(my_ipv4_addr[31:0]),.changed()); + + // This module supports one destinatio port + setting_reg #(.my_addr(MY_UDP_PORT_REG), .awidth(8), .width(16)) sr_udp_port + (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), + .in(set_data),.out({my_udp_chdr_port[15:0]}),.changed()); + + eth_ipv4_chdr64_adapter #( + .PROTOVER (PROTOVER), + .MTU (MTU), + .CPU_FIFO_SIZE (MTU), + .RT_TBL_SIZE (RT_TBL_SIZE), + .NODE_INST (NODE_INST), + .DROP_UNKNOWN_MAC(1) + ) eth_adapter_i ( + .clk (clk ), + .rst (reset ), + .device_id (device_id ), + .s_mac_tdata (eth_rx_tdata ), + .s_mac_tuser (eth_rx_tuser ), + .s_mac_tlast (eth_rx_tlast ), + .s_mac_tvalid (eth_rx_tvalid ), + .s_mac_tready (eth_rx_tready ), + .m_mac_tdata (eth_tx_tdata ), + .m_mac_tuser (eth_tx_tuser ), + .m_mac_tlast (eth_tx_tlast ), + .m_mac_tvalid (eth_tx_tvalid ), + .m_mac_tready (eth_tx_tready ), + .s_chdr_tdata (v2e_tdata ), + .s_chdr_tlast (v2e_tlast ), + .s_chdr_tvalid (v2e_tvalid ), + .s_chdr_tready (v2e_tready ), + .m_chdr_tdata (e2v_tdata ), + .m_chdr_tlast (e2v_tlast ), + .m_chdr_tvalid (e2v_tvalid ), + .m_chdr_tready (e2v_tready ), + .s_cpu_tdata ({z2e_tdata[7:0], z2e_tdata[15:8], + z2e_tdata[23:16], z2e_tdata[31:24], + z2e_tdata[39:32], z2e_tdata[47:40], + z2e_tdata[55:48], z2e_tdata[63:56]}), + .s_cpu_tuser (z2e_tuser ), + .s_cpu_tlast (z2e_tlast ), + .s_cpu_tvalid (z2e_tvalid ), + .s_cpu_tready (z2e_tready ), + .m_cpu_tdata ({e2z_tdata[7:0], e2z_tdata[15:8], + e2z_tdata[23:16], e2z_tdata[31:24], + e2z_tdata[39:32], e2z_tdata[47:40], + e2z_tdata[55:48], e2z_tdata[63:56]}), + .m_cpu_tuser (e2z_tuser ), + .m_cpu_tlast (e2z_tlast ), + .m_cpu_tvalid (e2z_tvalid ), + .m_cpu_tready (e2z_tready ), + .my_eth_addr (my_eth_addr ), + .my_ipv4_addr (my_ipv4_addr ), + .my_udp_chdr_port(my_udp_chdr_port) + ); + + +endmodule // x300_eth_interface |