142 lines
7.0 KiB
Verilog
142 lines
7.0 KiB
Verilog
//
|
|
// Copyright 2025 Ettus Research, a National Instruments Brand
|
|
//
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
//
|
|
// Module: axi_rfdc_info_memory
|
|
//
|
|
// Description:
|
|
//
|
|
// This module is a bridge between the RFDC info memory and the AXI4-Lite bus.
|
|
// The RFDC info memory contains information about the ADC / DAC configuration
|
|
// of the RFDC block and their respective logical RFNoC channels.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// TIMEOUT Control port will timeout after 2^TIMEOUT AXI clock cycles
|
|
// AXI_ADDR_WIDTH Width of the AXI bus. Aliasing occurs if AXI_ADDR_WIDTH > CTRLPORT_AWIDTH
|
|
// CTRLPORT_AWIDTH Number of address LSBs forwarded to m_ctrlport_req_addr
|
|
//
|
|
|
|
|
|
module axi_rfdc_info_memory #(
|
|
parameter TIMEOUT = 2,
|
|
parameter AXI_ADDR_WIDTH = 6,
|
|
parameter CTRLPORT_AWIDTH = 6
|
|
)(
|
|
//Clock and reset
|
|
input wire s_axi_aclk,
|
|
input wire s_axi_aresetn,
|
|
// AXI4-Lite: Write address port (domain: s_axi_aclk)
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s AWADDR" *)
|
|
input wire [AXI_ADDR_WIDTH-1:0] s_axi_awaddr,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s AWVALID" *)
|
|
input wire s_axi_awvalid,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s AWREADY" *)
|
|
output wire s_axi_awready,
|
|
// AXI4-Lite: Write data port (domain: s_axi_aclk)
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s WDATA" *)
|
|
input wire [31:0] s_axi_wdata,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s WSTRB" *)
|
|
input wire [ 3:0] s_axi_wstrb,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s WVALID" *)
|
|
input wire s_axi_wvalid,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s WREADY" *)
|
|
output wire s_axi_wready,
|
|
// AXI4-Lite: Write response port (domain: s_axi_aclk)
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s BRESP" *)
|
|
output wire [ 1:0] s_axi_bresp,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s BVALID" *)
|
|
output wire s_axi_bvalid,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s BREADY" *)
|
|
input wire s_axi_bready,
|
|
// AXI4-Lite: Read address port (domain: s_axi_aclk)
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s ARADDR" *)
|
|
input wire [AXI_ADDR_WIDTH-1:0] s_axi_araddr,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s ARVALID" *)
|
|
input wire s_axi_arvalid,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s ARREADY" *)
|
|
output wire s_axi_arready,
|
|
// AXI4-Lite: Read data port (domain: s_axi_aclk)
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s RDATA" *)
|
|
output wire[31:0] s_axi_rdata,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s RRESP" *)
|
|
output wire[ 1:0] s_axi_rresp,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s RVALID" *)
|
|
output wire s_axi_rvalid,
|
|
(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 axi_s RREADY" *)
|
|
input wire s_axi_rready
|
|
);
|
|
|
|
// synchronize reset
|
|
wire resetn;
|
|
reset_sync reset_syncx (
|
|
.clk (s_axi_aclk), //input wire
|
|
.reset_in (s_axi_aresetn), //input wire
|
|
.reset_out(resetn) //output reg
|
|
);
|
|
|
|
//ctrlport signals between memory and axi ctrlport bridge
|
|
wire [19:0] ctrlport_req_addr;
|
|
wire [ 3:0] ctrlport_req_byte_en;
|
|
wire [31:0] ctrlport_req_data;
|
|
wire ctrlport_req_rd;
|
|
wire ctrlport_req_wr;
|
|
wire ctrlport_resp_ack;
|
|
wire [31:0] ctrlport_resp_data;
|
|
wire [ 1:0] ctrlport_resp_status;
|
|
|
|
axil_ctrlport_master #(
|
|
.TIMEOUT (TIMEOUT), //integer:=10
|
|
.AXI_AWIDTH (AXI_ADDR_WIDTH), //integer:=17
|
|
.CTRLPORT_AWIDTH(CTRLPORT_AWIDTH) //integer:=17
|
|
) axil_ctrlport_masterx (
|
|
.s_axi_aclk (s_axi_aclk), //input wire
|
|
.s_axi_aresetn (s_axi_aresetn), //input wire
|
|
.s_axi_awaddr (s_axi_awaddr), //input wire[(AXI_ADDR_WIDTH-1):0]
|
|
.s_axi_awvalid (s_axi_awvalid), //input wire
|
|
.s_axi_awready (s_axi_awready), //output reg
|
|
.s_axi_wdata (s_axi_wdata), //input wire[31:0]
|
|
.s_axi_wstrb (s_axi_wstrb), //input wire[3:0]
|
|
.s_axi_wvalid (s_axi_wvalid), //input wire
|
|
.s_axi_wready (s_axi_wready), //output reg
|
|
.s_axi_bresp (s_axi_bresp), //output reg[1:0]
|
|
.s_axi_bvalid (s_axi_bvalid), //output reg
|
|
.s_axi_bready (s_axi_bready), //input wire
|
|
.s_axi_araddr (s_axi_araddr), //input wire[(AXI_ADDR_WIDTH-1):0]
|
|
.s_axi_arvalid (s_axi_arvalid), //input wire
|
|
.s_axi_arready (s_axi_arready), //output reg
|
|
.s_axi_rdata (s_axi_rdata), //output reg[31:0]
|
|
.s_axi_rresp (s_axi_rresp), //output reg[1:0]
|
|
.s_axi_rvalid (s_axi_rvalid), //output reg
|
|
.s_axi_rready (s_axi_rready), //input wire
|
|
.m_ctrlport_req_wr (ctrlport_req_wr), //output reg
|
|
.m_ctrlport_req_rd (ctrlport_req_rd), //output reg
|
|
.m_ctrlport_req_addr (ctrlport_req_addr), //output reg[19:0]
|
|
.m_ctrlport_req_portid (), //output wire[9:0]
|
|
.m_ctrlport_req_rem_epid (), //output wire[15:0]
|
|
.m_ctrlport_req_rem_portid(), //output wire[9:0]
|
|
.m_ctrlport_req_data (ctrlport_req_data), //output reg[31:0]
|
|
.m_ctrlport_req_byte_en (ctrlport_req_byte_en), //output reg[3:0]
|
|
.m_ctrlport_req_has_time (), //output wire
|
|
.m_ctrlport_req_time (), //output wire[63:0]
|
|
.m_ctrlport_resp_ack (ctrlport_resp_ack), //input wire
|
|
.m_ctrlport_resp_status (ctrlport_resp_status), //input wire[1:0]
|
|
.m_ctrlport_resp_data (ctrlport_resp_data) //input wire[31:0]
|
|
);
|
|
|
|
rfdc_info_memory rfdc_info_memoryx (
|
|
.clk (s_axi_aclk), //input logic
|
|
.rst (~resetn), //input logic
|
|
.s_ctrlport_req_addr (ctrlport_req_addr), //input logic[19:0]
|
|
.s_ctrlport_req_byte_en(ctrlport_req_byte_en), //input logic[3:0]
|
|
.s_ctrlport_req_data (ctrlport_req_data), //input logic[31:0]
|
|
.s_ctrlport_req_rd (ctrlport_req_rd), //input logic
|
|
.s_ctrlport_req_wr (ctrlport_req_wr), //input logic
|
|
.s_ctrlport_resp_ack (ctrlport_resp_ack), //output logic
|
|
.s_ctrlport_resp_data (ctrlport_resp_data), //output logic[31:0]
|
|
.s_ctrlport_resp_status(ctrlport_resp_status) //output logic[1:0]
|
|
);
|
|
|
|
endmodule
|