diff options
Diffstat (limited to 'usrp2/control_lib')
| -rw-r--r-- | usrp2/control_lib/settings_readback_bus_fifo_ctrl.v | 12 | ||||
| -rw-r--r-- | usrp2/control_lib/simple_spi_core.v | 42 | 
2 files changed, 35 insertions, 19 deletions
diff --git a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v index 7219aa6a1..18119d2bd 100644 --- a/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v +++ b/usrp2/control_lib/settings_readback_bus_fifo_ctrl.v @@ -19,6 +19,7 @@  module settings_readback_bus_fifo_ctrl      #( +        parameter NUM_PERFS = 4,          parameter FIFO_DEPTH = 6, //64 entries depth          parameter PROT_DEST = 0 //protocol framer destination      ) @@ -29,6 +30,9 @@ module settings_readback_bus_fifo_ctrl          //current system time          input [63:0] vita_time, +        //ready signals for multiple peripherals +        input [NUM_PERFS-1:0] perfs_ready, +          //input fifo36 interface control          input [35:0] in_data, input in_valid, output in_ready, @@ -244,8 +248,12 @@ module settings_readback_bus_fifo_ctrl      `endif      //action occurs in the event state and when there is fifo space (should always be true) -    //the third condition is that is an event time has been set, action is delayed until that time -    wire action = (cmd_state == EVENT_CMD) && ~result_fifo_full && ((out_command_has_time)? (now || late || clear) : 1); +    //the third condition is that all peripherals in the mask are ready/active high +    //the fourth condition is that is an event time has been set, action is delayed until that time +    wire [NUM_PERFS-1:0] perfs_mask = command_hdr_reg[10+NUM_PERFS-1:10]; +    wire perfs_in_mask_ready = (perfs_ready & perfs_mask) == perfs_mask; +    wire time_ready = (out_command_has_time)? (now || late || clear) : 1; +    wire action = (cmd_state == EVENT_CMD) && ~result_fifo_full && perfs_in_mask_ready && time_ready;      assign command_fifo_read = action;      assign result_fifo_write = action; diff --git a/usrp2/control_lib/simple_spi_core.v b/usrp2/control_lib/simple_spi_core.v index 4772180a7..dbfa5ad8b 100644 --- a/usrp2/control_lib/simple_spi_core.v +++ b/usrp2/control_lib/simple_spi_core.v @@ -50,7 +50,7 @@ module simple_spi_core          parameter WIDTH = 8,          //idle state of the spi clock -        parameter CLK_IDLE = 1, +        parameter CLK_IDLE = 0,          //idle state of the serial enables          parameter SEN_IDLE = 24'hffffff @@ -64,9 +64,9 @@ module simple_spi_core          //32-bit data readback          output [31:0] readback, -         -        //done is high for one cycle after a spi transaction -        output done, + +        //read is high when spi core can begin another transaction +        output ready,          //spi interface, slave selects, clock, data in, data out          output [WIDTH-1:0] sen, @@ -101,23 +101,25 @@ module simple_spi_core      localparam CLK_REG = 2;      localparam CLK_INV = 3;      localparam POST_IDLE = 4; -    localparam TRANS_DONE = 5;      reg [2:0] state; -    assign done = (state == TRANS_DONE); +    assign ready = (state == WAIT_TRIG);      //serial clock either idles or is in one of two clock states -    assign sclk = (state == CLK_INV)? ~CLK_IDLE : (state == CLK_REG)? CLK_IDLE : CLK_IDLE; +    reg sclk_reg; +    assign sclk = sclk_reg;      //serial enables either idle or enabled based on state -    wire [23:0] sen24 = (state == WAIT_TRIG || state == TRANS_DONE)? SEN_IDLE : (SEN_IDLE ^ slave_select); -    assign sen = sen24[WIDTH-1:0]; +    wire [23:0] sen24 = (ready)? SEN_IDLE : (SEN_IDLE ^ slave_select); +    reg [WIDTH-1:0] sen_reg; +    always @(posedge clock) sen_reg <= sen24[WIDTH-1:0]; +    assign sen = sen_reg;      //data output shift register      reg [31:0] dataout_reg; -    wire [31:0] dataout_next = {0, dataout_reg[31:1]}; -    assign mosi = (state == CLK_INV || state == CLK_REG)? dataout_reg[0] : 0; +    wire [31:0] dataout_next = {dataout_reg[30:0], 1'b0}; +    assign mosi = dataout_reg[31];      //data input shift register      reg [31:0] datain_reg; @@ -137,6 +139,7 @@ module simple_spi_core      always @(posedge clock) begin          if (reset) begin              state <= WAIT_TRIG; +            sclk_reg <= CLK_IDLE;          end          else begin              case (state) @@ -144,6 +147,7 @@ module simple_spi_core              WAIT_TRIG: begin                  if (trigger_spi) state <= PRE_IDLE;                  sclk_counter <= 0; +                sclk_reg <= CLK_IDLE;              end              PRE_IDLE: begin @@ -151,13 +155,15 @@ module simple_spi_core                  sclk_counter <= sclk_counter_next;                  dataout_reg <= mosi_data;                  bit_counter <= 0; +                sclk_reg <= CLK_IDLE;              end              CLK_REG: begin                  if (sclk_counter_done) begin                      state <= CLK_INV; -                    if (~datain_edge)  datain_reg  <= datain_next; -                    if (~dataout_edge) dataout_reg <= dataout_next; +                    if (datain_edge  != CLK_IDLE) datain_reg  <= datain_next; +                    if (dataout_edge != CLK_IDLE) dataout_reg <= dataout_next; +                    sclk_reg <= ~CLK_IDLE;                  end                  sclk_counter <= sclk_counter_next;              end @@ -166,15 +172,17 @@ module simple_spi_core                  if (sclk_counter_done) begin                      state <= (bit_counter_done)? POST_IDLE : CLK_REG;                      bit_counter <= bit_counter_next; -                    if (datain_edge)  datain_reg  <= datain_next; -                    if (dataout_edge) dataout_reg <= dataout_next; +                    if (datain_edge  == CLK_IDLE) datain_reg  <= datain_next; +                    if (dataout_edge == CLK_IDLE) dataout_reg <= dataout_next; +                    sclk_reg <= CLK_IDLE;                  end                  sclk_counter <= sclk_counter_next;              end              POST_IDLE: begin -                if (sclk_counter_done) state <= TRANS_DONE; +                if (sclk_counter_done) state <= WAIT_TRIG;                  sclk_counter <= sclk_counter_next; +                sclk_reg <= CLK_IDLE;              end              default: state <= WAIT_TRIG; @@ -185,7 +193,7 @@ module simple_spi_core      assign debug = {          trigger_spi, state, //4 -        sclk, mosi, miso, done, //4 +        sclk, mosi, miso, ready, //4          sen[7:0], //8          1'b0, bit_counter[6:0], //8          sclk_counter_done, bit_counter_done, //2  | 
