diff options
Diffstat (limited to 'fpga/usrp3/top/x400/cpld_interface.v')
-rw-r--r-- | fpga/usrp3/top/x400/cpld_interface.v | 638 |
1 files changed, 638 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x400/cpld_interface.v b/fpga/usrp3/top/x400/cpld_interface.v new file mode 100644 index 000000000..a98fe7962 --- /dev/null +++ b/fpga/usrp3/top/x400/cpld_interface.v @@ -0,0 +1,638 @@ +// +// Copyright 2021 Ettus Research, A National Instruments Brand +// +// SPDX-License-Identifier: LGPL-3.0-or-later +// +// Module: cpld_interface.v +// +// Description: +// +// This module comprises the logic on the FPGA to connect with the +// motherboard CPLD. +// +// As a first step each request source is transferred to PRC domain. +// Timestamps are removed in the timer modules. All requests are bundled in +// one combiner and then split / decoded across all targets. By inserting of +// ctrlport termination modules a ctrlport answer will be available for all +// addresses to avoid blocking the main ctrlport combiner. +// + +`default_nettype none + + +module cpld_interface ( + // Clocks + input wire s_axi_aclk, + input wire s_axi_aresetn, + input wire pll_ref_clk, + input wire radio_clk, + + // Reset (domain: pll_ref_clk) + input wire ctrlport_rst, + + // Timestamp (domain: radio_clk) + input wire [63:0] radio_time, + input wire radio_time_stb, + input wire [ 3:0] time_ignore_bits, + + // AXI4-Lite: Write address port (domain: s_axi_aclk) + input wire [16:0] s_axi_awaddr, + input wire s_axi_awvalid, + output wire s_axi_awready, + // AXI4-Lite: Write data port (domain: s_axi_aclk) + input wire [31:0] s_axi_wdata, + input wire [ 3:0] s_axi_wstrb, + input wire s_axi_wvalid, + output wire s_axi_wready, + // AXI4-Lite: Write response port (domain: s_axi_aclk) + output wire[ 1:0] s_axi_bresp, + output wire s_axi_bvalid, + input wire s_axi_bready, + // AXI4-Lite: Read address port (domain: s_axi_aclk) + input wire [16:0] s_axi_araddr, + input wire s_axi_arvalid, + output wire s_axi_arready, + // AXI4-Lite: Read data port (domain: s_axi_aclk) + output wire [31:0] s_axi_rdata, + output wire [ 1:0] s_axi_rresp, + output wire s_axi_rvalid, + input wire s_axi_rready, + + // Control port from / to application (domain: radio_clk) + input wire s_ctrlport_req_wr, + input wire s_ctrlport_req_rd, + input wire [19:0] s_ctrlport_req_addr, + input wire [31:0] s_ctrlport_req_data, + input wire [ 3:0] s_ctrlport_req_byte_en, + input wire s_ctrlport_req_has_time, + input wire [63:0] s_ctrlport_req_time, + output wire s_ctrlport_resp_ack, + output wire [ 1:0] s_ctrlport_resp_status, + output wire [31:0] s_ctrlport_resp_data, + + // SPI Bus to connect to MB CPLD + output wire [ 1:0] ss, + output wire sclk, + output wire mosi, + input wire miso, + + // QSFP port LED (domain: any) + input wire [ 3:0] qsfp0_led_active, + input wire [ 3:0] qsfp0_led_link, + input wire [ 3:0] qsfp1_led_active, + input wire [ 3:0] qsfp1_led_link, + + // iPass present signals + input wire [ 1:0] ipass_present_n, + + // Version (Constant) + output wire [95:0] version_info +); + + `include "../../lib/rfnoc/core/ctrlport.vh" + `include "regmap/pl_cpld_regmap_utils.vh" + `include "cpld/regmap/mb_cpld_pl_regmap_utils.vh" + `include "cpld/regmap/pl_cpld_base_regmap_utils.vh" + + //--------------------------------------------------------------------------- + // Internal clocks and resets + //--------------------------------------------------------------------------- + + wire s_axi_areset; + wire ctrlport_clk; + assign s_axi_areset = ~s_axi_aresetn; + assign ctrlport_clk = pll_ref_clk; + + //--------------------------------------------------------------------------- + // Timestamp synchronization + //--------------------------------------------------------------------------- + + reg [ 3:0] radio_time_stb_shift_reg; + wire radio_time_stb_prc; + reg [63:0] radio_time_prc; + + // radio_clk and pll_ref_clk are synchronous clocks with an integer + // multiplier <= 4. + // + // A simple register can be used to capture the latest timestamp the strobe + // pulse is preserved for up to 4 clock cycles and used in pll_ref_clk domain + // to driver timers. + always @(posedge radio_clk) begin + radio_time_stb_shift_reg <= {radio_time_stb_shift_reg[2:0], radio_time_stb}; + if (radio_time_stb) begin + radio_time_prc <= radio_time; + end + end + assign radio_time_stb_prc = | radio_time_stb_shift_reg; + + //--------------------------------------------------------------------------- + // MPM Endpoint connection + //--------------------------------------------------------------------------- + // Translate AXI lite to control port. + // Timeout based on the 40 MHz AXI clock is about 0.839 seconds. + + wire [19:0] mpm_endpoint_ctrlport_axi_clk_req_addr; + wire [ 3:0] mpm_endpoint_ctrlport_axi_clk_req_byte_en; + wire [31:0] mpm_endpoint_ctrlport_axi_clk_req_data; + wire mpm_endpoint_ctrlport_axi_clk_req_has_time; + wire [ 9:0] mpm_endpoint_ctrlport_axi_clk_req_portid; + wire mpm_endpoint_ctrlport_axi_clk_req_rd; + wire [15:0] mpm_endpoint_ctrlport_axi_clk_req_rem_epid; + wire [ 9:0] mpm_endpoint_ctrlport_axi_clk_req_rem_portid; + wire [63:0] mpm_endpoint_ctrlport_axi_clk_req_time; + wire mpm_endpoint_ctrlport_axi_clk_req_wr; + wire mpm_endpoint_ctrlport_axi_clk_resp_ack; + wire [31:0] mpm_endpoint_ctrlport_axi_clk_resp_data; + wire [ 1:0] mpm_endpoint_ctrlport_axi_clk_resp_status; + + axil_ctrlport_master #( + .TIMEOUT (25), + .AXI_AWIDTH (17), + .CTRLPORT_AWIDTH (17) + ) mpm_endpoint ( + .s_axi_aclk (s_axi_aclk), + .s_axi_aresetn (s_axi_aresetn), + .s_axi_awaddr (s_axi_awaddr), + .s_axi_awvalid (s_axi_awvalid), + .s_axi_awready (s_axi_awready), + .s_axi_wdata (s_axi_wdata), + .s_axi_wstrb (s_axi_wstrb), + .s_axi_wvalid (s_axi_wvalid), + .s_axi_wready (s_axi_wready), + .s_axi_bresp (s_axi_bresp), + .s_axi_bvalid (s_axi_bvalid), + .s_axi_bready (s_axi_bready), + .s_axi_araddr (s_axi_araddr), + .s_axi_arvalid (s_axi_arvalid), + .s_axi_arready (s_axi_arready), + .s_axi_rdata (s_axi_rdata), + .s_axi_rresp (s_axi_rresp), + .s_axi_rvalid (s_axi_rvalid), + .s_axi_rready (s_axi_rready), + .m_ctrlport_req_wr (mpm_endpoint_ctrlport_axi_clk_req_wr), + .m_ctrlport_req_rd (mpm_endpoint_ctrlport_axi_clk_req_rd), + .m_ctrlport_req_addr (mpm_endpoint_ctrlport_axi_clk_req_addr), + .m_ctrlport_req_portid (mpm_endpoint_ctrlport_axi_clk_req_portid), + .m_ctrlport_req_rem_epid (mpm_endpoint_ctrlport_axi_clk_req_rem_epid), + .m_ctrlport_req_rem_portid (mpm_endpoint_ctrlport_axi_clk_req_rem_portid), + .m_ctrlport_req_data (mpm_endpoint_ctrlport_axi_clk_req_data), + .m_ctrlport_req_byte_en (mpm_endpoint_ctrlport_axi_clk_req_byte_en), + .m_ctrlport_req_has_time (mpm_endpoint_ctrlport_axi_clk_req_has_time), + .m_ctrlport_req_time (mpm_endpoint_ctrlport_axi_clk_req_time), + .m_ctrlport_resp_ack (mpm_endpoint_ctrlport_axi_clk_resp_ack), + .m_ctrlport_resp_status (mpm_endpoint_ctrlport_axi_clk_resp_status), + .m_ctrlport_resp_data (mpm_endpoint_ctrlport_axi_clk_resp_data) + ); + + // Transfer AXI clock based MPM endpoint control port request to pll_ref_clk + // domain. + wire [19:0] mpm_endpoint_ctrlport_pll_clk_req_addr; + wire [ 3:0] mpm_endpoint_ctrlport_pll_clk_req_byte_en; + wire [31:0] mpm_endpoint_ctrlport_pll_clk_req_data; + wire mpm_endpoint_ctrlport_pll_clk_req_has_time; + wire mpm_endpoint_ctrlport_pll_clk_req_rd; + wire [63:0] mpm_endpoint_ctrlport_pll_clk_req_time; + wire mpm_endpoint_ctrlport_pll_clk_req_wr; + wire mpm_endpoint_ctrlport_pll_clk_resp_ack; + wire [31:0] mpm_endpoint_ctrlport_pll_clk_resp_data; + wire [ 1:0] mpm_endpoint_ctrlport_pll_clk_resp_status; + + ctrlport_clk_cross ctrlport_clk_cross_mpm ( + .rst (s_axi_areset), + .s_ctrlport_clk (s_axi_aclk), + .s_ctrlport_req_wr (mpm_endpoint_ctrlport_axi_clk_req_wr), + .s_ctrlport_req_rd (mpm_endpoint_ctrlport_axi_clk_req_rd), + .s_ctrlport_req_addr (mpm_endpoint_ctrlport_axi_clk_req_addr), + .s_ctrlport_req_portid (mpm_endpoint_ctrlport_axi_clk_req_portid), + .s_ctrlport_req_rem_epid (mpm_endpoint_ctrlport_axi_clk_req_rem_epid), + .s_ctrlport_req_rem_portid (mpm_endpoint_ctrlport_axi_clk_req_rem_portid), + .s_ctrlport_req_data (mpm_endpoint_ctrlport_axi_clk_req_data), + .s_ctrlport_req_byte_en (mpm_endpoint_ctrlport_axi_clk_req_byte_en), + .s_ctrlport_req_has_time (mpm_endpoint_ctrlport_axi_clk_req_has_time), + .s_ctrlport_req_time (mpm_endpoint_ctrlport_axi_clk_req_time), + .s_ctrlport_resp_ack (mpm_endpoint_ctrlport_axi_clk_resp_ack), + .s_ctrlport_resp_status (mpm_endpoint_ctrlport_axi_clk_resp_status), + .s_ctrlport_resp_data (mpm_endpoint_ctrlport_axi_clk_resp_data), + .m_ctrlport_clk (ctrlport_clk), + .m_ctrlport_req_wr (mpm_endpoint_ctrlport_pll_clk_req_wr), + .m_ctrlport_req_rd (mpm_endpoint_ctrlport_pll_clk_req_rd), + .m_ctrlport_req_addr (mpm_endpoint_ctrlport_pll_clk_req_addr), + .m_ctrlport_req_portid (), + .m_ctrlport_req_rem_epid (), + .m_ctrlport_req_rem_portid (), + .m_ctrlport_req_data (mpm_endpoint_ctrlport_pll_clk_req_data), + .m_ctrlport_req_byte_en (mpm_endpoint_ctrlport_pll_clk_req_byte_en), + .m_ctrlport_req_has_time (mpm_endpoint_ctrlport_pll_clk_req_has_time), + .m_ctrlport_req_time (mpm_endpoint_ctrlport_pll_clk_req_time), + .m_ctrlport_resp_ack (mpm_endpoint_ctrlport_pll_clk_resp_ack), + .m_ctrlport_resp_status (mpm_endpoint_ctrlport_pll_clk_resp_status), + .m_ctrlport_resp_data (mpm_endpoint_ctrlport_pll_clk_resp_data) + ); + + // Apply time of ControlPort request to MPM endpoint request. + wire [19:0] mpm_endpoint_ctrlport_req_addr; + wire [ 3:0] mpm_endpoint_ctrlport_req_byte_en; + wire [31:0] mpm_endpoint_ctrlport_req_data; + wire mpm_endpoint_ctrlport_req_rd; + wire mpm_endpoint_ctrlport_req_wr; + wire mpm_endpoint_ctrlport_resp_ack; + wire [31:0] mpm_endpoint_ctrlport_resp_data; + wire [ 1:0] mpm_endpoint_ctrlport_resp_status; + + ctrlport_timer #( + .EXEC_LATE_CMDS (1) + ) ctrlport_timer_mpm ( + .clk (ctrlport_clk), + .rst (ctrlport_rst), + .time_now (radio_time_prc), + .time_now_stb (radio_time_stb_prc), + .time_ignore_bits (time_ignore_bits), + .s_ctrlport_req_wr (mpm_endpoint_ctrlport_pll_clk_req_wr), + .s_ctrlport_req_rd (mpm_endpoint_ctrlport_pll_clk_req_rd), + .s_ctrlport_req_addr (mpm_endpoint_ctrlport_pll_clk_req_addr), + .s_ctrlport_req_data (mpm_endpoint_ctrlport_pll_clk_req_data), + .s_ctrlport_req_byte_en (mpm_endpoint_ctrlport_pll_clk_req_byte_en), + .s_ctrlport_req_has_time (mpm_endpoint_ctrlport_pll_clk_req_has_time), + .s_ctrlport_req_time (mpm_endpoint_ctrlport_pll_clk_req_time), + .s_ctrlport_resp_ack (mpm_endpoint_ctrlport_pll_clk_resp_ack), + .s_ctrlport_resp_status (mpm_endpoint_ctrlport_pll_clk_resp_status), + .s_ctrlport_resp_data (mpm_endpoint_ctrlport_pll_clk_resp_data), + .m_ctrlport_req_wr (mpm_endpoint_ctrlport_req_wr), + .m_ctrlport_req_rd (mpm_endpoint_ctrlport_req_rd), + .m_ctrlport_req_addr (mpm_endpoint_ctrlport_req_addr), + .m_ctrlport_req_data (mpm_endpoint_ctrlport_req_data), + .m_ctrlport_req_byte_en (mpm_endpoint_ctrlport_req_byte_en), + .m_ctrlport_resp_ack (mpm_endpoint_ctrlport_resp_ack), + .m_ctrlport_resp_status (mpm_endpoint_ctrlport_resp_status), + .m_ctrlport_resp_data (mpm_endpoint_ctrlport_resp_data) + ); + + //--------------------------------------------------------------------------- + // User Application Request + //--------------------------------------------------------------------------- + // Transfer request to pll_ref_clk domain. + + wire [19:0] app_ctrlport_pll_clk_req_addr; + wire [ 3:0] app_ctrlport_pll_clk_req_byte_en; + wire [31:0] app_ctrlport_pll_clk_req_data; + wire app_ctrlport_pll_clk_req_has_time; + wire app_ctrlport_pll_clk_req_rd; + wire [63:0] app_ctrlport_pll_clk_req_time; + wire app_ctrlport_pll_clk_req_wr; + wire app_ctrlport_pll_clk_resp_ack; + wire [31:0] app_ctrlport_pll_clk_resp_data; + wire [ 1:0] app_ctrlport_pll_clk_resp_status; + + ctrlport_clk_cross ctrlport_clk_cross_app ( + .rst (ctrlport_rst), + .s_ctrlport_clk (radio_clk), + .s_ctrlport_req_wr (s_ctrlport_req_wr), + .s_ctrlport_req_rd (s_ctrlport_req_rd), + .s_ctrlport_req_addr (s_ctrlport_req_addr), + .s_ctrlport_req_portid (), + .s_ctrlport_req_rem_epid (), + .s_ctrlport_req_rem_portid (), + .s_ctrlport_req_data (s_ctrlport_req_data), + .s_ctrlport_req_byte_en (s_ctrlport_req_byte_en), + .s_ctrlport_req_has_time (s_ctrlport_req_has_time), + .s_ctrlport_req_time (s_ctrlport_req_time), + .s_ctrlport_resp_ack (s_ctrlport_resp_ack), + .s_ctrlport_resp_status (s_ctrlport_resp_status), + .s_ctrlport_resp_data (s_ctrlport_resp_data), + .m_ctrlport_clk (ctrlport_clk), + .m_ctrlport_req_wr (app_ctrlport_pll_clk_req_wr), + .m_ctrlport_req_rd (app_ctrlport_pll_clk_req_rd), + .m_ctrlport_req_addr (app_ctrlport_pll_clk_req_addr), + .m_ctrlport_req_portid (), + .m_ctrlport_req_rem_epid (), + .m_ctrlport_req_rem_portid (), + .m_ctrlport_req_data (app_ctrlport_pll_clk_req_data), + .m_ctrlport_req_byte_en (app_ctrlport_pll_clk_req_byte_en), + .m_ctrlport_req_has_time (app_ctrlport_pll_clk_req_has_time), + .m_ctrlport_req_time (app_ctrlport_pll_clk_req_time), + .m_ctrlport_resp_ack (app_ctrlport_pll_clk_resp_ack), + .m_ctrlport_resp_status (app_ctrlport_pll_clk_resp_status), + .m_ctrlport_resp_data (app_ctrlport_pll_clk_resp_data) + ); + + // Apply timing to application based ControlPort request. + wire [19:0] app_ctrlport_req_addr; + wire [ 3:0] app_ctrlport_req_byte_en; + wire [31:0] app_ctrlport_req_data; + wire app_ctrlport_req_rd; + wire app_ctrlport_req_wr; + wire app_ctrlport_resp_ack; + wire [31:0] app_ctrlport_resp_data; + wire [ 1:0] app_ctrlport_resp_status; + + ctrlport_timer #( + .EXEC_LATE_CMDS (1) + ) ctrlport_timer_app ( + .clk (ctrlport_clk), + .rst (ctrlport_rst), + .time_now (radio_time_prc), + .time_now_stb (radio_time_stb_prc), + .time_ignore_bits (time_ignore_bits), + .s_ctrlport_req_wr (app_ctrlport_pll_clk_req_wr), + .s_ctrlport_req_rd (app_ctrlport_pll_clk_req_rd), + .s_ctrlport_req_addr (app_ctrlport_pll_clk_req_addr), + .s_ctrlport_req_data (app_ctrlport_pll_clk_req_data), + .s_ctrlport_req_byte_en (app_ctrlport_pll_clk_req_byte_en), + .s_ctrlport_req_has_time (app_ctrlport_pll_clk_req_has_time), + .s_ctrlport_req_time (app_ctrlport_pll_clk_req_time), + .s_ctrlport_resp_ack (app_ctrlport_pll_clk_resp_ack), + .s_ctrlport_resp_status (app_ctrlport_pll_clk_resp_status), + .s_ctrlport_resp_data (app_ctrlport_pll_clk_resp_data), + .m_ctrlport_req_wr (app_ctrlport_req_wr), + .m_ctrlport_req_rd (app_ctrlport_req_rd), + .m_ctrlport_req_addr (app_ctrlport_req_addr), + .m_ctrlport_req_data (app_ctrlport_req_data), + .m_ctrlport_req_byte_en (app_ctrlport_req_byte_en), + .m_ctrlport_resp_ack (app_ctrlport_resp_ack), + .m_ctrlport_resp_status (app_ctrlport_resp_status), + .m_ctrlport_resp_data (app_ctrlport_resp_data) + ); + + //--------------------------------------------------------------------------- + // QSFP LED Controller + //--------------------------------------------------------------------------- + + wire [19:0] led_ctrlport_req_addr; + wire [ 3:0] led_ctrlport_req_byte_en; + wire [31:0] led_ctrlport_req_data; + wire led_ctrlport_req_rd; + wire led_ctrlport_req_wr; + wire led_ctrlport_resp_ack; + wire [31:0] led_ctrlport_resp_data; + wire [ 1:0] led_ctrlport_resp_status; + + qsfp_led_controller + # (.LED_REGISTER_ADDRESS(MB_CPLD + PL_REGISTERS + LED_REGISTER)) + qsfp_led_controller_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .m_ctrlport_req_wr (led_ctrlport_req_wr), + .m_ctrlport_req_rd (led_ctrlport_req_rd), + .m_ctrlport_req_addr (led_ctrlport_req_addr), + .m_ctrlport_req_data (led_ctrlport_req_data), + .m_ctrlport_req_byte_en (led_ctrlport_req_byte_en), + .m_ctrlport_resp_ack (led_ctrlport_resp_ack), + .m_ctrlport_resp_status (led_ctrlport_resp_status), + .m_ctrlport_resp_data (led_ctrlport_resp_data), + .qsfp0_led_active (qsfp0_led_active), + .qsfp0_led_link (qsfp0_led_link), + .qsfp1_led_active (qsfp1_led_active), + .qsfp1_led_link (qsfp1_led_link)); + + //--------------------------------------------------------------------------- + // iPass present controller + //--------------------------------------------------------------------------- + + wire [19:0] ipass_ctrlport_req_addr; + wire [ 3:0] ipass_ctrlport_req_byte_en; + wire [31:0] ipass_ctrlport_req_data; + wire ipass_ctrlport_req_rd; + wire ipass_ctrlport_req_wr; + wire ipass_ctrlport_resp_ack; + wire [31:0] ipass_ctrlport_resp_data; + wire [ 1:0] ipass_ctrlport_resp_status; + + wire ipass_enable; + + ipass_present_controller ipass_present_controller_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .m_ctrlport_req_wr (ipass_ctrlport_req_wr), + .m_ctrlport_req_rd (ipass_ctrlport_req_rd), + .m_ctrlport_req_addr (ipass_ctrlport_req_addr), + .m_ctrlport_req_data (ipass_ctrlport_req_data), + .m_ctrlport_req_byte_en (ipass_ctrlport_req_byte_en), + .m_ctrlport_resp_ack (ipass_ctrlport_resp_ack), + .m_ctrlport_resp_status (ipass_ctrlport_resp_status), + .m_ctrlport_resp_data (ipass_ctrlport_resp_data), + .enable (ipass_enable), + .ipass_present_n (ipass_present_n) + ); + + //--------------------------------------------------------------------------- + // Combine all incoming combiner requests and provide to targets + //--------------------------------------------------------------------------- + + wire [19:0] m_ctrlport_req_addr; + wire [31:0] m_ctrlport_req_data; + wire m_ctrlport_req_rd; + wire m_ctrlport_req_wr; + wire m_ctrlport_resp_ack; + wire [31:0] m_ctrlport_resp_data; + wire [ 1:0] m_ctrlport_resp_status; + + ctrlport_combiner #( + .NUM_MASTERS (4), + .PRIORITY (1) + ) ctrlport_combiner_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr ({ipass_ctrlport_req_wr, led_ctrlport_req_wr, mpm_endpoint_ctrlport_req_wr, app_ctrlport_req_wr}), + .s_ctrlport_req_rd ({ipass_ctrlport_req_rd, led_ctrlport_req_rd, mpm_endpoint_ctrlport_req_rd, app_ctrlport_req_rd}), + .s_ctrlport_req_addr ({ipass_ctrlport_req_addr, led_ctrlport_req_addr, mpm_endpoint_ctrlport_req_addr, app_ctrlport_req_addr}), + .s_ctrlport_req_portid (), + .s_ctrlport_req_rem_epid (), + .s_ctrlport_req_rem_portid (), + .s_ctrlport_req_data ({ipass_ctrlport_req_data, led_ctrlport_req_data, mpm_endpoint_ctrlport_req_data, app_ctrlport_req_data}), + .s_ctrlport_req_byte_en ({ipass_ctrlport_req_byte_en, led_ctrlport_req_byte_en, mpm_endpoint_ctrlport_req_byte_en, app_ctrlport_req_byte_en}), + .s_ctrlport_req_has_time (), + .s_ctrlport_req_time (), + .s_ctrlport_resp_ack ({ipass_ctrlport_resp_ack, led_ctrlport_resp_ack, mpm_endpoint_ctrlport_resp_ack, app_ctrlport_resp_ack}), + .s_ctrlport_resp_status ({ipass_ctrlport_resp_status, led_ctrlport_resp_status, mpm_endpoint_ctrlport_resp_status, app_ctrlport_resp_status}), + .s_ctrlport_resp_data ({ipass_ctrlport_resp_data, led_ctrlport_resp_data, mpm_endpoint_ctrlport_resp_data, app_ctrlport_resp_data}), + .m_ctrlport_req_wr (m_ctrlport_req_wr), + .m_ctrlport_req_rd (m_ctrlport_req_rd), + .m_ctrlport_req_addr (m_ctrlport_req_addr), + .m_ctrlport_req_portid (), + .m_ctrlport_req_rem_epid (), + .m_ctrlport_req_rem_portid (), + .m_ctrlport_req_data (m_ctrlport_req_data), + .m_ctrlport_req_byte_en (), + .m_ctrlport_req_has_time (), + .m_ctrlport_req_time (), + .m_ctrlport_resp_ack (m_ctrlport_resp_ack), + .m_ctrlport_resp_status (m_ctrlport_resp_status), + .m_ctrlport_resp_data (m_ctrlport_resp_data) + ); + + + // Split for CPLD facing requests and others. + wire [19:0] base_reg_ctrlport_req_addr; + wire [31:0] base_reg_ctrlport_req_data; + wire base_reg_ctrlport_req_rd; + wire base_reg_ctrlport_req_wr; + wire base_reg_ctrlport_resp_ack; + wire [31:0] base_reg_ctrlport_resp_data; + wire [ 1:0] base_reg_ctrlport_resp_status; + + wire [19:0] spi_master_ctrlport_req_addr; + wire [31:0] spi_master_ctrlport_req_data; + wire spi_master_ctrlport_req_rd; + wire spi_master_ctrlport_req_wr; + wire spi_master_ctrlport_resp_ack; + wire [31:0] spi_master_ctrlport_resp_data; + wire [ 1:0] spi_master_ctrlport_resp_status; + + wire [19:0] unused_fpga_intermediate_ctrlport_req_addr; + wire [31:0] unused_fpga_intermediate_ctrlport_req_data; + wire unused_fpga_intermediate_ctrlport_req_rd; + wire unused_fpga_intermediate_ctrlport_req_wr; + wire unused_fpga_intermediate_ctrlport_resp_ack; + wire [31:0] unused_fpga_intermediate_ctrlport_resp_data; + wire [ 1:0] unused_fpga_intermediate_ctrlport_resp_status; + + wire [19:0] unused_fpga_msbs_ctrlport_req_addr; + wire [31:0] unused_fpga_msbs_ctrlport_req_data; + wire unused_fpga_msbs_ctrlport_req_rd; + wire unused_fpga_msbs_ctrlport_req_wr; + wire unused_fpga_msbs_ctrlport_resp_ack; + wire [31:0] unused_fpga_msbs_ctrlport_resp_data; + wire [ 1:0] unused_fpga_msbs_ctrlport_resp_status; + + ctrlport_splitter #( + .NUM_SLAVES (4) + ) ctrlport_splitter_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr (m_ctrlport_req_wr), + .s_ctrlport_req_rd (m_ctrlport_req_rd), + .s_ctrlport_req_addr (m_ctrlport_req_addr), + .s_ctrlport_req_data (m_ctrlport_req_data), + .s_ctrlport_req_byte_en (), + .s_ctrlport_req_has_time (), + .s_ctrlport_req_time (), + .s_ctrlport_resp_ack (m_ctrlport_resp_ack), + .s_ctrlport_resp_status (m_ctrlport_resp_status), + .s_ctrlport_resp_data (m_ctrlport_resp_data), + .m_ctrlport_req_wr ({unused_fpga_msbs_ctrlport_req_wr, unused_fpga_intermediate_ctrlport_req_wr, base_reg_ctrlport_req_wr, spi_master_ctrlport_req_wr}), + .m_ctrlport_req_rd ({unused_fpga_msbs_ctrlport_req_rd, unused_fpga_intermediate_ctrlport_req_rd, base_reg_ctrlport_req_rd, spi_master_ctrlport_req_rd}), + .m_ctrlport_req_addr ({unused_fpga_msbs_ctrlport_req_addr, unused_fpga_intermediate_ctrlport_req_addr, base_reg_ctrlport_req_addr, spi_master_ctrlport_req_addr}), + .m_ctrlport_req_data ({unused_fpga_msbs_ctrlport_req_data, unused_fpga_intermediate_ctrlport_req_data, base_reg_ctrlport_req_data, spi_master_ctrlport_req_data}), + .m_ctrlport_req_byte_en (), + .m_ctrlport_req_has_time (), + .m_ctrlport_req_time (), + .m_ctrlport_resp_ack ({unused_fpga_msbs_ctrlport_resp_ack, unused_fpga_intermediate_ctrlport_resp_ack, base_reg_ctrlport_resp_ack, spi_master_ctrlport_resp_ack}), + .m_ctrlport_resp_status ({unused_fpga_msbs_ctrlport_resp_status, unused_fpga_intermediate_ctrlport_resp_status, base_reg_ctrlport_resp_status, spi_master_ctrlport_resp_status}), + .m_ctrlport_resp_data ({unused_fpga_msbs_ctrlport_resp_data, unused_fpga_intermediate_ctrlport_resp_data, base_reg_ctrlport_resp_data, spi_master_ctrlport_resp_data}) + ); + + //--------------------------------------------------------------------------- + // Targets for Requests + //--------------------------------------------------------------------------- + + wire [15:0] db_clock_divider; + wire [15:0] mb_clock_divider; + + cpld_interface_regs #( + .BASE_ADDRESS (BASE), + .NUM_ADDRESSES (BASE_SIZE) + ) cpld_interface_regs_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr (base_reg_ctrlport_req_wr), + .s_ctrlport_req_rd (base_reg_ctrlport_req_rd), + .s_ctrlport_req_addr (base_reg_ctrlport_req_addr), + .s_ctrlport_req_data (base_reg_ctrlport_req_data), + .s_ctrlport_resp_ack (base_reg_ctrlport_resp_ack), + .s_ctrlport_resp_status (base_reg_ctrlport_resp_status), + .s_ctrlport_resp_data (base_reg_ctrlport_resp_data), + .mb_clock_divider (mb_clock_divider), + .db_clock_divider (db_clock_divider), + .ipass_enable (ipass_enable), + .version_info (version_info) + ); + + ctrlport_spi_master #( + .CPLD_ADDRESS_WIDTH (15), + .MB_CPLD_BASE_ADDRESS (MB_CPLD), + .DB_0_CPLD_BASE_ADDRESS (DB0_CPLD), + .DB_1_CPLD_BASE_ADDRESS (DB1_CPLD) + ) ctrlport_spi_master_i ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr (spi_master_ctrlport_req_wr), + .s_ctrlport_req_rd (spi_master_ctrlport_req_rd), + .s_ctrlport_req_addr (spi_master_ctrlport_req_addr), + .s_ctrlport_req_data (spi_master_ctrlport_req_data), + .s_ctrlport_resp_ack (spi_master_ctrlport_resp_ack), + .s_ctrlport_resp_status (spi_master_ctrlport_resp_status), + .s_ctrlport_resp_data (spi_master_ctrlport_resp_data), + .ss (ss), + .sclk (sclk), + .mosi (mosi), + .miso (miso), + .mb_clock_divider (mb_clock_divider), + .db_clock_divider (db_clock_divider) + ); + + //--------------------------------------------------------------------------- + // Invalid target address spaces + //--------------------------------------------------------------------------- + + ctrlport_terminator #( + .START_ADDRESS (BASE + BASE_SIZE), + .LAST_ADDRESS (MB_CPLD-1) + ) ctrlport_terminator_intermediate ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr (unused_fpga_intermediate_ctrlport_req_wr), + .s_ctrlport_req_rd (unused_fpga_intermediate_ctrlport_req_rd), + .s_ctrlport_req_addr (unused_fpga_intermediate_ctrlport_req_addr), + .s_ctrlport_req_data (unused_fpga_intermediate_ctrlport_req_data), + .s_ctrlport_resp_ack (unused_fpga_intermediate_ctrlport_resp_ack), + .s_ctrlport_resp_status (unused_fpga_intermediate_ctrlport_resp_status), + .s_ctrlport_resp_data (unused_fpga_intermediate_ctrlport_resp_data) + ); + + ctrlport_terminator #( + .START_ADDRESS (DB1_CPLD + DB1_CPLD_SIZE), + .LAST_ADDRESS (2**CTRLPORT_ADDR_W-1) + ) ctrlport_terminator_msbs ( + .ctrlport_clk (ctrlport_clk), + .ctrlport_rst (ctrlport_rst), + .s_ctrlport_req_wr (unused_fpga_msbs_ctrlport_req_wr), + .s_ctrlport_req_rd (unused_fpga_msbs_ctrlport_req_rd), + .s_ctrlport_req_addr (unused_fpga_msbs_ctrlport_req_addr), + .s_ctrlport_req_data (unused_fpga_msbs_ctrlport_req_data), + .s_ctrlport_resp_ack (unused_fpga_msbs_ctrlport_resp_ack), + .s_ctrlport_resp_status (unused_fpga_msbs_ctrlport_resp_status), + .s_ctrlport_resp_data (unused_fpga_msbs_ctrlport_resp_data) + ); + +endmodule + + +`default_nettype wire + + +//XmlParse xml_on +//<regmap name="PL_CPLD_REGMAP" readablestrobes="false" generatevhdl="true" ettusguidelines="true"> +// <info> +// This register map is available from the PS via AXI and MPM endpoint. +// Its size is 128K (17 bits). Only the 17 LSBs are used as address in this documentation. +// </info> +// <group name="PL_CPLD_WINDOWS"> +// <window name="BASE" offset="0x0" size="0x40" targetregmap="CPLD_INTERFACE_REGMAP"/> +// <window name="MB_CPLD" offset="0x8000" size="0x8000" targetregmap="MB_CPLD_PL_REGMAP"> +// <info> +// All registers of the MB CPLD (PL part). +// </info> +// </window> +// <window name="DB0_CPLD" offset="0x10000" size="0x8000"> +// <info> +// All registers of the first DB CPLD. Register map will be added later on. +// </info> +// </window> +// <window name="DB1_CPLD" offset="0x18000" size="0x8000"> +// <info> +// All registers of the second DB CPLD. Register map will be added later on. +// </info> +// </window> +// </group> +//</regmap> +//XmlParse xml_off |