diff --git a/logical/qspi_controller/logical/qspi_controller.sv b/logical/qspi_controller/logical/qspi_controller.sv index 404850dfe7097d5aeb33c642f6ca5d07ff615e6e..ae4ef8a78091b877e401cbe47e25cff9cc6b861a 100644 --- a/logical/qspi_controller/logical/qspi_controller.sv +++ b/logical/qspi_controller/logical/qspi_controller.sv @@ -60,7 +60,7 @@ always @(posedge HCLK or negedge HRESETn) begin end end -enum {IDLE, OP, ADDR, MODE, DUMMY, DATA_O, DATA_I} current_state, next_state; +enum {IDLE, NO_FETCH, OP, ADDR, MODE, DUMMY, DATA_O, DATA_I} current_state, next_state; reg [2:0] op_counter; reg [4:0] addr_counter; @@ -72,7 +72,8 @@ reg [7:0] op_code; reg [23:0] addr_code; reg [7:0] qspi_mode_reg; reg [3:0] QSPI_IO_o_reg; -reg [127:0] data_in_reg; +reg [127:0] data_in_reg; +reg [21:0] last_QSPI_ADDR; reg [127:0] QSPI_WDATA_reg; @@ -92,13 +93,21 @@ always @(*) begin if(QSPI_ENABLE==1'b1 && QSPI_NO_CMD==1'b0) begin next_state = OP; end else if(QSPI_ENABLE==1'b1 && QSPI_NO_CMD==1'b1) begin - next_state = ADDR; + if(last_QSPI_ADDR==QSPI_ADDR) + next_state = NO_FETCH; + else + next_state = ADDR; end else begin next_state = IDLE; QSPI_ENABLE_ACK = 1'b0; end //op_counter=3'h0; end + NO_FETCH: begin + QSPI_ENABLE_ACK = 1'b1; + if(QSPI_ENABLE==1'b0) + next_state = IDLE; + end OP: begin QSPI_ENABLE_ACK = 1'b1; if(QSPI_QIO_MODE==1'b1 & op_counter==3'h1) begin @@ -132,6 +141,7 @@ always @(*) begin QSPI_ENABLE_ACK = 1'b1; if(QSPI_QIO_MODE==1'b1 & addr_counter==5'h05) begin QSPI_ENABLE_ACK = 1'b0; + last_QSPI_ADDR = QSPI_ADDR; if(QSPI_CONT_READ) next_state = MODE; else if(QSPI_DUMMY_CYCLES>4'h0)