mpm/fpga: x4xx: Major updates in preparation for future devices

FPGA:
- Split up MB registers that control daughterboard specific settings so
  that daughterboards 0 and 1 could have different setings, in
  preparation for future devices that require different settings.
  This requires a compat number bump to 8.0.
- Add registers for additional RFDC information, including the
  block/tile mapping of the individual channels, and information about
  resampling capabilities
- Identify sections of code that would be specific to X410/ZBX and move
  them to their own headers, so it's trivial to add device-specific
  sections of code instead for other devices in the future.
  - This includes constraints for clocks and I/O pins.
- Remove ability to do timed ctrlport transactions to the MB CPLD, this
  was unused and possibly broken.
- Move daughterboard-specific code into its own code location
  (dboards/zbx)
- Move X410-specific register documentation to its own location
  (doc/X410)
- Refactor Makefiles to split out X410/ZBX specific components and allow
  switching between device types
- Add 512-bit AXI interconnects
- Make number of timekeepers configurable (X410 keeps the single
  timekeeper)

MPM:
- Required compat is bumped to 8.0
- Now supports new registers for detecting DSP capabilities and
  multi-rate settings for the daughterboards
- Adds MMCM controls (currently unused)

Co-authored-by: Wade Fife <wade.fife@ni.com>
Co-authored-by: Ryan Marlow <ryan@lmarlow.com>
Co-authored-by: Martin Braun <martin.braun@ettus.com>
Co-authored-by: Humberto Jimenez <humberto.jimenez@ni.com>


Original-commit: c1d268917ea65dd9c5a42366014cb96d3c025223
This commit is contained in:
Javier Valenzuela
2023-05-23 09:06:17 +02:00
committed by Martin Braun
co-authored by Wade Fife Ryan Marlow Martin Braun Humberto Jimenez
parent ffdcc016cc
commit adf6f576c6
79 changed files with 41079 additions and 2315 deletions
+46 -156
View File
@@ -30,11 +30,6 @@ module cpld_interface (
// 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,
@@ -64,8 +59,6 @@ module cpld_interface (
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,
@@ -91,7 +84,8 @@ module cpld_interface (
`include "../../lib/rfnoc/core/ctrlport.vh"
`include "regmap/pl_cpld_regmap_utils.vh"
`include "cpld/regmap/mb_cpld_pl_regmap_utils.vh"
// Variant-dependent register map.
`include "cpld/regmap/x410/mb_cpld_pl_regmap_utils.vh"
`include "cpld/regmap/pl_cpld_base_regmap_utils.vh"
//---------------------------------------------------------------------------
@@ -103,28 +97,6 @@ module cpld_interface (
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
//---------------------------------------------------------------------------
@@ -134,12 +106,10 @@ module cpld_interface (
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;
@@ -177,8 +147,8 @@ module cpld_interface (
.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_req_has_time (),
.m_ctrlport_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)
@@ -186,16 +156,14 @@ module cpld_interface (
// 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;
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_clk_cross ctrlport_clk_cross_mpm (
.rst (s_axi_areset),
@@ -208,63 +176,25 @@ module cpld_interface (
.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_req_has_time (1'b0),
.s_ctrlport_req_time (64'b0),
.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_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_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)
.m_ctrlport_req_data (mpm_endpoint_ctrlport_req_data),
.m_ctrlport_req_byte_en (mpm_endpoint_ctrlport_req_byte_en),
.m_ctrlport_req_has_time (),
.m_ctrlport_req_time (),
.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)
);
//---------------------------------------------------------------------------
@@ -272,16 +202,14 @@ module cpld_interface (
//---------------------------------------------------------------------------
// 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;
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_clk_cross ctrlport_clk_cross_app (
.rst (ctrlport_rst),
@@ -294,63 +222,25 @@ module cpld_interface (
.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_req_has_time (1'b0),
.s_ctrlport_req_time (64'b0),
.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_wr (app_ctrlport_req_wr),
.m_ctrlport_req_rd (app_ctrlport_req_rd),
.m_ctrlport_req_addr (app_ctrlport_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)
.m_ctrlport_req_data (app_ctrlport_req_data),
.m_ctrlport_req_byte_en (app_ctrlport_req_byte_en),
.m_ctrlport_req_has_time (),
.m_ctrlport_req_time (),
.m_ctrlport_resp_ack (app_ctrlport_resp_ack),
.m_ctrlport_resp_status (app_ctrlport_resp_status),
.m_ctrlport_resp_data (app_ctrlport_resp_data)
);
//---------------------------------------------------------------------------
@@ -440,8 +330,8 @@ module cpld_interface (
.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_req_has_time ({4{1'b0}}),
.s_ctrlport_req_time ({4{64'b0}}),
.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}),