fsm.act("IDLE",
             NextValue(counter, 0),
             If(master.stb & master.cyc,
-                If(master.we,
-                    NextState("WRITE")
-                ).Else(
-                    NextState("READ")
-                )
+                NextState("CONVERT"),
             )
         )
-        fsm.act("WRITE",
+        fsm.act("CONVERT",
             slave.adr.eq(Cat(counter, master.adr)),
-            slave.we.eq(1),
-            slave.cyc.eq(1),
+            Case(counter, {i: slave.sel.eq(master.sel[i*dw_to//8:]) for i in range(ratio)}),
             If(master.stb & master.cyc,
-                slave.stb.eq(1),
-                If(slave.ack,
-                    NextValue(counter, counter + 1),
-                    If(counter == (ratio - 1),
-                        master.ack.eq(1),
-                        NextState("IDLE")
-                    )
-                )
-            )
-        )
-        fsm.act("READ",
-            slave.adr.eq(Cat(counter, master.adr)),
-            slave.cyc.eq(1),
-            If(master.stb & master.cyc,
-                slave.stb.eq(1),
-                If(slave.ack,
+                If(slave.sel != 0,
+                    slave.we.eq(master.we),
+                    slave.cyc.eq(1),
+                    slave.stb.eq(1),
+                ),
+                If(slave.ack | (slave.sel == 0),
                     NextValue(counter, counter + 1),
                     If(counter == (ratio - 1),
                         master.ack.eq(1),
         )
 
         # Write Datapath
-        cases = {}
-        for i in range(ratio):
-            cases[i] = [
-                slave.sel.eq(master.sel[i*dw_to//8:]),
-                slave.dat_w.eq(master.dat_w[i*dw_to:]),
-            ]
-        self.comb += Case(counter, cases)
+        self.comb += Case(counter, {i: slave.dat_w.eq(master.dat_w[i*dw_to:]) for i in range(ratio)})
 
         # Read Datapath
         dat_r = Signal(dw_from, reset_less=True)