aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x300/x300_eth_interface.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/x300/x300_eth_interface.v')
-rw-r--r--fpga/usrp3/top/x300/x300_eth_interface.v114
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