// // Copyright 2021 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: LGPL-3.0-or-later // // Module: power_regs // // Description: // Registers to control the power supplies and the PLL ref clock buffer. // `default_nettype none module power_regs #( parameter [19:0] BASE_ADDRESS = 0, parameter [19:0] SIZE_ADDRESS = 0 ) ( // Request 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, // Response output reg s_ctrlport_resp_ack, output reg [ 1:0] s_ctrlport_resp_status, output reg [31:0] s_ctrlport_resp_data, //reg clk domain input wire ctrlport_clk, input wire ctrlport_rst, //Power Control output wire enable_tx_7v0, output wire enable_rx_7v0, output wire enable_3v3, //Power Good Indicators input wire p7v_pg_b, input wire p7v_pg_a, //PRC buffer output reg pll_ref_clk_enable = 1'b0 ); `include "../regmap/power_regs_regmap_utils.vh" `include "../../../../../../lib/rfnoc/core/ctrlport.vh" //---------------------------------------------------------- // Internal registers //---------------------------------------------------------- reg enable_3v3_reg = {ENABLE_3V3_SIZE {1'b0}}; reg enable_rx_7v0_reg = {ENABLE_RX_7V0_SIZE {1'b0}}; reg enable_tx_7v0_reg = {ENABLE_TX_7V0_SIZE {1'b0}}; //---------------------------------------------------------- // Handling of CtrlPort //---------------------------------------------------------- wire address_in_range = (s_ctrlport_req_addr >= BASE_ADDRESS) && (s_ctrlport_req_addr < BASE_ADDRESS + SIZE_ADDRESS); always @(posedge ctrlport_clk) begin // reset internal registers and responses if (ctrlport_rst) begin s_ctrlport_resp_ack <= 1'b0; s_ctrlport_resp_data <= {32{1'bx}}; s_ctrlport_resp_status <= CTRL_STS_OKAY; enable_3v3_reg <= {ENABLE_3V3_SIZE {1'b0}}; enable_rx_7v0_reg <= {ENABLE_RX_7V0_SIZE {1'b0}}; enable_tx_7v0_reg <= {ENABLE_TX_7V0_SIZE {1'b0}}; end else begin // write requests if (s_ctrlport_req_wr) begin // always issue an ack and no data s_ctrlport_resp_ack <= 1'b1; s_ctrlport_resp_data <= {32{1'bx}}; s_ctrlport_resp_status <= CTRL_STS_OKAY; case (s_ctrlport_req_addr) BASE_ADDRESS + RF_POWER_CONTROL: begin enable_3v3_reg <= s_ctrlport_req_data[ENABLE_3V3]; enable_rx_7v0_reg <= s_ctrlport_req_data[ENABLE_RX_7V0]; enable_tx_7v0_reg <= s_ctrlport_req_data[ENABLE_TX_7V0]; end BASE_ADDRESS + PRC_CONTROL: begin pll_ref_clk_enable <= s_ctrlport_req_data[PLL_REF_CLOCK_ENABLE]; end // error on undefined address default: begin if (address_in_range) begin s_ctrlport_resp_status <= CTRL_STS_CMDERR; // no response if out of range end else begin s_ctrlport_resp_ack <= 1'b0; end end endcase // read requests end else if (s_ctrlport_req_rd) begin // default assumption: valid request s_ctrlport_resp_ack <= 1'b1; s_ctrlport_resp_status <= CTRL_STS_OKAY; s_ctrlport_resp_data <= {32{1'b0}}; case (s_ctrlport_req_addr) BASE_ADDRESS + RF_POWER_CONTROL: begin s_ctrlport_resp_data[ENABLE_3V3] <= enable_3v3_reg; s_ctrlport_resp_data[ENABLE_RX_7V0] <= enable_rx_7v0_reg; s_ctrlport_resp_data[ENABLE_TX_7V0] <= enable_tx_7v0_reg; end BASE_ADDRESS + RF_POWER_STATUS: begin s_ctrlport_resp_data[P7V_A_STATUS] <= p7v_pg_a; s_ctrlport_resp_data[P7V_B_STATUS] <= p7v_pg_b; end BASE_ADDRESS + PRC_CONTROL: begin s_ctrlport_resp_data[PLL_REF_CLOCK_ENABLE] <= pll_ref_clk_enable; end // error on undefined address default: begin s_ctrlport_resp_data <= {32{1'b0}}; if (address_in_range) begin s_ctrlport_resp_status <= CTRL_STS_CMDERR; // no response if out of range end else begin s_ctrlport_resp_ack <= 1'b0; end end endcase // no request end else begin s_ctrlport_resp_ack <= 1'b0; end end end assign enable_tx_7v0 = enable_tx_7v0_reg; assign enable_rx_7v0 = enable_rx_7v0_reg; assign enable_3v3 = enable_3v3_reg; endmodule `default_nettype wire //XmlParse xml_on // // // // This regmap contains the registers to control the power supplies and the clock buffer for PLL reference clock. // // // // This register controls power supply enables to the Tx/Rx amps, switch control, and clk buffers. During normal // operations, all three power supplies should be enabled. // // // // This power supply sources the switch control, and the clock buffers. By default this power supply is off. // The internal LOs will not work unless this bit is enabled.{BR/} // // // // // This power supply sources the Rx0 and Rx1 amps. By default this power supply is off.The Rx0/1 path will not // be active unless this power supply is enabled. Disabling this bit is similar to RX RF blanking{BR/} // {font color="red"}note to digital engineer, this is Pos7v0B{/font} // // // // // This power supply sources the Tx0 and Tx1 amps. By default this power supply is off. The Tx0/1 path will not // be active unless this power supply is enabled. Disabling this bit is similar to TX RF blanking{BR/} // {font color="red"}note to digital engineer, this is Pos7v0A{/font} // // // // // // Returns status of PowerGood indicators across the daughterboard. // // // // Returns status of 7V switching regulator A.{BR/} // // // // // Returns status of 7V switching regulator B.{BR/} // // // // // // Offers ability to enable or disable the PLL reference clock. // // // If set PLL reference clock is enabled. // // // // //XmlParse xml_off