diff options
Diffstat (limited to 'usrp2')
| -rw-r--r-- | usrp2/control_lib/settings_readback_bus_fifo_ctrl.v | 147 | 
1 files changed, 107 insertions, 40 deletions
| diff --git a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v index 2e6ff1b15..6a2438280 100644 --- a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v +++ b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v @@ -76,70 +76,131 @@ module settings_readback_bus_fifo_ctrl      wire writing = out_valid && out_ready;      //state machine constants -    localparam READ_HDR = 0; -    localparam READ_DATA = 1; -    localparam WAIT_EOF = 2; -    localparam ACTION_EVENT = 3; -    localparam WRITE_PROT_HDR = 4; -    localparam WRITE_VRT_HDR = 5; -    localparam WRITE_VRT_SID = 6; -    localparam WRITE_VRT_TSF0 = 7; -    localparam WRITE_VRT_TSF1 = 8; -    localparam WRITE_RB_HDR = 9; -    localparam WRITE_RB_DATA = 10; - -    reg [3:0] state; +    localparam READ_LINE0     = 0; +    localparam VITA_HDR       = 1; +    localparam VITA_SID       = 2; +    localparam VITA_CID0      = 3; +    localparam VITA_CID1      = 4; +    localparam VITA_TSI       = 5; +    localparam VITA_TSF0      = 6; +    localparam VITA_TSF1      = 7; +    localparam READ_HDR       = 8; +    localparam READ_DATA      = 9; +    localparam WAIT_EOF       = 10; +    localparam ACTION_EVENT   = 11; +    localparam WRITE_PROT_HDR = 12; +    localparam WRITE_VRT_HDR  = 13; +    localparam WRITE_VRT_SID  = 14; +    localparam WRITE_VRT_TSF0 = 15; +    localparam WRITE_VRT_TSF1 = 16; +    localparam WRITE_RB_HDR   = 17; +    localparam WRITE_RB_DATA  = 18; + +    reg [4:0] state;      //holdover from current read inputs      reg [31:0] in_data_reg, in_hdr_reg;      wire [7:0] in_addr = in_hdr_reg[7:0]; -    wire [7:0] do_poke = in_hdr_reg[8]; +    wire do_poke = in_hdr_reg[8]; +    reg [63:0] in_ticks_reg; +    reg [3:0] in_seq_reg; +    reg strobe_reg; +    wire has_sid = in_data0[28]; +    wire has_cid = in_data0[27]; +    wire has_tsi = in_data0[23:22] != 0; +    wire has_tsf = in_data0[21:20] != 0; +    reg has_sid_reg, has_cid_reg, has_tsi_reg, has_tsf_reg;      always @(posedge clock) begin          if (reset) begin -            state <= READ_HDR; -            in_hdr_reg <= 0; -            in_data_reg <= 0; +            state <= READ_LINE0;          end          else begin              case (state) -            READ_HDR: begin +            READ_LINE0: begin                  if (reading/* && in_data0[32]*/) begin -                    in_hdr_reg <= in_data0[31:0]; -                    state <= READ_DATA; +                    state <= VITA_HDR;                  end              end -            READ_DATA: begin +            VITA_HDR: begin                  if (reading) begin -                    in_data_reg <= in_data0[31:0]; -                    state <= (in_data0[33])? ACTION_EVENT : WAIT_EOF; +                    if      (has_sid) state <= VITA_SID; +                    else if (has_cid) state <= VITA_CID0; +                    else if (has_tsi) state <= VITA_TSI; +                    else if (has_tsf) state <= VITA_TSF0; +                    else              state <= READ_HDR;                  end +                in_seq_reg <= in_data0[19:16]; +                has_sid_reg <= has_sid; +                has_cid_reg <= has_cid; +                has_tsi_reg <= has_tsi; +                has_tsf_reg <= has_tsf;              end -            WAIT_EOF: begin +            VITA_SID: begin +                if (reading) begin +                    if      (has_cid_reg) state <= VITA_CID0; +                    else if (has_tsi_reg) state <= VITA_TSI; +                    else if (has_tsf_reg) state <= VITA_TSF0; +                    else                  state <= READ_HDR; +                end +            end + +            VITA_CID0: begin +                if (reading) state <= VITA_CID1; +            end + +            VITA_CID1: begin +                if (reading) begin +                    if      (has_tsi_reg) state <= VITA_TSI; +                    else if (has_tsf_reg) state <= VITA_TSF0; +                    else                  state <= READ_HDR; +                end +            end + +            VITA_TSI: begin                  if (reading) begin -                    if (in_data0[33]) begin -                        state <= ACTION_EVENT; -                    end +                    if (has_tsf_reg) state <= VITA_TSF0; +                    else             state <= READ_HDR;                  end              end +            VITA_TSF0: begin +                if (reading) state <= VITA_TSF1; +                in_ticks_reg[63:32] <= in_data0; +            end + +            VITA_TSF1: begin +                if (reading) state <= READ_HDR; +                in_ticks_reg[31:0] <= in_data0; +            end + +            READ_HDR: begin +                if (reading) state <= READ_DATA; +                in_hdr_reg <= in_data0[31:0]; +            end + +            READ_DATA: begin +                if (reading) state <= (in_data0[33])? ACTION_EVENT : WAIT_EOF; +                in_data_reg <= in_data0[31:0]; +            end + +            WAIT_EOF: begin +                if (reading && in_data0[33]) state <= ACTION_EVENT; +            end +              ACTION_EVENT: begin // poking and peeking happens here!                  state <= WRITE_PROT_HDR;              end              WRITE_RB_DATA: begin -                if (writing) begin -                    state <= READ_HDR; -                end +                if (writing) state <= READ_LINE0;              end              default: begin -                if (writing) begin -                    state <= state + 1; -                end +                if (writing) state <= state + 1;              end              endcase //state @@ -185,7 +246,7 @@ module settings_readback_bus_fifo_ctrl      always @* begin          case (state)              WRITE_PROT_HDR: out_data_int <= prot_hdr; -            WRITE_VRT_HDR:  out_data_int <= {12'b010100000001, 4'b0/*seqno*/, 16'd6}; +            WRITE_VRT_HDR:  out_data_int <= {12'b010100000001, in_seq_reg, 16'd6};              WRITE_VRT_SID:  out_data_int <= SID;              WRITE_VRT_TSF0: out_data_int <= rb_time[63:32];              WRITE_VRT_TSF1: out_data_int <= rb_time[31:0]; @@ -206,16 +267,22 @@ module settings_readback_bus_fifo_ctrl      assign out_data[31:0] = out_data_int;      //assign to settings bus interface -    assign strobe = (state == ACTION_EVENT) && do_poke; +    assign strobe = strobe_reg;      assign data = in_data_reg;      assign addr = in_addr; +    always @(posedge clock) begin +        if (reset || state != ACTION_EVENT) strobe_reg <= 0; +        else                                strobe_reg <= do_poke; +    end +      assign debug = { -        state, -        in_valid, in_ready, in_data[33:32], -        in_valid0, in_ready0, in_data0[33:32], -        out_valid, out_ready, out_data[33:32], -        16'b0 +        state, strobe, do_poke, strobe_reg, //8 +        addr, //8 +        data[15:0] +        //in_valid, in_ready, in_data[33:32], +        //in_valid0, in_ready0, in_data0[33:32], +        //out_valid, out_ready, out_data[33:32],      };  endmodule //settings_readback_bus_fifo_ctrl | 
