aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x300/x300_core.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/x300/x300_core.v')
-rw-r--r--fpga/usrp3/top/x300/x300_core.v680
1 files changed, 680 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x300/x300_core.v b/fpga/usrp3/top/x300/x300_core.v
new file mode 100644
index 000000000..0a721e06b
--- /dev/null
+++ b/fpga/usrp3/top/x300/x300_core.v
@@ -0,0 +1,680 @@
+//
+// Copyright 2014 Ettus Research LLC
+// Copyright 2017 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: LGPL-3.0-or-later
+//
+
+module x300_core #(
+ parameter BUS_CLK_RATE = 32'd166666666
+)(
+ //Clocks and resets
+ input radio_clk,
+ input radio_rst,
+ input bus_clk,
+ input bus_rst,
+ input ce_clk,
+ input ce_rst,
+ output [3:0] sw_rst,
+ input bus_clk_div2,
+ input bus_rst_div2,
+ // Radio 0
+ input [31:0] rx0, output [31:0] tx0,
+ input [31:0] db0_gpio_in, output [31:0] db0_gpio_out, output [31:0] db0_gpio_ddr,
+ input [31:0] fp_gpio_in, output [31:0] fp_gpio_out, output [31:0] fp_gpio_ddr,
+ output [7:0] sen0, output sclk0, output mosi0, input miso0,
+ output [2:0] radio_led0,
+ output reg [31:0] radio0_misc_out, input [31:0] radio0_misc_in,
+ // Radio 1
+ input [31:0] rx1, output [31:0] tx1,
+ input [31:0] db1_gpio_in, output [31:0] db1_gpio_out, output [31:0] db1_gpio_ddr,
+ output [7:0] sen1, output sclk1, output mosi1, input miso1,
+ output [2:0] radio_led1,
+ output reg [31:0] radio1_misc_out, input [31:0] radio1_misc_in,
+ // Radio shared misc
+ inout db_scl,
+ inout db_sda,
+ // Clock control
+ input ext_ref_clk,
+ output [1:0] clock_ref_sel,
+ output [1:0] clock_misc_opt,
+ input [1:0] LMK_Status,
+ input LMK_Holdover, input LMK_Lock, output LMK_Sync,
+ output LMK_SEN, output LMK_SCLK, output LMK_MOSI,
+ input [2:0] misc_clock_status,
+ // SFP+ pins
+ inout SFPP0_SCL,
+ inout SFPP0_SDA,
+ inout SFPP0_RS0,
+ inout SFPP0_RS1,
+ input SFPP0_ModAbs,
+ input SFPP0_TxFault,
+ input SFPP0_RxLOS,
+ output SFPP0_TxDisable, // Assert low to enable transmitter.
+
+ inout SFPP1_SCL,
+ inout SFPP1_SDA,
+ inout SFPP1_RS0,
+ inout SFPP1_RS1,
+ input SFPP1_ModAbs,
+ input SFPP1_TxFault,
+ input SFPP1_RxLOS,
+ output SFPP1_TxDisable, // Assert low to enable transmitter.
+
+ // SFP+ 0 data stream
+ output [63:0] sfp0_tx_tdata,
+ output [3:0] sfp0_tx_tuser,
+ output sfp0_tx_tlast,
+ output sfp0_tx_tvalid,
+ input sfp0_tx_tready,
+
+ input [63:0] sfp0_rx_tdata,
+ input [3:0] sfp0_rx_tuser,
+ input sfp0_rx_tlast,
+ input sfp0_rx_tvalid,
+ output sfp0_rx_tready,
+
+ input [15:0] sfp0_phy_status,
+
+ // SFP+ 1 data stream
+ output [63:0] sfp1_tx_tdata,
+ output [3:0] sfp1_tx_tuser,
+ output sfp1_tx_tlast,
+ output sfp1_tx_tvalid,
+ input sfp1_tx_tready,
+
+ input [63:0] sfp1_rx_tdata,
+ input [3:0] sfp1_rx_tuser,
+ input sfp1_rx_tlast,
+ input sfp1_rx_tvalid,
+ output sfp1_rx_tready,
+
+ input [15:0] sfp1_phy_status,
+
+ input [31:0] sfp0_wb_dat_i,
+ output [31:0] sfp0_wb_dat_o,
+ output [15:0] sfp0_wb_adr,
+ output [3:0] sfp0_wb_sel,
+ input sfp0_wb_ack,
+ output sfp0_wb_stb,
+ output sfp0_wb_cyc,
+ output sfp0_wb_we,
+ input sfp0_wb_int, // IJB. Nothing to connect this too!! No IRQ controller on x300.
+
+ input [31:0] sfp1_wb_dat_i,
+ output [31:0] sfp1_wb_dat_o,
+ output [15:0] sfp1_wb_adr,
+ output [3:0] sfp1_wb_sel,
+ input sfp1_wb_ack,
+ output sfp1_wb_stb,
+ output sfp1_wb_cyc,
+ output sfp1_wb_we,
+ input sfp1_wb_int, // IJB. Nothing to connect this too!! No IRQ controller on x300.
+
+ input [31:0] xadc_readback,
+
+ // Time
+ input pps,
+ output [1:0] pps_select,
+ output pps_out_enb,
+ output [31:0] ref_freq,
+ output ref_freq_changed,
+ output gps_txd,
+ input gps_rxd,
+ // Debug UART
+ input debug_rxd,
+ output debug_txd,
+
+ //
+ // AXI4 (128b@250MHz) interface to DDR3 controller
+ //
+ input ddr3_axi_clk,
+ input ddr3_axi_clk_x2,
+ input ddr3_axi_rst,
+ // Write Address Ports
+ output ddr3_axi_awid,
+ output [31:0] ddr3_axi_awaddr,
+ output [7:0] ddr3_axi_awlen,
+ output [2:0] ddr3_axi_awsize,
+ output [1:0] ddr3_axi_awburst,
+ output [0:0] ddr3_axi_awlock,
+ output [3:0] ddr3_axi_awcache,
+ output [2:0] ddr3_axi_awprot,
+ output [3:0] ddr3_axi_awqos,
+ output ddr3_axi_awvalid,
+ input ddr3_axi_awready,
+ // Write Data Ports
+ output [255:0] ddr3_axi_wdata,
+ output [31:0] ddr3_axi_wstrb,
+ output ddr3_axi_wlast,
+ output ddr3_axi_wvalid,
+ input ddr3_axi_wready,
+ // Write Response Ports
+ output ddr3_axi_bready,
+ input ddr3_axi_bid,
+ input [1:0] ddr3_axi_bresp,
+ input ddr3_axi_bvalid,
+ // Read Address Ports
+ output ddr3_axi_arid,
+ output [31:0] ddr3_axi_araddr,
+ output [7:0] ddr3_axi_arlen,
+ output [2:0] ddr3_axi_arsize,
+ output [1:0] ddr3_axi_arburst,
+ output [0:0] ddr3_axi_arlock,
+ output [3:0] ddr3_axi_arcache,
+ output [2:0] ddr3_axi_arprot,
+ output [3:0] ddr3_axi_arqos,
+ output ddr3_axi_arvalid,
+ input ddr3_axi_arready,
+ // Read Data Ports
+ output ddr3_axi_rready,
+ input ddr3_axi_rid,
+ input [255:0] ddr3_axi_rdata,
+ input [1:0] ddr3_axi_rresp,
+ input ddr3_axi_rlast,
+ input ddr3_axi_rvalid,
+
+ //iop2 message fifos
+ output [63:0] o_iop2_msg_tdata,
+ output o_iop2_msg_tvalid,
+ output o_iop2_msg_tlast,
+ input o_iop2_msg_tready,
+ input [63:0] i_iop2_msg_tdata,
+ input i_iop2_msg_tvalid,
+ input i_iop2_msg_tlast,
+ output i_iop2_msg_tready,
+
+ //PCIe
+ output [63:0] pcio_tdata,
+ output [2:0] pcio_tuser,
+ output pcio_tlast,
+ output pcio_tvalid,
+ input pcio_tready,
+ input [63:0] pcii_tdata,
+ input [2:0] pcii_tuser,
+ input pcii_tlast,
+ input pcii_tvalid,
+ output pcii_tready,
+
+ // Debug
+ output [1:0] led_misc,
+ output [31:0] debug0,
+ output [31:0] debug1,
+ output [127:0] debug2
+);
+
+ // Memory Controller AXI4 MM buses
+ wire s00_axi_awready, s01_axi_awready;
+ wire [0:0] s00_axi_awid, s01_axi_awid;
+ wire [31:0] s00_axi_awaddr, s01_axi_awaddr;
+ wire [7:0] s00_axi_awlen, s01_axi_awlen;
+ wire [2:0] s00_axi_awsize, s01_axi_awsize;
+ wire [1:0] s00_axi_awburst, s01_axi_awburst;
+ wire [0:0] s00_axi_awlock, s01_axi_awlock;
+ wire [3:0] s00_axi_awcache, s01_axi_awcache;
+ wire [2:0] s00_axi_awprot, s01_axi_awprot;
+ wire [3:0] s00_axi_awqos, s01_axi_awqos;
+ wire [3:0] s00_axi_awregion, s01_axi_awregion;
+ wire [0:0] s00_axi_awuser, s01_axi_awuser;
+ wire s00_axi_wready, s01_axi_wready;
+ wire [63:0] s00_axi_wdata, s01_axi_wdata;
+ wire [7:0] s00_axi_wstrb, s01_axi_wstrb;
+ wire [0:0] s00_axi_wuser, s01_axi_wuser;
+ wire s00_axi_bvalid, s01_axi_bvalid;
+ wire [0:0] s00_axi_bid, s01_axi_bid;
+ wire [1:0] s00_axi_bresp, s01_axi_bresp;
+ wire [0:0] s00_axi_buser, s01_axi_buser;
+ wire s00_axi_arready, s01_axi_arready;
+ wire [0:0] s00_axi_arid, s01_axi_arid;
+ wire [31:0] s00_axi_araddr, s01_axi_araddr;
+ wire [7:0] s00_axi_arlen, s01_axi_arlen;
+ wire [2:0] s00_axi_arsize, s01_axi_arsize;
+ wire [1:0] s00_axi_arburst, s01_axi_arburst;
+ wire [0:0] s00_axi_arlock, s01_axi_arlock;
+ wire [3:0] s00_axi_arcache, s01_axi_arcache;
+ wire [2:0] s00_axi_arprot, s01_axi_arprot;
+ wire [3:0] s00_axi_arqos, s01_axi_arqos;
+ wire [3:0] s00_axi_arregion, s01_axi_arregion;
+ wire [0:0] s00_axi_aruser, s01_axi_aruser;
+ wire s00_axi_rlast, s01_axi_rlast;
+ wire s00_axi_rvalid, s01_axi_rvalid;
+ wire s00_axi_awvalid, s01_axi_awvalid;
+ wire s00_axi_wlast, s01_axi_wlast;
+ wire s00_axi_wvalid, s01_axi_wvalid;
+ wire s00_axi_bready, s01_axi_bready;
+ wire s00_axi_arvalid, s01_axi_arvalid;
+ wire s00_axi_rready, s01_axi_rready;
+ wire [0:0] s00_axi_rid, s01_axi_rid;
+ wire [63:0] s00_axi_rdata, s01_axi_rdata;
+ wire [1:0] s00_axi_rresp, s01_axi_rresp;
+ wire [0:0] s00_axi_ruser, s01_axi_ruser;
+
+
+ /////////////////////////////////////////////////////////////////////////////////
+ // PPS synchronization logic
+ /////////////////////////////////////////////////////////////////////////////////
+ wire pps_rclk, pps_detect;
+ pps_synchronizer pps_sync_inst (
+ .ref_clk(ext_ref_clk), .timebase_clk(radio_clk),
+ .pps_in(pps), .pps_out(pps_rclk), .pps_count(pps_detect)
+ );
+
+ /////////////////////////////////////////////////////////////////////////////////
+ // Bus Int containing soft CPU control, routing fabric
+ /////////////////////////////////////////////////////////////////////////////////
+
+ // Number of Radio Cores Instantiated
+ localparam NUM_RADIOS = 2;
+ localparam NUM_DBOARDS = NUM_RADIOS;
+ localparam NUM_CHANNELS_PER_RADIO = 2;
+ localparam NUM_CHANNELS = NUM_CHANNELS_PER_RADIO * NUM_RADIOS;
+ localparam NUM_CHANNELS_PER_DBOARD = NUM_CHANNELS_PER_RADIO;
+
+ bus_int #(
+ .NUM_RADIOS(NUM_RADIOS),
+ .NUM_CHANNELS_PER_RADIO(NUM_CHANNELS_PER_RADIO),
+ .NUM_CHANNELS(NUM_CHANNELS)
+ ) bus_int_i (
+ .clk(bus_clk), .clk_div2(bus_clk_div2), .reset(bus_rst), .reset_div2(bus_rst_div2),
+ .sen(LMK_SEN), .sclk(LMK_SCLK), .mosi(LMK_MOSI), .miso(1'b0),
+ .scl0(SFPP0_SCL), .sda0(SFPP0_SDA),
+ .scl1(db_scl), .sda1(db_sda),
+ .scl2(SFPP1_SCL), .sda2(SFPP1_SDA),
+ .gps_txd(gps_txd), .gps_rxd(gps_rxd),
+ .debug_txd(debug_txd), .debug_rxd(debug_rxd),
+ .leds(led_misc), .sw_rst(sw_rst),
+ // Timekeeper
+ .pps(pps_rclk),
+ // Block connections
+ .ce_clk (ce_clk),
+ .ce_rst (ce_rst),
+
+ // Radio connections
+ .radio_clk (radio_clk),
+ .radio_rst (radio_rst),
+ .radio_rx_stb ({ rx_stb[3], rx_stb[2], rx_stb[1], rx_stb[0]}),
+ .radio_rx_data ({ rx_data[3], rx_data[2], rx_data[1], rx_data[0]}),
+ .radio_rx_running ({ rx_running[3], rx_running[2], rx_running[1], rx_running[0]}),
+ .radio_tx_stb ({ tx_stb[3], tx_stb[2], tx_stb[1], tx_stb[0]}),
+ .radio_tx_data ({ tx_data[3], tx_data[2], tx_data[1], tx_data[0]}),
+ .radio_tx_running ({ tx_running[3], tx_running[2], tx_running[1], tx_running[0]}),
+ // Daughter board settings buses
+ .db_fe_set_stb ({ db_fe_set_stb[1], db_fe_set_stb[0]}),
+ .db_fe_set_addr({db_fe_set_addr[1], db_fe_set_addr[0]}),
+ .db_fe_set_data({db_fe_set_data[1], db_fe_set_data[0]}),
+ .db_fe_rb_stb ({ db_fe_rb_stb[1], db_fe_rb_stb[0]}),
+ .db_fe_rb_addr ({ db_fe_rb_addr[1], db_fe_rb_addr[0]}),
+ .db_fe_rb_data ({ db_fe_rb_data[1], db_fe_rb_data[0]}),
+ // SFP 0
+ .SFPP0_ModAbs(SFPP0_ModAbs),.SFPP0_TxFault(SFPP0_TxFault),.SFPP0_RxLOS(SFPP0_RxLOS),
+ .SFPP0_RS0(SFPP0_RS0), .SFPP0_RS1(SFPP0_RS1),
+ // SFP 1
+ .SFPP1_ModAbs(SFPP1_ModAbs),.SFPP1_TxFault(SFPP1_TxFault),.SFPP1_RxLOS(SFPP1_RxLOS),
+ .SFPP1_RS0(SFPP1_RS0), .SFPP1_RS1(SFPP1_RS1),
+ //clocky locky misc
+ .clock_status({misc_clock_status, pps_detect, LMK_Holdover, LMK_Lock, LMK_Status}),
+ .clock_control({1'b0, clock_misc_opt[1:0], pps_out_enb, pps_select[1:0], clock_ref_sel[1:0]}),
+ .ref_freq(ref_freq), .ref_freq_changed(ref_freq_changed),
+ // Eth0
+ .sfp0_tx_tdata(sfp0_tx_tdata), .sfp0_tx_tuser(sfp0_tx_tuser), .sfp0_tx_tlast(sfp0_tx_tlast),
+ .sfp0_tx_tvalid(sfp0_tx_tvalid), .sfp0_tx_tready(sfp0_tx_tready),
+ .sfp0_rx_tdata(sfp0_rx_tdata), .sfp0_rx_tuser(sfp0_rx_tuser), .sfp0_rx_tlast(sfp0_rx_tlast),
+ .sfp0_rx_tvalid(sfp0_rx_tvalid), .sfp0_rx_tready(sfp0_rx_tready),
+ // Eth1
+ .sfp1_tx_tdata(sfp1_tx_tdata), .sfp1_tx_tuser(sfp1_tx_tuser), .sfp1_tx_tlast(sfp1_tx_tlast),
+ .sfp1_tx_tvalid(sfp1_tx_tvalid), .sfp1_tx_tready(sfp1_tx_tready),
+ .sfp1_rx_tdata(sfp1_rx_tdata), .sfp1_rx_tuser(sfp1_rx_tuser), .sfp1_rx_tlast(sfp1_rx_tlast),
+ .sfp1_rx_tvalid(sfp1_rx_tvalid), .sfp1_rx_tready(sfp1_rx_tready),
+ // IoP2 Msgs
+ .o_iop2_msg_tdata(o_iop2_msg_tdata), .o_iop2_msg_tvalid(o_iop2_msg_tvalid), .o_iop2_msg_tlast(o_iop2_msg_tlast), .o_iop2_msg_tready(o_iop2_msg_tready),
+ .i_iop2_msg_tdata(i_iop2_msg_tdata), .i_iop2_msg_tvalid(i_iop2_msg_tvalid), .i_iop2_msg_tlast(i_iop2_msg_tlast), .i_iop2_msg_tready(i_iop2_msg_tready),
+ // PCIe
+ .pcio_tdata(pcio_tdata), .pcio_tuser(pcio_tuser), .pcio_tlast(pcio_tlast), .pcio_tvalid(pcio_tvalid), .pcio_tready(pcio_tready),
+ .pcii_tdata(pcii_tdata), .pcii_tuser(pcii_tuser), .pcii_tlast(pcii_tlast), .pcii_tvalid(pcii_tvalid), .pcii_tready(pcii_tready),
+ // Wishbone Slave Interface(s)
+ .sfp0_wb_dat_i(sfp0_wb_dat_i), .sfp0_wb_dat_o(sfp0_wb_dat_o), .sfp0_wb_adr(sfp0_wb_adr),
+ .sfp0_wb_sel(sfp0_wb_sel), .sfp0_wb_ack(sfp0_wb_ack), .sfp0_wb_stb(sfp0_wb_stb),
+ .sfp0_wb_cyc(sfp0_wb_cyc), .sfp0_wb_we(sfp0_wb_we), .sfp0_wb_int(sfp0_wb_int),
+ .sfp1_wb_dat_i(sfp1_wb_dat_i), .sfp1_wb_dat_o(sfp1_wb_dat_o), .sfp1_wb_adr(sfp1_wb_adr),
+ .sfp1_wb_sel(sfp1_wb_sel), .sfp1_wb_ack(sfp1_wb_ack), .sfp1_wb_stb(sfp1_wb_stb),
+ .sfp1_wb_cyc(sfp1_wb_cyc), .sfp1_wb_we(sfp1_wb_we), .sfp1_wb_int(sfp1_wb_int),
+ //Status signals
+ .sfp0_phy_status(sfp0_phy_status),
+ .sfp1_phy_status(sfp1_phy_status),
+ .xadc_readback(xadc_readback),
+
+ // DRAM interface
+ .ddr3_axi_clk_x2 (ddr3_axi_clk_x2),
+ .ddr3_axi_rst (ddr3_axi_rst),
+ // Slave Interface Write Address Ports
+ .ddr3_axi_awid ({s01_axi_awid, s00_axi_awid}),
+ .ddr3_axi_awaddr ({s01_axi_awaddr, s00_axi_awaddr}),
+ .ddr3_axi_awlen ({s01_axi_awlen, s00_axi_awlen}),
+ .ddr3_axi_awsize ({s01_axi_awsize, s00_axi_awsize}),
+ .ddr3_axi_awburst ({s01_axi_awburst, s00_axi_awburst}),
+ .ddr3_axi_awlock ({s01_axi_awlock, s00_axi_awlock}),
+ .ddr3_axi_awcache ({s01_axi_awcache, s00_axi_awcache}),
+ .ddr3_axi_awprot ({s01_axi_awprot, s00_axi_awprot}),
+ .ddr3_axi_awqos ({s01_axi_awqos, s00_axi_awqos}),
+ .ddr3_axi_awvalid ({s01_axi_awvalid, s00_axi_awvalid}),
+ .ddr3_axi_awready ({s01_axi_awready, s00_axi_awready}),
+ // Slave Interface Write Data Ports
+ .ddr3_axi_wdata ({s01_axi_wdata, s00_axi_wdata}),
+ .ddr3_axi_wstrb ({s01_axi_wstrb, s00_axi_wstrb}),
+ .ddr3_axi_wlast ({s01_axi_wlast, s00_axi_wlast}),
+ .ddr3_axi_wvalid ({s01_axi_wvalid, s00_axi_wvalid}),
+ .ddr3_axi_wready ({s01_axi_wready, s00_axi_wready}),
+ // Slave Interface Write Response Ports
+ .ddr3_axi_bid ({s01_axi_bid, s00_axi_bid}),
+ .ddr3_axi_bresp ({s01_axi_bresp, s00_axi_bresp}),
+ .ddr3_axi_bvalid ({s01_axi_bvalid, s00_axi_bvalid}),
+ .ddr3_axi_bready ({s01_axi_bready, s00_axi_bready}),
+ // Slave Interface Read Address Ports
+ .ddr3_axi_arid ({s01_axi_arid, s00_axi_arid}),
+ .ddr3_axi_araddr ({s01_axi_araddr, s00_axi_araddr}),
+ .ddr3_axi_arlen ({s01_axi_arlen, s00_axi_arlen}),
+ .ddr3_axi_arsize ({s01_axi_arsize, s00_axi_arsize}),
+ .ddr3_axi_arburst ({s01_axi_arburst, s00_axi_arburst}),
+ .ddr3_axi_arlock ({s01_axi_arlock, s00_axi_arlock}),
+ .ddr3_axi_arcache ({s01_axi_arcache, s00_axi_arcache}),
+ .ddr3_axi_arprot ({s01_axi_arprot, s00_axi_arprot}),
+ .ddr3_axi_arqos ({s01_axi_arqos, s00_axi_arqos}),
+ .ddr3_axi_arvalid ({s01_axi_arvalid, s00_axi_arvalid}),
+ .ddr3_axi_arready ({s01_axi_arready, s00_axi_arready}),
+ // Slave Interface Read Data Ports
+ .ddr3_axi_rid ({s01_axi_rid, s00_axi_rid}),
+ .ddr3_axi_rdata ({s01_axi_rdata, s00_axi_rdata}),
+ .ddr3_axi_rresp ({s01_axi_rresp, s00_axi_rresp}),
+ .ddr3_axi_rlast ({s01_axi_rlast, s00_axi_rlast}),
+ .ddr3_axi_rvalid ({s01_axi_rvalid, s00_axi_rvalid}),
+ .ddr3_axi_rready ({s01_axi_rready, s00_axi_rready}),
+ // Debug
+ .debug0(debug0), .debug1(debug1), .debug2(debug2)
+ );
+
+ axi_intercon_2x64_128_bd_wrapper axi_intercon_2x64_128_bd_i (
+ .S00_AXI_ACLK(ddr3_axi_clk_x2), // input S00_AXI_ACLK
+ .S00_AXI_ARESETN(~ddr3_axi_rst), // input S00_AXI_ARESETN
+ .S00_AXI_AWID(s00_axi_awid), // input [0 : 0] S00_AXI_AWID
+ .S00_AXI_AWADDR(s00_axi_awaddr), // input [31 : 0] S00_AXI_AWADDR
+ .S00_AXI_AWLEN(s00_axi_awlen), // input [7 : 0] S00_AXI_AWLEN
+ .S00_AXI_AWSIZE(s00_axi_awsize), // input [2 : 0] S00_AXI_AWSIZE
+ .S00_AXI_AWBURST(s00_axi_awburst), // input [1 : 0] S00_AXI_AWBURST
+ .S00_AXI_AWLOCK(s00_axi_awlock), // input S00_AXI_AWLOCK
+ .S00_AXI_AWCACHE(s00_axi_awcache), // input [3 : 0] S00_AXI_AWCACHE
+ .S00_AXI_AWPROT(s00_axi_awprot), // input [2 : 0] S00_AXI_AWPROT
+ .S00_AXI_AWQOS(s00_axi_awqos), // input [3 : 0] S00_AXI_AWQOS
+ .S00_AXI_AWVALID(s00_axi_awvalid), // input S00_AXI_AWVALID
+ .S00_AXI_AWREADY(s00_axi_awready), // output S00_AXI_AWREADY
+ .S00_AXI_WDATA(s00_axi_wdata), // input [63 : 0] S00_AXI_WDATA
+ .S00_AXI_WSTRB(s00_axi_wstrb), // input [7 : 0] S00_AXI_WSTRB
+ .S00_AXI_WLAST(s00_axi_wlast), // input S00_AXI_WLAST
+ .S00_AXI_WVALID(s00_axi_wvalid), // input S00_AXI_WVALID
+ .S00_AXI_WREADY(s00_axi_wready), // output S00_AXI_WREADY
+ .S00_AXI_BID(s00_axi_bid), // output [0 : 0] S00_AXI_BID
+ .S00_AXI_BRESP(s00_axi_bresp), // output [1 : 0] S00_AXI_BRESP
+ .S00_AXI_BVALID(s00_axi_bvalid), // output S00_AXI_BVALID
+ .S00_AXI_BREADY(s00_axi_bready), // input S00_AXI_BREADY
+ .S00_AXI_ARID(s00_axi_arid), // input [0 : 0] S00_AXI_ARID
+ .S00_AXI_ARADDR(s00_axi_araddr), // input [31 : 0] S00_AXI_ARADDR
+ .S00_AXI_ARLEN(s00_axi_arlen), // input [7 : 0] S00_AXI_ARLEN
+ .S00_AXI_ARSIZE(s00_axi_arsize), // input [2 : 0] S00_AXI_ARSIZE
+ .S00_AXI_ARBURST(s00_axi_arburst), // input [1 : 0] S00_AXI_ARBURST
+ .S00_AXI_ARLOCK(s00_axi_arlock), // input S00_AXI_ARLOCK
+ .S00_AXI_ARCACHE(s00_axi_arcache), // input [3 : 0] S00_AXI_ARCACHE
+ .S00_AXI_ARPROT(s00_axi_arprot), // input [2 : 0] S00_AXI_ARPROT
+ .S00_AXI_ARQOS(s00_axi_arqos), // input [3 : 0] S00_AXI_ARQOS
+ .S00_AXI_ARVALID(s00_axi_arvalid), // input S00_AXI_ARVALID
+ .S00_AXI_ARREADY(s00_axi_arready), // output S00_AXI_ARREADY
+ .S00_AXI_RID(s00_axi_rid), // output [0 : 0] S00_AXI_RID
+ .S00_AXI_RDATA(s00_axi_rdata), // output [63 : 0] S00_AXI_RDATA
+ .S00_AXI_RRESP(s00_axi_rresp), // output [1 : 0] S00_AXI_RRESP
+ .S00_AXI_RLAST(s00_axi_rlast), // output S00_AXI_RLAST
+ .S00_AXI_RVALID(s00_axi_rvalid), // output S00_AXI_RVALID
+ .S00_AXI_RREADY(s00_axi_rready), // input S00_AXI_RREADY
+ //
+ .S01_AXI_ACLK(ddr3_axi_clk_x2), // input S01_AXI_ACLK
+ .S01_AXI_ARESETN(~ddr3_axi_rst), // input S00_AXI_ARESETN
+ .S01_AXI_AWID(s01_axi_awid), // input [0 : 0] S01_AXI_AWID
+ .S01_AXI_AWADDR(s01_axi_awaddr), // input [31 : 0] S01_AXI_AWADDR
+ .S01_AXI_AWLEN(s01_axi_awlen), // input [7 : 0] S01_AXI_AWLEN
+ .S01_AXI_AWSIZE(s01_axi_awsize), // input [2 : 0] S01_AXI_AWSIZE
+ .S01_AXI_AWBURST(s01_axi_awburst), // input [1 : 0] S01_AXI_AWBURST
+ .S01_AXI_AWLOCK(s01_axi_awlock), // input S01_AXI_AWLOCK
+ .S01_AXI_AWCACHE(s01_axi_awcache), // input [3 : 0] S01_AXI_AWCACHE
+ .S01_AXI_AWPROT(s01_axi_awprot), // input [2 : 0] S01_AXI_AWPROT
+ .S01_AXI_AWQOS(s01_axi_awqos), // input [3 : 0] S01_AXI_AWQOS
+ .S01_AXI_AWVALID(s01_axi_awvalid), // input S01_AXI_AWVALID
+ .S01_AXI_AWREADY(s01_axi_awready), // output S01_AXI_AWREADY
+ .S01_AXI_WDATA(s01_axi_wdata), // input [63 : 0] S01_AXI_WDATA
+ .S01_AXI_WSTRB(s01_axi_wstrb), // input [7 : 0] S01_AXI_WSTRB
+ .S01_AXI_WLAST(s01_axi_wlast), // input S01_AXI_WLAST
+ .S01_AXI_WVALID(s01_axi_wvalid), // input S01_AXI_WVALID
+ .S01_AXI_WREADY(s01_axi_wready), // output S01_AXI_WREADY
+ .S01_AXI_BID(s01_axi_bid), // output [0 : 0] S01_AXI_BID
+ .S01_AXI_BRESP(s01_axi_bresp), // output [1 : 0] S01_AXI_BRESP
+ .S01_AXI_BVALID(s01_axi_bvalid), // output S01_AXI_BVALID
+ .S01_AXI_BREADY(s01_axi_bready), // input S01_AXI_BREADY
+ .S01_AXI_ARID(s01_axi_arid), // input [0 : 0] S01_AXI_ARID
+ .S01_AXI_ARADDR(s01_axi_araddr), // input [31 : 0] S01_AXI_ARADDR
+ .S01_AXI_ARLEN(s01_axi_arlen), // input [7 : 0] S01_AXI_ARLEN
+ .S01_AXI_ARSIZE(s01_axi_arsize), // input [2 : 0] S01_AXI_ARSIZE
+ .S01_AXI_ARBURST(s01_axi_arburst), // input [1 : 0] S01_AXI_ARBURST
+ .S01_AXI_ARLOCK(s01_axi_arlock), // input S01_AXI_ARLOCK
+ .S01_AXI_ARCACHE(s01_axi_arcache), // input [3 : 0] S01_AXI_ARCACHE
+ .S01_AXI_ARPROT(s01_axi_arprot), // input [2 : 0] S01_AXI_ARPROT
+ .S01_AXI_ARQOS(s01_axi_arqos), // input [3 : 0] S01_AXI_ARQOS
+ .S01_AXI_ARVALID(s01_axi_arvalid), // input S01_AXI_ARVALID
+ .S01_AXI_ARREADY(s01_axi_arready), // output S01_AXI_ARREADY
+ .S01_AXI_RID(s01_axi_rid), // output [0 : 0] S01_AXI_RID
+ .S01_AXI_RDATA(s01_axi_rdata), // output [63 : 0] S01_AXI_RDATA
+ .S01_AXI_RRESP(s01_axi_rresp), // output [1 : 0] S01_AXI_RRESP
+ .S01_AXI_RLAST(s01_axi_rlast), // output S01_AXI_RLAST
+ .S01_AXI_RVALID(s01_axi_rvalid), // output S01_AXI_RVALID
+ .S01_AXI_RREADY(s01_axi_rready), // input S01_AXI_RREADY
+ //
+ .M00_AXI_ACLK(ddr3_axi_clk), // input M00_AXI_ACLK
+ .M00_AXI_ARESETN(~ddr3_axi_rst), // input S00_AXI_ARESETN
+ .M00_AXI_AWID(ddr3_axi_awid), // output [3 : 0] M00_AXI_AWID
+ .M00_AXI_AWADDR(ddr3_axi_awaddr), // output [31 : 0] M00_AXI_AWADDR
+ .M00_AXI_AWLEN(ddr3_axi_awlen), // output [7 : 0] M00_AXI_AWLEN
+ .M00_AXI_AWSIZE(ddr3_axi_awsize), // output [2 : 0] M00_AXI_AWSIZE
+ .M00_AXI_AWBURST(ddr3_axi_awburst), // output [1 : 0] M00_AXI_AWBURST
+ .M00_AXI_AWLOCK(ddr3_axi_awlock), // output M00_AXI_AWLOCK
+ .M00_AXI_AWCACHE(ddr3_axi_awcache), // output [3 : 0] M00_AXI_AWCACHE
+ .M00_AXI_AWPROT(ddr3_axi_awprot), // output [2 : 0] M00_AXI_AWPROT
+ .M00_AXI_AWQOS(ddr3_axi_awqos), // output [3 : 0] M00_AXI_AWQOS
+ .M00_AXI_AWVALID(ddr3_axi_awvalid), // output M00_AXI_AWVALID
+ .M00_AXI_AWREADY(ddr3_axi_awready), // input M00_AXI_AWREADY
+ .M00_AXI_WDATA(ddr3_axi_wdata), // output [255 : 0] M00_AXI_WDATA
+ .M00_AXI_WSTRB(ddr3_axi_wstrb), // output [15 : 0] M00_AXI_WSTRB
+ .M00_AXI_WLAST(ddr3_axi_wlast), // output M00_AXI_WLAST
+ .M00_AXI_WVALID(ddr3_axi_wvalid), // output M00_AXI_WVALID
+ .M00_AXI_WREADY(ddr3_axi_wready), // input M00_AXI_WREADY
+ .M00_AXI_BID(ddr3_axi_bid), // input [3 : 0] M00_AXI_BID
+ .M00_AXI_BRESP(ddr3_axi_bresp), // input [1 : 0] M00_AXI_BRESP
+ .M00_AXI_BVALID(ddr3_axi_bvalid), // input M00_AXI_BVALID
+ .M00_AXI_BREADY(ddr3_axi_bready), // output M00_AXI_BREADY
+ .M00_AXI_ARID(ddr3_axi_arid), // output [3 : 0] M00_AXI_ARID
+ .M00_AXI_ARADDR(ddr3_axi_araddr), // output [31 : 0] M00_AXI_ARADDR
+ .M00_AXI_ARLEN(ddr3_axi_arlen), // output [7 : 0] M00_AXI_ARLEN
+ .M00_AXI_ARSIZE(ddr3_axi_arsize), // output [2 : 0] M00_AXI_ARSIZE
+ .M00_AXI_ARBURST(ddr3_axi_arburst), // output [1 : 0] M00_AXI_ARBURST
+ .M00_AXI_ARLOCK(ddr3_axi_arlock), // output M00_AXI_ARLOCK
+ .M00_AXI_ARCACHE(ddr3_axi_arcache), // output [3 : 0] M00_AXI_ARCACHE
+ .M00_AXI_ARPROT(ddr3_axi_arprot), // output [2 : 0] M00_AXI_ARPROT
+ .M00_AXI_ARQOS(ddr3_axi_arqos), // output [3 : 0] M00_AXI_ARQOS
+ .M00_AXI_ARVALID(ddr3_axi_arvalid), // output M00_AXI_ARVALID
+ .M00_AXI_ARREADY(ddr3_axi_arready), // input M00_AXI_ARREADY
+ .M00_AXI_RID(ddr3_axi_rid), // input [3 : 0] M00_AXI_RID
+ .M00_AXI_RDATA(ddr3_axi_rdata), // input [255 : 0] M00_AXI_RDATA
+ .M00_AXI_RRESP(ddr3_axi_rresp), // input [1 : 0] M00_AXI_RRESP
+ .M00_AXI_RLAST(ddr3_axi_rlast), // input M00_AXI_RLAST
+ .M00_AXI_RVALID(ddr3_axi_rvalid), // input M00_AXI_RVALID
+ .M00_AXI_RREADY(ddr3_axi_rready) // output M00_AXI_RREADY
+ );
+
+
+
+ /////////////////////////////////////////////////////////////////////////////////////////////
+ //
+ // Radios
+ //
+ /////////////////////////////////////////////////////////////////////////////////////////////
+
+ // Daughter board I/O
+ wire [31:0] leds[0:NUM_DBOARDS-1];
+ wire [31:0] fp_gpio_r_in[0:NUM_DBOARDS-1], fp_gpio_r_out[0:NUM_DBOARDS-1], fp_gpio_r_ddr[0:NUM_DBOARDS-1];
+ wire [31:0] db_gpio_in[0:NUM_DBOARDS-1], db_gpio_out[0:NUM_DBOARDS-1], db_gpio_ddr[0:NUM_DBOARDS-1];
+ wire [31:0] misc_outs[0:NUM_DBOARDS-1];
+ reg [31:0] misc_ins[0:NUM_DBOARDS-1];
+ wire [7:0] sen[0:NUM_DBOARDS-1];
+ wire sclk[0:NUM_DBOARDS-1], mosi[0:NUM_DBOARDS-1], miso[0:NUM_DBOARDS-1];
+ wire rx_running[0:NUM_CHANNELS-1], tx_running[0:NUM_CHANNELS-1];
+ wire [63:0] rx_data_in_r[0:NUM_DBOARDS-1], rx_data_r[0:NUM_DBOARDS-1];
+ wire [63:0] tx_data_r[0:NUM_DBOARDS-1], tx_data_out_r[0:NUM_DBOARDS-1];
+ wire [1:0] rx_stb_r[0:NUM_DBOARDS-1], tx_stb_r[0:NUM_DBOARDS-1];
+
+
+ // Data
+ wire [31:0] rx_data_in[0:NUM_CHANNELS-1], rx_data[0:NUM_CHANNELS-1];
+ wire [31:0] tx_data[0:NUM_CHANNELS-1], tx_data_out[0:NUM_CHANNELS-1];
+ wire rx_stb[0:NUM_CHANNELS-1], tx_stb[0:NUM_CHANNELS-1];
+ wire db_fe_set_stb[0:NUM_DBOARDS-1];
+ wire [7:0] db_fe_set_addr[0:NUM_DBOARDS-1];
+ wire [31:0] db_fe_set_data[0:NUM_DBOARDS-1];
+ wire db_fe_rb_stb[0:NUM_DBOARDS-1];
+ wire [7:0] db_fe_rb_addr[0:NUM_DBOARDS-1];
+ wire [63:0] db_fe_rb_data[0:NUM_DBOARDS-1];
+
+
+ //------------------------------------
+ // Daughterboard Control
+ // -----------------------------------
+
+ localparam [7:0] SR_DB_BASE = 8'd160;
+ localparam [7:0] RB_DB_BASE = 8'd16;
+
+ genvar i;
+ generate for (i = 0; i < NUM_DBOARDS; i = i + 1)
+ begin
+ db_control #(
+ .USE_SPI_CLK(0),
+ .SR_BASE(SR_DB_BASE),
+ .RB_BASE(RB_DB_BASE)
+ ) db_control_i (
+ .clk(radio_clk), .reset(radio_rst),
+ .set_stb(db_fe_set_stb[i]), .set_addr(db_fe_set_addr[i]), .set_data(db_fe_set_data[i]),
+ .rb_stb(db_fe_rb_stb[i]), .rb_addr(db_fe_rb_addr[i]), .rb_data(db_fe_rb_data[i]),
+ .run_rx(rx_running[i*2]), .run_tx(tx_running[i*2]),
+ .misc_ins(misc_ins[i]), .misc_outs(misc_outs[i]),
+ .fp_gpio_in(fp_gpio_r_in[i]), .fp_gpio_out(fp_gpio_r_out[i]), .fp_gpio_ddr(fp_gpio_r_ddr[i]), .fp_gpio_fab(),
+ .db_gpio_in(db_gpio_in[i]), .db_gpio_out(db_gpio_out[i]), .db_gpio_ddr(db_gpio_ddr[i]), .db_gpio_fab(),
+ .leds(leds[i]),
+ .spi_clk(radio_clk), .spi_rst(radio_rst), .sen(sen[i]), .sclk(sclk[i]), .mosi(mosi[i]), .miso(miso[i])
+ );
+ end
+ endgenerate
+
+ //------------------------------------
+ // Front End Control
+ // -----------------------------------
+
+ localparam [7:0] SR_FE_CHAN_OFFSET = 8'd16;
+ localparam [7:0] SR_TX_FE_BASE = SR_DB_BASE + 8'd48;
+ localparam [7:0] SR_RX_FE_BASE = SR_DB_BASE + 8'd64;
+
+ generate for (i = 0; i < NUM_DBOARDS; i = i + 1)
+ begin
+ fe_control #(
+ .NUM_CHANNELS(NUM_CHANNELS_PER_DBOARD),
+ .SR_FE_CHAN_OFFSET(SR_FE_CHAN_OFFSET),
+ .SR_TX_FE_BASE(SR_TX_FE_BASE),
+ .SR_RX_FE_BASE(SR_RX_FE_BASE)
+ ) x300_fe_core_i (
+ .clk(radio_clk), .reset(radio_rst),
+ .set_stb(db_fe_set_stb[i]), .set_addr(db_fe_set_addr[i]), .set_data(db_fe_set_data[i]),
+ .time_sync(),
+ .tx_stb(tx_stb_r[i]), .tx_data_in(tx_data_r[i]), .tx_data_out(tx_data_out_r[i]),
+ .rx_stb(rx_stb_r[i]), .rx_data_in(rx_data_in_r[i]), .rx_data_out(rx_data_r[i])
+ );
+ end
+ endgenerate
+
+ //------------------------------------
+ // Radio to ADC,DAC and IO Mapping
+ //------------------------------------
+
+ // Data
+ assign tx_data_r[0][31:0] = tx_data[0];
+ assign tx_data_r[0][63:32] = tx_data[1];
+ assign tx_data_r[1][31:0] = tx_data[2];
+ assign tx_data_r[1][63:32] = tx_data[3];
+
+ assign tx_data_out[0] = tx_data_out_r[0][31:0] ;
+ assign tx_data_out[1] = tx_data_out_r[0][63:32];
+ assign tx_data_out[2] = tx_data_out_r[1][31:0] ;
+ assign tx_data_out[3] = tx_data_out_r[1][63:32];
+
+ assign tx_stb_r[0][0] = tx_stb[0];
+ assign tx_stb_r[0][1] = tx_stb[1];
+ assign tx_stb_r[1][0] = tx_stb[2];
+ assign tx_stb_r[1][1] = tx_stb[3];
+
+ assign rx_data_in_r[0][31:0] = rx_data_in[0];
+ assign rx_data_in_r[0][63:32] = rx_data_in[1];
+ assign rx_data_in_r[1][31:0] = rx_data_in[2];
+ assign rx_data_in_r[1][63:32] = rx_data_in[3];
+
+ assign rx_data[0] = rx_data_r[0][31:0] ;
+ assign rx_data[1] = rx_data_r[0][63:32];
+ assign rx_data[2] = rx_data_r[1][31:0] ;
+ assign rx_data[3] = rx_data_r[1][63:32];
+
+ assign rx_stb[0] = rx_stb_r[0][0];
+ assign rx_stb[1] = rx_stb_r[0][1];
+ assign rx_stb[2] = rx_stb_r[1][0];
+ assign rx_stb[3] = rx_stb_r[1][1];
+
+ assign {rx_data_in[1], rx_data_in[0]} = {rx0, rx0};
+ assign {rx_data_in[3], rx_data_in[2]} = {rx1, rx1};
+
+ assign tx0 = tx_data_out[0]; //tx_data_out[1] unused
+ assign tx1 = tx_data_out[2]; //tx_data_out[3] unused
+ assign tx_stb[0] = 1'b1;
+ assign tx_stb[1] = 1'b0;
+ assign tx_stb[2] = 1'b1;
+ assign tx_stb[3] = 1'b0;
+
+ //Daughter board GPIO
+ assign {db_gpio_in[1], db_gpio_in[0]} = {db1_gpio_in, db0_gpio_in};
+ assign db0_gpio_out = db_gpio_out[0];
+ assign db1_gpio_out = db_gpio_out[1];
+ assign db0_gpio_ddr = db_gpio_ddr[0];
+ assign db1_gpio_ddr = db_gpio_ddr[1];
+
+ //Front-panel board GPIO
+ assign {fp_gpio_r_in[1], fp_gpio_r_in[0]} = {32'b0, fp_gpio_in};
+ assign fp_gpio_out = fp_gpio_r_out[0]; //fp_gpio_r_out[1] unused
+ assign fp_gpio_ddr = fp_gpio_r_ddr[0]; //fp_gpio_ddr[1] unused
+
+ //SPI
+ assign {sen0, sclk0, mosi0} = {sen[0], sclk[0], mosi[0]};
+ assign miso[0] = miso0;
+ assign {sen1, sclk1, mosi1} = {sen[1], sclk[1], mosi[1]};
+ assign miso[1] = miso1;
+
+ //LEDs
+ // Reminder: radio_ledX = {RX, TXRX_TX, TXRX_RX}
+ assign radio_led0 = leds[0][2:0];
+ assign radio_led1 = leds[1][2:0];
+
+ //Misc ins and outs
+ always @(posedge radio_clk) begin
+ radio0_misc_out <= misc_outs[0];
+ radio1_misc_out <= misc_outs[1];
+ misc_ins[0] <= radio0_misc_in;
+ misc_ins[1] <= radio1_misc_in;
+ end
+
+endmodule // x300_core