forked from M-Labs/artiq-zynq
downconn GW: fix tx not sending comma for long pak
This commit is contained in:
parent
26500e620c
commit
472e98be34
|
@ -106,7 +106,7 @@ class CXP_DownConn_PHY(Module, AutoCSR):
|
||||||
# DEBUG: remove cdc fifo
|
# DEBUG: remove cdc fifo
|
||||||
# gtx rx -> fifo out -> cdc out
|
# gtx rx -> fifo out -> cdc out
|
||||||
|
|
||||||
fifo_out = stream.AsyncFIFO(downconn_layout, 128)
|
fifo_out = stream.AsyncFIFO(downconn_layout, 512)
|
||||||
self.submodules += ClockDomainsRenamer({"write": "cxp_gtx_rx", "read": "sys"})(fifo_out)
|
self.submodules += ClockDomainsRenamer({"write": "cxp_gtx_rx", "read": "sys"})(fifo_out)
|
||||||
self.sources.append(fifo_out)
|
self.sources.append(fifo_out)
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ class CXP_DownConn_PHY(Module, AutoCSR):
|
||||||
# DEBUG: datain
|
# DEBUG: datain
|
||||||
# fw -> fifo (sys) -> cdc fifo -> gtx tx
|
# fw -> fifo (sys) -> cdc fifo -> gtx tx
|
||||||
|
|
||||||
fifo_in = stream.AsyncFIFO(downconn_layout, 128)
|
fifo_in = stream.AsyncFIFO(downconn_layout, 512)
|
||||||
self.submodules += ClockDomainsRenamer({"write": "sys", "read": "cxp_gtx_tx"})(fifo_in)
|
self.submodules += ClockDomainsRenamer({"write": "sys", "read": "cxp_gtx_tx"})(fifo_in)
|
||||||
self.sinks.append(fifo_in)
|
self.sinks.append(fifo_in)
|
||||||
|
|
||||||
|
@ -173,16 +173,28 @@ class CXP_DownConn_PHY(Module, AutoCSR):
|
||||||
txstb = Signal()
|
txstb = Signal()
|
||||||
self.specials += MultiReg(self.tx_stb.storage, txstb, odomain="cxp_gtx_tx")
|
self.specials += MultiReg(self.tx_stb.storage, txstb, odomain="cxp_gtx_tx")
|
||||||
|
|
||||||
|
word_count = Signal(max=100)
|
||||||
|
|
||||||
|
# JANK: fix the every 98th word got eaten
|
||||||
|
# cnt 97 98 99 0
|
||||||
|
# out fifo[97] IDLE IDLE fifo[99]
|
||||||
|
# ack 1 0 0 1
|
||||||
self.sync.cxp_gtx_tx += [
|
self.sync.cxp_gtx_tx += [
|
||||||
fifo_in.source.ack.eq(0),
|
fifo_in.source.ack.eq(0),
|
||||||
If(fifo_in.source.stb & txstb,
|
|
||||||
fifo_in.source.ack.eq(1),
|
If(word_count == 99,
|
||||||
|
word_count.eq(word_count.reset),
|
||||||
|
).Else(
|
||||||
|
If(fifo_in.source.stb & txstb,
|
||||||
|
If(word_count != 98, fifo_in.source.ack.eq(1)),
|
||||||
|
word_count.eq(word_count + 1),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
# NOTE: prevent the first word send twice due to stream stb delay
|
# NOTE: prevent the first word send twice due to stream stb delay
|
||||||
self.comb += [
|
self.comb += [
|
||||||
If(fifo_in.source.stb & fifo_in.source.ack,
|
If((fifo_in.source.stb & fifo_in.source.ack & (word_count != 99)),
|
||||||
gtx.encoder.d[0].eq(fifo_in.source.data[:8]),
|
gtx.encoder.d[0].eq(fifo_in.source.data[:8]),
|
||||||
gtx.encoder.d[1].eq(fifo_in.source.data[8:16]),
|
gtx.encoder.d[1].eq(fifo_in.source.data[8:16]),
|
||||||
gtx.encoder.d[2].eq(fifo_in.source.data[16:24]),
|
gtx.encoder.d[2].eq(fifo_in.source.data[16:24]),
|
||||||
|
|
Loading…
Reference in New Issue