diff --git a/hw/efinix_fpga/src/sdram_adapter.sv b/hw/efinix_fpga/src/sdram_adapter.sv
index c3c78221de98d2744ba5c51326cbb23c5bd5e9c1..be3c8165dbd90d836164e773bf59ffa6bf8df48f 100644
--- a/hw/efinix_fpga/src/sdram_adapter.sv
+++ b/hw/efinix_fpga/src/sdram_adapter.sv
@@ -73,7 +73,8 @@ assign o_sdr_DQM = w_sdr_DQM[0+:2];
 enum bit [2:0] {ACCESS, PRE_READ, READ_WAIT, PRE_WRITE, WRITE_WAIT, WAIT} state, next_state;
 
 logic w_read, w_write, w_last;
-logic [23:0] w_addr, r_addr;
+logic [23:0] w_read_addr, w_write_addr;
+logic [23:0] r_read_addr, r_write_addr;
 logic [31:0] w_data_i, w_data_o;
 logic [3:0] w_dm, r_dm;
 
@@ -88,9 +89,13 @@ logic [1:0] counter, next_counter;
 
 logic [7:0] o_data_next;
 
+logic [23:0] addr_mux_out;
+
+logic slow_mem;
+
 logic r_wait;
 logic _r_wait;
-assign o_wait = r_wait & i_cs;
+assign o_wait = (r_wait | slow_mem) & i_cs;
 
 // we need to assert rdy low until a falling edge if a reset happens
 
@@ -120,7 +125,8 @@ always @(posedge i_sysclk or posedge i_arst) begin
         state <= next_state;
         counter <= next_counter;
         r_write_data <= w_data_i;
-        r_addr <= w_addr;
+        r_read_addr <= w_read_addr;
+        r_write_addr <= w_write_addr;
         r_dm <= w_dm;
     end
 
@@ -156,10 +162,12 @@ end
 
 
 always_comb begin
+    slow_mem = '0;
     next_state = state;
     next_counter = counter;
     
-    w_addr = '0;
+    w_read_addr = '0;
+    w_write_addr = '0;
     w_dm = '0;
     w_read = '0;
     w_write = '0;
@@ -167,24 +175,19 @@ always_comb begin
     w_data_i = '0;
     w_data_valid = '0;
     _data = 0;
-
-    if (w_data_valid) begin
-        o_data_next = _data;
-    end else begin
-        o_data_next = o_data;
-    end
     
     unique case (state)
     WAIT: begin
-        if (i_cs & i_cpuclk)
+        if (i_cs & ~i_cpuclk)
             next_state = ACCESS;
     end
     
     ACCESS: begin
         // only do something if selected
         if (i_cs) begin
-            w_addr = {{i_addr[24:2]}, {1'b0}};  // divide by 2, set last bit to 0
-            
+            w_read_addr = {{i_addr[24:2]}, {1'b0}};  // divide by 2, set last bit to 0
+            w_write_addr = {{i_addr[24:2]}, {1'b0}};  // divide by 2, set last bit to 0
+            addr_mux_out = w_read_addr;
             if (i_rwb) begin    //read
                 next_state = PRE_READ;
             end else begin      //write
@@ -197,6 +200,8 @@ always_comb begin
 
     PRE_WRITE: begin
         w_data_i = r_write_data;
+        w_write_addr = r_write_addr;
+        addr_mux_out = w_write_addr;
         w_dm = r_dm;
         //w_data_i = {4{i_data}}; //does anything get through?
         if (~i_cpuclk) begin
@@ -208,43 +213,46 @@ always_comb begin
 
     WRITE_WAIT: begin                
         // stay in this state until write is acknowledged.
+        w_write_addr = r_write_addr;
+        addr_mux_out = w_write_addr;
         w_write = '1;
         w_last = '1;
         w_data_i = r_write_data;
         w_dm = r_dm;
-        w_addr = r_addr;
         if (w_wr_ack) next_state = WAIT;
     end
 
     PRE_READ: begin
+        w_read_addr = r_read_addr;
+        addr_mux_out = w_read_addr;
         w_read = '1;
         w_last = '1;
+        slow_mem = '1;
         // dm is not needed for reads?
         if (w_rd_ack) next_state = READ_WAIT;
     end
     
     READ_WAIT: begin
+        w_read_addr = r_read_addr;
+        addr_mux_out = w_read_addr;
+        slow_mem = '1;
         if (w_rd_valid) begin
             w_data_valid = '1;
             _data = w_data_o[8*i_addr[1:0]+:8];
         end
 
         // you must wait until the next cycle!
-        if (~i_cpuclk) begin
+        if (w_data_valid) begin
             next_state = WAIT;
         end
     end
     
     endcase
-end
 
-//this seems scuffed
-logic [23:0] addr_mux_out;
-always_comb begin
-    if (state == ACCESS) begin
-        addr_mux_out = w_addr;
+    if (w_data_valid) begin
+        o_data_next = _data;
     end else begin
-        addr_mux_out = r_addr;
+        o_data_next = o_data;
     end
 end