forked from M-Labs/artiq-zynq
cxp: add tx trigger packet
This commit is contained in:
parent
a358f1c930
commit
5ed1efc1dc
|
@ -8,6 +8,7 @@ from cxp_pipeline import *
|
||||||
|
|
||||||
class CXP(Module, AutoCSR):
|
class CXP(Module, AutoCSR):
|
||||||
def __init__(self, refclk, downconn_pads, upconn_pads, sys_clk_freq, debug_sma, pmod_pads):
|
def __init__(self, refclk, downconn_pads, upconn_pads, sys_clk_freq, debug_sma, pmod_pads):
|
||||||
|
self.submodules.trig = TX_Trigger(cxp_phy_layout())
|
||||||
|
|
||||||
self.submodules.upconn = UpConn_Interface(upconn_pads, sys_clk_freq, debug_sma, pmod_pads)
|
self.submodules.upconn = UpConn_Interface(upconn_pads, sys_clk_freq, debug_sma, pmod_pads)
|
||||||
|
|
||||||
|
@ -138,30 +139,63 @@ class UpConn_Interface(Module, AutoCSR):
|
||||||
upconn_phy.tx_fifos.sink[2].k.eq(self.symbol2.r[8]),
|
upconn_phy.tx_fifos.sink[2].k.eq(self.symbol2.r[8]),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def K(x, y):
|
||||||
|
return ((y << 5) | x)
|
||||||
|
|
||||||
|
# TODO: move this to cxp_pipeline, since it used K(x, y) :<
|
||||||
class TX_Trigger(Module, AutoCSR):
|
class TX_Trigger(Module, AutoCSR):
|
||||||
def __init__(self):
|
def __init__(self, layout):
|
||||||
# This module is mostly control by gateware
|
# This module is mostly control by gateware
|
||||||
|
|
||||||
self.trig_stb = Signal()
|
self.trig_stb = Signal()
|
||||||
self.delay = Signal(max=240)
|
self.delay = Signal(8) # FIXME: use source instead
|
||||||
|
self.linktrig_mode = Signal(max=4)
|
||||||
self.ack = Signal()
|
|
||||||
|
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
self.submodules.trig_ack = trig_ack = Trigger_ACK(cxp_phy_layout())
|
|
||||||
self.submodules.buf_out = buf_out = stream.SyncFIFO(cxp_phy_layout(), 64)
|
|
||||||
|
|
||||||
tx_pipeline = [ trig_ack, buf_out]
|
self.submodules.code_src = code_src = Code_Source(layout, counts=3)
|
||||||
|
self.comb += [
|
||||||
|
code_src.stb.eq(self.trig_stb),
|
||||||
|
code_src.data.eq(self.delay),
|
||||||
|
code_src.k.eq(0)
|
||||||
|
]
|
||||||
|
|
||||||
|
self.submodules.inserter_once = inserter_once = Code_Inserter(layout, counts=1, insert_infront=False)
|
||||||
|
self.submodules.inserter_twice = inserter_twice = Code_Inserter(layout, counts=2)
|
||||||
|
|
||||||
|
self.comb += [
|
||||||
|
inserter_once.k.eq(1),
|
||||||
|
inserter_twice.k.eq(1),
|
||||||
|
If((self.linktrig_mode == 0) | (self.linktrig_mode == 2),
|
||||||
|
inserter_once.data.eq(K(28, 2)),
|
||||||
|
inserter_twice.data.eq(K(28, 4)),
|
||||||
|
).Else(
|
||||||
|
inserter_once.data.eq(K(28, 4)),
|
||||||
|
inserter_twice.data.eq(K(28, 2)),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
self.submodules.buf_out = buf_out = stream.SyncFIFO(layout, 64)
|
||||||
|
|
||||||
|
tx_pipeline = [ code_src, inserter_twice, inserter_once, buf_out]
|
||||||
|
# tx_pipeline = [ code_src, inserter_twice, buf_out]
|
||||||
|
|
||||||
for s, d in zip(tx_pipeline, tx_pipeline[1:]):
|
for s, d in zip(tx_pipeline, tx_pipeline[1:]):
|
||||||
self.comb += s.source.connect(d.sink)
|
self.comb += s.source.connect(d.sink)
|
||||||
|
|
||||||
|
self.source = tx_pipeline[-1].source
|
||||||
|
|
||||||
|
|
||||||
# DEBUG: INPUT
|
# DEBUG: INPUT
|
||||||
self.ack = CSR()
|
self.stb = CSR()
|
||||||
|
self.trig_delay = CSRStorage(8)
|
||||||
|
self.linktrigger = CSRStorage(2)
|
||||||
|
|
||||||
self.sync += [
|
self.sync += [
|
||||||
trig_ack.ack.eq(self.ack.re),
|
self.trig_stb.eq(self.stb.re),
|
||||||
|
self.delay.eq(self.trig_delay.storage),
|
||||||
|
self.linktrig_mode.eq(self.linktrigger.storage),
|
||||||
]
|
]
|
||||||
|
|
||||||
# DEBUG: OUTPUT
|
# DEBUG: OUTPUT
|
||||||
|
|
Loading…
Reference in New Issue