diff options
author | Javier Valenzuela <javier.valenzuela@ni.com> | 2022-03-17 14:38:45 -0500 |
---|---|---|
committer | Wade Fife <wade.fife@ettus.com> | 2022-04-04 15:17:07 -0500 |
commit | e51f18925a566f152c4e8622aac6376efe46c6eb (patch) | |
tree | 0f2bc08dd15d82ab3236fd9dd088e5d0dc8dde21 /fpga/usrp3/top/x400/dboards/db_gpio_interface.v | |
parent | bc8713e7af36377abe1c0e969c095c6b627b00c7 (diff) | |
download | uhd-e51f18925a566f152c4e8622aac6376efe46c6eb.tar.gz uhd-e51f18925a566f152c4e8622aac6376efe46c6eb.tar.bz2 uhd-e51f18925a566f152c4e8622aac6376efe46c6eb.zip |
fpga: x400: Add timed commands support for all radio ctrlport endpoints
Extends timed command support to all endpoints
addressable by the radio ctrlport interface.
Previously supported endpoints:
- Daughterboard GPIO interface
- RFDC timing control
Newly supported endpoints:
- DIO ATR control
- DIO SPI control
- DIO Source control
Diffstat (limited to 'fpga/usrp3/top/x400/dboards/db_gpio_interface.v')
-rw-r--r-- | fpga/usrp3/top/x400/dboards/db_gpio_interface.v | 88 |
1 files changed, 20 insertions, 68 deletions
diff --git a/fpga/usrp3/top/x400/dboards/db_gpio_interface.v b/fpga/usrp3/top/x400/dboards/db_gpio_interface.v index 1e8cd44ee..d48650d7c 100644 --- a/fpga/usrp3/top/x400/dboards/db_gpio_interface.v +++ b/fpga/usrp3/top/x400/dboards/db_gpio_interface.v @@ -34,26 +34,17 @@ module db_gpio_interface ( // DB state lines (domain: radio_clk) input wire [ 3:0] db_state, - - // time interfaces (domain: radio_clk) - input wire [63:0] radio_time, - input wire radio_time_stb, - input wire [ 3:0] time_ignore_bits, - // Request (domain: radio_clk) input wire ctrlport_rst, 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, // Response (domain: radio_clk) output wire s_ctrlport_resp_ack, - output wire [ 1:0] s_ctrlport_resp_status, - output wire [31:0] s_ctrlport_resp_data, + output reg [ 1:0] s_ctrlport_resp_status, + output reg [31:0] s_ctrlport_resp_data, // GPIO interface (domain: pll_ref_clk) input wire [19:0] gpio_in, @@ -68,45 +59,6 @@ module db_gpio_interface ( `include "../regmap/versioning_utils.vh" //---------------------------------------------------------------------------- - // Timed command processing - //---------------------------------------------------------------------------- - wire [19:0] ctrlport_timed_req_addr; - wire [31:0] ctrlport_timed_req_data; - wire ctrlport_timed_req_rd; - wire ctrlport_timed_req_wr; - wire ctrlport_timed_resp_ack; - reg [31:0] ctrlport_timed_resp_data = 0; - reg [ 1:0] ctrlport_timed_resp_status = 0; - - ctrlport_timer #( - .EXEC_LATE_CMDS(1) - ) ctrlport_timer_i ( - .clk (radio_clk), - .rst (ctrlport_rst), - .time_now (radio_time), - .time_now_stb (radio_time_stb), - .time_ignore_bits (time_ignore_bits), - .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_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_req_wr (ctrlport_timed_req_wr), - .m_ctrlport_req_rd (ctrlport_timed_req_rd), - .m_ctrlport_req_addr (ctrlport_timed_req_addr), - .m_ctrlport_req_data (ctrlport_timed_req_data), - .m_ctrlport_req_byte_en (), - .m_ctrlport_resp_ack (ctrlport_timed_resp_ack), - .m_ctrlport_resp_status (ctrlport_timed_resp_status), - .m_ctrlport_resp_data (ctrlport_timed_resp_data) - ); - - //---------------------------------------------------------------------------- // Clock domain crossing (radio_clk -> pll_ref_clk) //---------------------------------------------------------------------------- // Radio_clk is derived from pll_ref_clk by an integer multiplier and @@ -116,8 +68,8 @@ module db_gpio_interface ( // them. // holding read and write flags for multiple radio_clk cycles - reg ctrlport_timed_req_wr_hold = 1'b0; - reg ctrlport_timed_req_rd_hold = 1'b0; + reg ctrlport_req_wr_hold = 1'b0; + reg ctrlport_req_rd_hold = 1'b0; reg [19:0] ctrlport_req_addr_prc = 20'b0; reg [31:0] ctrlport_req_data_prc = 32'b0; @@ -151,41 +103,41 @@ module db_gpio_interface ( always @(posedge radio_clk) begin if (ctrlport_req_wr_fall) begin - ctrlport_timed_req_wr_hold <= 1'b0; - end else if (ctrlport_timed_req_wr) begin - ctrlport_timed_req_wr_hold <= 1'b1; + ctrlport_req_wr_hold <= 1'b0; + end else if (s_ctrlport_req_wr) begin + ctrlport_req_wr_hold <= 1'b1; end if (ctrlport_req_rd_fall) begin - ctrlport_timed_req_rd_hold <= 1'b0; - end else if (ctrlport_timed_req_rd) begin - ctrlport_timed_req_rd_hold <= 1'b1; + ctrlport_req_rd_hold <= 1'b0; + end else if (s_ctrlport_req_rd) begin + ctrlport_req_rd_hold <= 1'b1; end // capture request address and data - if (ctrlport_timed_req_wr || ctrlport_timed_req_rd) begin - ctrlport_req_addr_prc <= ctrlport_timed_req_addr; - ctrlport_req_data_prc <= ctrlport_timed_req_data; + if (s_ctrlport_req_wr || s_ctrlport_req_rd) begin + ctrlport_req_addr_prc <= s_ctrlport_req_addr; + ctrlport_req_data_prc <= s_ctrlport_req_data; end end // capture extended flags in pll_ref_clk domain always @(posedge pll_ref_clk) begin - ctrlport_req_wr_prc <= ctrlport_timed_req_wr_hold; - ctrlport_req_rd_prc <= ctrlport_timed_req_rd_hold; + ctrlport_req_wr_prc <= ctrlport_req_wr_hold; + ctrlport_req_rd_prc <= ctrlport_req_rd_hold; end // search for rising edge in response - reg [1:0] ctrlport_timed_ack_reg = 2'b0; + reg [1:0] ctrlport_resp_ack_reg = 2'b0; always @(posedge radio_clk) begin - ctrlport_timed_ack_reg = {ctrlport_timed_ack_reg[0], ctrlport_resp_ack_fall}; + ctrlport_resp_ack_reg = {ctrlport_resp_ack_reg[0], ctrlport_resp_ack_fall}; end - assign ctrlport_timed_resp_ack = ctrlport_timed_ack_reg[0] & ~ctrlport_timed_ack_reg[1]; + assign s_ctrlport_resp_ack = ctrlport_resp_ack_reg[0] & ~ctrlport_resp_ack_reg[1]; // capture response data always @(posedge radio_clk) begin if (ctrlport_resp_ack_fall) begin - ctrlport_timed_resp_status <= ctrlport_resp_status_fall; - ctrlport_timed_resp_data <= ctrlport_resp_data_fall; + s_ctrlport_resp_status <= ctrlport_resp_status_fall; + s_ctrlport_resp_data <= ctrlport_resp_data_fall; end end |