receiver: allow triggered alignment
This commit is contained in:
parent
1248a46a54
commit
514b649bfc
|
@ -55,6 +55,9 @@ class MultiTransceiverChannel(Module):
|
||||||
self.uart.tx_data.eq(self.tx_fifo.dout),
|
self.uart.tx_data.eq(self.tx_fifo.dout),
|
||||||
self.uart.tx_stb.eq(self.tx_fifo.readable),
|
self.uart.tx_stb.eq(self.tx_fifo.readable),
|
||||||
self.tx_fifo.re.eq(self.uart.tx_ack),
|
self.tx_fifo.re.eq(self.uart.tx_ack),
|
||||||
|
|
||||||
|
# Immediate start RX alignment procedure
|
||||||
|
self.rx.start.eq(1),
|
||||||
]
|
]
|
||||||
|
|
||||||
rx_fsm = FSM(reset_state="WAIT_GROUP_ALIGN")
|
rx_fsm = FSM(reset_state="WAIT_GROUP_ALIGN")
|
||||||
|
|
|
@ -43,6 +43,9 @@ class MultiSerDesLoopBack(Module):
|
||||||
self.uart.tx_data.eq(self.tx_fifo.dout),
|
self.uart.tx_data.eq(self.tx_fifo.dout),
|
||||||
self.uart.tx_stb.eq(self.tx_fifo.readable),
|
self.uart.tx_stb.eq(self.tx_fifo.readable),
|
||||||
self.tx_fifo.re.eq(self.uart.tx_ack),
|
self.tx_fifo.re.eq(self.uart.tx_ack),
|
||||||
|
|
||||||
|
# Just start RX alignment, no reason to wait
|
||||||
|
self.rx.start.eq(1),
|
||||||
]
|
]
|
||||||
|
|
||||||
self.submodules.rx_fsm = FSM(reset_state="WAIT_GROUP_ALIGN")
|
self.submodules.rx_fsm = FSM(reset_state="WAIT_GROUP_ALIGN")
|
||||||
|
|
|
@ -570,6 +570,8 @@ class SyncSingleRX(Module):
|
||||||
# Ports
|
# Ports
|
||||||
# IN: Undelayed serial signal
|
# IN: Undelayed serial signal
|
||||||
self.ser_in_no_dly = Signal()
|
self.ser_in_no_dly = Signal()
|
||||||
|
# IN: Start RX alignment signal
|
||||||
|
self.start = Signal()
|
||||||
# OUT: Received data after self-alignment, decimation
|
# OUT: Received data after self-alignment, decimation
|
||||||
self.rxdata = Signal(5)
|
self.rxdata = Signal(5)
|
||||||
# OUT: RXDATA from this channel is self-aligned
|
# OUT: RXDATA from this channel is self-aligned
|
||||||
|
@ -620,7 +622,7 @@ class SyncSingleRX(Module):
|
||||||
self.submodules.fsm = FSM(reset_state="WAIT_SIGNAL")
|
self.submodules.fsm = FSM(reset_state="WAIT_SIGNAL")
|
||||||
|
|
||||||
self.fsm.act("WAIT_SIGNAL",
|
self.fsm.act("WAIT_SIGNAL",
|
||||||
If(self.rx.rxdata != 0,
|
If((self.rx.rxdata != 0) & self.start,
|
||||||
NextState("WAIT_ALIGNER")
|
NextState("WAIT_ALIGNER")
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -673,6 +675,8 @@ class MultiLineRX(Module):
|
||||||
# Ports
|
# Ports
|
||||||
# IN: Undelayed serial signal
|
# IN: Undelayed serial signal
|
||||||
self.ser_in_no_dly = Signal(4)
|
self.ser_in_no_dly = Signal(4)
|
||||||
|
# IN: Start alignment process of all channels
|
||||||
|
self.start = Signal()
|
||||||
# OUT: Received data after self-alignment, decimation
|
# OUT: Received data after self-alignment, decimation
|
||||||
self.rxdata = Signal(20)
|
self.rxdata = Signal(20)
|
||||||
# OUT: RXDATA from all channels are self-aligned
|
# OUT: RXDATA from all channels are self-aligned
|
||||||
|
@ -693,8 +697,9 @@ class MultiLineRX(Module):
|
||||||
|
|
||||||
self.comb += [
|
self.comb += [
|
||||||
single_rx.ser_in_no_dly.eq(self.ser_in_no_dly[idx]),
|
single_rx.ser_in_no_dly.eq(self.ser_in_no_dly[idx]),
|
||||||
# self.rxdata[5*idx:5*(idx+1)].eq(single_rx.rxdata),
|
|
||||||
channel_align_done[idx].eq(single_rx.align_done),
|
channel_align_done[idx].eq(single_rx.align_done),
|
||||||
|
# Propagate start alignment signal to all channels
|
||||||
|
single_rx.start.eq(self.start),
|
||||||
]
|
]
|
||||||
|
|
||||||
# FIFOs for handling group delay
|
# FIFOs for handling group delay
|
||||||
|
|
Loading…
Reference in New Issue