artiq/soc/artiqlib/rtio/phy.py

31 lines
986 B
Python
Raw Normal View History

from migen.fhdl.std import *
from migen.genlib.cdc import MultiReg
2014-07-26 06:23:35 +08:00
from artiqlib.rtio.rbus import create_rbus
2014-09-05 12:03:22 +08:00
2014-07-26 06:23:35 +08:00
class SimplePHY(Module):
2014-09-05 12:03:22 +08:00
def __init__(self, pads, output_only_pads=set()):
self.rbus = create_rbus(0, pads, output_only_pads)
self.loopback_latency = 3
2014-09-05 12:03:22 +08:00
# # #
2014-07-26 06:23:35 +08:00
2014-09-05 12:03:22 +08:00
for pad, chif in zip(pads, self.rbus):
o_pad = Signal()
self.sync += If(chif.o_stb, o_pad.eq(chif.o_value))
if pad in output_only_pads:
self.comb += pad.eq(o_pad)
else:
ts = TSTriple()
i_pad = Signal()
self.sync += ts.oe.eq(chif.oe)
self.comb += ts.o.eq(o_pad)
self.specials += MultiReg(ts.i, i_pad), \
ts.get_tristate(pad)
2014-09-05 12:03:22 +08:00
i_pad_d = Signal()
self.sync += i_pad_d.eq(i_pad)
self.comb += chif.i_stb.eq(i_pad ^ i_pad_d), \
chif.i_value.eq(i_pad)