diff options
| author | Javier Valenzuela <javier.valenzuela@ni.com> | 2022-06-14 10:12:05 -0500 |
|---|---|---|
| committer | skooNI <60897865+skooNI@users.noreply.github.com> | 2022-07-20 15:57:20 -0500 |
| commit | 303ddf1238ef1d38fb8b25f7e97b2319475299c1 (patch) | |
| tree | ee9aba5aca59ee20dc7b618ab41c4cc7ba18ba40 /fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v | |
| parent | 32786c63930bc532bca1f25ab8d3404b5773edfd (diff) | |
| download | uhd-303ddf1238ef1d38fb8b25f7e97b2319475299c1.tar.gz uhd-303ddf1238ef1d38fb8b25f7e97b2319475299c1.tar.bz2 uhd-303ddf1238ef1d38fb8b25f7e97b2319475299c1.zip | |
fpga: x400: zbx: Add support for XO3 CPLD variant.
The main changes included are:
- Variant-dependent pin-out instantiation.
- Update clocking scheme in top level file
to include XO3 PLL
- Add ability to shift outgoing data for
the GPIO communication interface with
the X410 FPGA.
- Include project files required to build
the XO3 variant of the ZBX CPLD.
- Add build flow for Lattice Diamond designs.
- Add ability to build XO3 variant of ZBX CPLD.
Diffstat (limited to 'fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v')
| -rw-r--r-- | fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v | 91 |
1 files changed, 62 insertions, 29 deletions
diff --git a/fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v b/fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v index b8fde0025..9e7e89c77 100644 --- a/fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v +++ b/fpga/usrp3/top/x400/dboards/ctrlport_byte_deserializer.v @@ -8,12 +8,18 @@ // Description: // Slave interface of CtrlPort interface serialized as byte stream. // See description in ctrlport_byte_serializer module for more details. +// Input and output data may be driven/registered using clocks with +// different phases (but same frequency), this allows the capability +// to facilitate meeting timing on this interface. // `default_nettype none module ctrlport_byte_deserializer ( + // clock domain used to register input data input wire ctrlport_clk, + // clock domain used to drive output data + input wire ctrlport_clk_adjusted, input wire ctrlport_rst, // Request @@ -58,17 +64,19 @@ module ctrlport_byte_deserializer ( localparam SENDING = 2'd3; // internal registers - reg [ 1:0] state = INIT_RX; - reg [NUM_BYTES_RX_WRITE*8-1:0] request_cache = {NUM_BYTES_RX_WRITE*8 {1'b0}}; - reg [ NUM_BYTES_TX_READ*8-1:0] response_cache = {NUM_BYTES_TX_READ*8 {1'b0}}; - reg [ 2:0] byte_counter = 3'b0; - reg transfer_complete = 1'b0; - reg write_transfer = 1'b0; + reg [ 1:0] state = INIT_RX; + reg [NUM_BYTES_RX_WRITE*8-1:0] request_cache = {NUM_BYTES_RX_WRITE*8 {1'b0}}; + reg [ NUM_BYTES_TX_READ*8-1:0] response_cache = {NUM_BYTES_TX_READ*8 {1'b0}}; + reg [ 2:0] request_byte_counter = 3'b0; + reg [ 2:0] response_byte_counter = 3'b0; + reg transfer_complete = 1'b0; + reg write_transfer = 1'b0; // input registers to relax input timing reg [7:0] bytestream_data_in_reg = 8'b0; reg bytestream_valid_in_reg = 1'b0; reg bytestream_direction_reg = 1'b0; + always @ (posedge ctrlport_clk) begin bytestream_data_in_reg <= bytestream_data_in; bytestream_valid_in_reg <= bytestream_valid_in; @@ -79,22 +87,19 @@ module ctrlport_byte_deserializer ( always @ (posedge ctrlport_clk) begin if (ctrlport_rst) begin state <= INIT_RX; - byte_counter <= 3'b0; + request_byte_counter <= 3'b0; transfer_complete <= 1'b0; - bytestream_output_enable <= 1'b0; + response_byte_counter <= 3'b0; end else begin // default assignments transfer_complete <= 1'b0; - // direction defined by master - bytestream_output_enable <= bytestream_direction; - bytestream_valid_out <= 1'b0; case (state) // additional cycle for switching to make sure valid signal is driven // from master when being in RECEIVE state INIT_RX: begin - byte_counter <= 3'b0; + request_byte_counter <= 3'b0; if (bytestream_direction_reg == 0) begin state <= RECEIVE; end @@ -103,17 +108,17 @@ module ctrlport_byte_deserializer ( // wait for reception of request from master RECEIVE: begin if (bytestream_valid_in_reg) begin - byte_counter <= byte_counter + 1'b1; + request_byte_counter <= request_byte_counter + 1'b1; request_cache <= {request_cache[NUM_BYTES_RX_WRITE*8-9:0], bytestream_data_in_reg}; // capture write or read - if (byte_counter == 0) begin + if (request_byte_counter == 0) begin write_transfer <= bytestream_data_in_reg[7]; end // wait until request completes - if ((write_transfer && byte_counter == NUM_BYTES_RX_WRITE-1) || - (~write_transfer && byte_counter == NUM_BYTES_RX_READ-1)) begin + if ((write_transfer && request_byte_counter == NUM_BYTES_RX_WRITE-1) || + (~write_transfer && request_byte_counter == NUM_BYTES_RX_READ-1)) begin transfer_complete <= 1'b1; state <= WAIT_RESPONSE; end @@ -127,15 +132,10 @@ module ctrlport_byte_deserializer ( end WAIT_RESPONSE: begin - byte_counter <= 3'b0; + request_byte_counter <= 3'b0; + response_byte_counter <= 3'b0; if (m_ctrlport_resp_ack) begin state <= SENDING; - - if (write_transfer) begin - response_cache <= {5'b0, 1'b1, m_ctrlport_resp_status, 32'b0}; - end else begin - response_cache <= {m_ctrlport_resp_data, 5'b0, 1'b1, m_ctrlport_resp_status}; - end end //abort by host @@ -145,14 +145,11 @@ module ctrlport_byte_deserializer ( end SENDING: begin - bytestream_valid_out <= 1'b1; - bytestream_data_out <= response_cache[NUM_BYTES_TX_READ*8-8+:8]; - response_cache <= {response_cache[NUM_BYTES_TX_READ*8-9:0], 8'b0}; - byte_counter <= byte_counter + 1'b1; + response_byte_counter <= response_byte_counter + 1'b1; // wait until request completes - if ((write_transfer && byte_counter == NUM_BYTES_TX_WRITE-1) || - (~write_transfer && byte_counter == NUM_BYTES_TX_READ-1)) begin + if ((write_transfer && response_byte_counter == NUM_BYTES_TX_WRITE-1) || + (~write_transfer && response_byte_counter == NUM_BYTES_TX_READ-1)) begin state <= INIT_RX; end @@ -169,6 +166,42 @@ module ctrlport_byte_deserializer ( end end + // Output data control + always @ (posedge ctrlport_clk_adjusted) begin + if (ctrlport_rst) begin + bytestream_valid_out <= 1'b0; + bytestream_output_enable <= 1'b0; + end else begin + + bytestream_valid_out <= 1'b0; + // direction defined by master + bytestream_output_enable <= bytestream_direction; + + case (state) + WAIT_RESPONSE: begin + + if (write_transfer) begin + response_cache <= {5'b0, 1'b1, m_ctrlport_resp_status, 32'b0}; + end else begin + response_cache <= {m_ctrlport_resp_data, 5'b0, 1'b1, m_ctrlport_resp_status}; + end + end + + SENDING: begin + + bytestream_valid_out <= 1'b1; + bytestream_data_out <= response_cache[NUM_BYTES_TX_READ*8-8+:8]; + response_cache <= {response_cache[NUM_BYTES_TX_READ*8-9:0], 8'b0}; + + end + + default: begin + // NOP + end + endcase + end + end + //---------------------------------------------------------- // assign request to ctrlport //---------------------------------------------------------- |
