summaryrefslogtreecommitdiffstats
path: root/usrp2/control_lib
diff options
context:
space:
mode:
Diffstat (limited to 'usrp2/control_lib')
-rw-r--r--usrp2/control_lib/settings_readback_bus_fifo_ctrl.v255
1 files changed, 160 insertions, 95 deletions
diff --git a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v
index 6a2438280..a83ac8e8c 100644
--- a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v
+++ b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v
@@ -17,9 +17,6 @@
// A settings and readback bus controlled via fifo36 interface
-//TODO: take vita packets as input and use tsf to wait for time
-//currently we skip vita packet on input, strait to payload
-
module settings_readback_bus_fifo_ctrl
#(
parameter SID = 0, //stream id for vita return packet
@@ -27,7 +24,7 @@ module settings_readback_bus_fifo_ctrl
)
(
//clock and synchronous reset for all interfaces
- input clock, input reset,
+ input clock, input reset, input clear,
//current system time
input [63:0] vita_time,
@@ -63,19 +60,32 @@ module settings_readback_bus_fifo_ctrl
output [31:0] debug
);
- wire [35:0] in_data0;
- wire in_valid0, in_ready0;
+ wire reading = in_valid && in_ready;
+ wire writing = out_valid && out_ready;
- fifo_cascade #(.WIDTH(36), .SIZE(9/*512 lines plenty for short pkts*/)) input_fifo (
- .clk(clock), .reset(reset), .clear(0),
- .datain(in_data), .src_rdy_i(in_valid), .dst_rdy_o(in_ready),
- .dataout(in_data0), .src_rdy_o(in_valid0), .dst_rdy_i(in_ready0)
+ //------------------------------------------------------------------
+ //-- The command fifo:
+ //-- Stores an individual register access command per line.
+ //------------------------------------------------------------------
+ wire [63:0] in_command_ticks, out_command_ticks;
+ wire [31:0] in_command_hdr, out_command_hdr;
+ wire [31:0] in_command_data, out_command_data;
+ wire in_command_has_time, out_command_has_time;
+ wire in_command_valid, in_command_ready;
+ wire out_command_valid, out_command_ready;
+
+ fifo_cascade #(.WIDTH(129), .SIZE(4)) command_fifo (
+ .clk(clock), .reset(reset), .clear(clear),
+ .datain({in_command_ticks, in_command_hdr, in_command_data, in_command_has_time}),
+ .src_rdy_i(in_command_valid), .dst_rdy_o(in_command_ready),
+ .dataout({out_command_ticks, out_command_hdr, out_command_data, out_command_has_time}),
+ .src_rdy_o(out_command_valid), .dst_rdy_i(out_command_ready)
);
- wire reading = in_valid0 && in_ready0;
- wire writing = out_valid && out_ready;
-
- //state machine constants
+ //------------------------------------------------------------------
+ //-- Input state machine:
+ //-- Read input packet and fill a command fifo entry.
+ //------------------------------------------------------------------
localparam READ_LINE0 = 0;
localparam VITA_HDR = 1;
localparam VITA_SID = 2;
@@ -87,52 +97,47 @@ module settings_readback_bus_fifo_ctrl
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;
+ localparam STORE_CMD = 11;
- reg [4:0] state;
+ reg [4:0] in_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 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;
+ wire has_sid = in_data[28];
+ wire has_cid = in_data[27];
+ wire has_tsi = in_data[23:22] != 0;
+ wire has_tsf = in_data[21:20] != 0;
reg has_sid_reg, has_cid_reg, has_tsi_reg, has_tsf_reg;
+ assign in_ready = (in_state < STORE_CMD);
+
+ //wire-up command inputs
+ assign in_command_valid = (in_state == STORE_CMD);
+ assign in_command_ticks = in_ticks_reg;
+ assign in_command_data = in_data_reg;
+ assign in_command_hdr = in_hdr_reg;
+ assign in_command_has_time = has_tsf;
+
always @(posedge clock) begin
if (reset) begin
- state <= READ_LINE0;
+ in_state <= READ_LINE0;
end
else begin
- case (state)
+ case (in_state)
READ_LINE0: begin
- if (reading/* && in_data0[32]*/) begin
- state <= VITA_HDR;
- end
+ if (reading/* && in_data[32]*/) in_state <= VITA_HDR;
end
VITA_HDR: begin
if (reading) begin
- 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;
+ if (has_sid) in_state <= VITA_SID;
+ else if (has_cid) in_state <= VITA_CID0;
+ else if (has_tsi) in_state <= VITA_TSI;
+ else if (has_tsf) in_state <= VITA_TSF0;
+ else in_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;
@@ -141,79 +146,149 @@ module settings_readback_bus_fifo_ctrl
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;
+ if (has_cid_reg) in_state <= VITA_CID0;
+ else if (has_tsi_reg) in_state <= VITA_TSI;
+ else if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
end
end
VITA_CID0: begin
- if (reading) state <= VITA_CID1;
+ if (reading) in_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;
+ if (has_tsi_reg) in_state <= VITA_TSI;
+ else if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
end
end
VITA_TSI: begin
if (reading) begin
- if (has_tsf_reg) state <= VITA_TSF0;
- else state <= READ_HDR;
+ if (has_tsf_reg) in_state <= VITA_TSF0;
+ else in_state <= READ_HDR;
end
end
VITA_TSF0: begin
- if (reading) state <= VITA_TSF1;
- in_ticks_reg[63:32] <= in_data0;
+ if (reading) in_state <= VITA_TSF1;
+ in_ticks_reg[63:32] <= in_data;
end
VITA_TSF1: begin
- if (reading) state <= READ_HDR;
- in_ticks_reg[31:0] <= in_data0;
+ if (reading) in_state <= READ_HDR;
+ in_ticks_reg[31:0] <= in_data;
end
READ_HDR: begin
- if (reading) state <= READ_DATA;
- in_hdr_reg <= in_data0[31:0];
+ if (reading) in_state <= READ_DATA;
+ in_hdr_reg <= in_data[31:0];
end
READ_DATA: begin
- if (reading) state <= (in_data0[33])? ACTION_EVENT : WAIT_EOF;
- in_data_reg <= in_data0[31:0];
+ if (reading) in_state <= (in_data[33])? STORE_CMD : WAIT_EOF;
+ in_data_reg <= in_data[31:0];
end
WAIT_EOF: begin
- if (reading && in_data0[33]) state <= ACTION_EVENT;
+ if (reading && in_data[33]) in_state <= STORE_CMD;
+ end
+
+ STORE_CMD: begin
+ if (in_command_valid && in_command_ready) in_state <= READ_LINE0;
+ end
+
+ endcase //in_state
+ end
+ end
+
+ //------------------------------------------------------------------
+ //-- Output state machine:
+ //-- Read a command fifo entry, act on it, produce ack packet.
+ //------------------------------------------------------------------
+ localparam LOAD_CMD = 0;
+ localparam WAIT_CMD = 1;
+ localparam ACTION_EVENT = 2;
+ localparam WRITE_PROT_HDR = 3;
+ localparam WRITE_VRT_HDR = 4;
+ localparam WRITE_VRT_SID = 5;
+ localparam WRITE_VRT_TSF0 = 6;
+ localparam WRITE_VRT_TSF1 = 7;
+ localparam WRITE_RB_HDR = 8;
+ localparam WRITE_RB_DATA = 9;
+
+ reg [4:0] out_state;
+
+ //holdover from current read inputs
+ reg [31:0] out_data_reg, out_hdr_reg;
+ reg [63:0] out_ticks_reg;
+
+ assign out_valid = (out_state > ACTION_EVENT);
+
+ assign out_command_ready = (out_state == LOAD_CMD);
+
+ always @(posedge clock) begin
+ if (reset) begin
+ out_state <= LOAD_CMD;
+ end
+ else begin
+ case (out_state)
+
+ LOAD_CMD: begin
+ if (out_command_valid && out_command_ready) begin
+ out_state <= (out_command_has_time)? WAIT_CMD : ACTION_EVENT;
+ out_data_reg <= out_command_data;
+ out_hdr_reg <= out_command_hdr;
+ out_ticks_reg <= out_command_ticks;
+ end
+ end
+
+ WAIT_CMD: begin
+ //TODO wait condition here
+ out_state <= ACTION_EVENT;
end
ACTION_EVENT: begin // poking and peeking happens here!
- state <= WRITE_PROT_HDR;
+ out_state <= WRITE_PROT_HDR;
end
WRITE_RB_DATA: begin
- if (writing) state <= READ_LINE0;
+ if (writing) out_state <= LOAD_CMD;
end
default: begin
- if (writing) state <= state + 1;
+ if (writing) out_state <= out_state + 1;
end
- endcase //state
+ endcase //out_state
end
end
- //readback mux
+ //------------------------------------------------------------------
+ //-- assign to settings bus interface
+ //------------------------------------------------------------------
+ reg strobe_reg;
+ assign strobe = strobe_reg;
+ assign data = out_data_reg;
+ assign addr = out_hdr_reg[7:0];
+ wire poke = out_hdr_reg[8];
+
+ always @(posedge clock) begin
+ if (reset || out_state != ACTION_EVENT) strobe_reg <= 0;
+ else strobe_reg <= poke;
+ end
+
+ //------------------------------------------------------------------
+ //-- readback mux
+ //------------------------------------------------------------------
reg [31:0] rb_data;
reg [63:0] rb_time;
always @(posedge clock) begin
- if (state == ACTION_EVENT) begin
+ if (out_state == ACTION_EVENT) begin
rb_time <= vita_time;
- case (in_addr[3:0])
+ case (addr[3:0])
0 : rb_data <= word00;
1 : rb_data <= word01;
2 : rb_data <= word02;
@@ -234,55 +309,45 @@ module settings_readback_bus_fifo_ctrl
end
end
- //assign protocol framer header
+ //------------------------------------------------------------------
+ //-- assign to output fifo interface
+ //------------------------------------------------------------------
wire [31:0] prot_hdr;
assign prot_hdr[15:0] = 24; //bytes in proceeding vita packet
assign prot_hdr[16] = 1; //yes frame
assign prot_hdr[18:17] = PROT_DEST;
assign prot_hdr[31:19] = 0; //nothing
- //register for output data
reg [31:0] out_data_int;
always @* begin
- case (state)
+ case (out_state)
WRITE_PROT_HDR: out_data_int <= prot_hdr;
- WRITE_VRT_HDR: out_data_int <= {12'b010100000001, in_seq_reg, 16'd6};
+ WRITE_VRT_HDR: out_data_int <= {12'b010100000001, out_hdr_reg[19:16], 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];
- WRITE_RB_HDR: out_data_int <= in_hdr_reg;
+ WRITE_RB_HDR: out_data_int <= out_hdr_reg;
WRITE_RB_DATA: out_data_int <= rb_data;
default: out_data_int <= 0;
endcase //state
end
- //assign to input fifo interface
- assign in_ready0 = (state < ACTION_EVENT);
-
- //assign to output fifo interface
- assign out_valid = (state > ACTION_EVENT);
assign out_data[35:34] = 2'b0;
- assign out_data[33] = (state == WRITE_RB_DATA);
- assign out_data[32] = (state == WRITE_PROT_HDR);
+ assign out_data[33] = (out_state == WRITE_RB_DATA);
+ assign out_data[32] = (out_state == WRITE_PROT_HDR);
assign out_data[31:0] = out_data_int;
- //assign to settings bus interface
- 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
-
+ //------------------------------------------------------------------
+ //-- debug outputs
+ //------------------------------------------------------------------
assign debug = {
- state, strobe, do_poke, strobe_reg, //8
+ in_state, out_state, //8
+ in_valid, in_ready, in_data[33:32], //4
+ out_valid, out_ready, out_data[33:32], //4
+ in_command_valid, in_command_ready, //2
+ out_command_valid, out_command_ready, //2
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],
+ strobe_reg, strobe, poke, out_command_has_time //4
};
endmodule //settings_readback_bus_fifo_ctrl