class JTAGTransport(wiring.Component): input: wiring.In(stream.Signature(8)) output: wiring.Out(stream.Signature(8)) def elaborate(self, platform): m = Module() m.domains += ClockDomain('jtag', reset_less = True) m.submodules.output_fifo = output_fifo = fifo.AsyncFIFO(width = 8, depth = 4, w_domain = 'sync', r_domain = 'jtag') wiring.connect(m, wiring.flipped(self.input), output_fifo.w_stream) m.submodules.input_fifo = input_fifo = fifo.AsyncFIFO(width = 8, depth = 4, w_domain = 'jtag', r_domain = 'sync') wiring.connect(m, input_fifo.r_stream, wiring.flipped(self.output)) jtdi = Signal() jtdi_reg = Signal() jce1 = Signal() jtdo1 = Signal() m.d.jtag += jtdi_reg.eq(jtdi) # Input state machine input_state = Signal(range(9)) m.d.jtag += input_fifo.w_stream.valid.eq(0) with m.If(jce1): with m.Switch(input_state): with m.Case(0): with m.If(jtdi_reg): m.d.jtag += input_state.eq(1) for i in range(8): with m.Case(i + 1): m.d.jtag += input_fifo.w_stream.payload[i].eq(jtdi_reg) m.d.jtag += input_state.eq(input_state + 1) if i == 7: m.d.jtag += input_fifo.w_stream.valid.eq(1) m.d.jtag += input_state.eq(0) with m.Else(): m.d.jtag += input_state.eq(0) # Output state machine output_state = Signal(range(10)) with m.If(jce1): with m.Switch(output_state): # Inactive/preparing state with m.Case(0): m.d.jtag += output_state.eq(1) # Ready state with m.Case(1): #m.d.comb += output_fifo.r_stream.ready.eq(1) with m.If(output_fifo.r_stream.valid): m.d.comb += jtdo1.eq(1) m.d.jtag += output_state.eq(2) # Outputting state for i in range(8): with m.Case(i + 2): m.d.comb += jtdo1.eq(output_fifo.r_stream.payload[i]) m.d.jtag += output_state.eq(output_state + 1) if i == 7: m.d.comb += output_fifo.r_stream.ready.eq(1) m.d.jtag += output_state.eq(1) with m.Else(): m.d.jtag += output_state.eq(0) m.submodules.jtagg = jtagg = Instance('JTAGG', o_JTCK = ClockSignal('jtag'), o_JTDI = jtdi, o_JCE1 = jce1, i_JTDO1 = jtdo1, ) return m