1
0
Fork 0

cxp: add tx trigger packet

This commit is contained in:
morgan 2024-09-03 11:36:35 +08:00
parent a358f1c930
commit 5ed1efc1dc
1 changed files with 43 additions and 9 deletions

View File

@ -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