3
3
4
4
from migen import *
5
5
from migen .genlib .fsm import *
6
- from migen .genlib .cdc import MultiReg , PulseSynchronizer
6
+ from migen .genlib .cdc import MultiReg
7
7
from migen .genlib .misc import WaitTimer
8
8
9
9
from misoc .interconnect .csr import *
@@ -223,11 +223,8 @@ def __init__(self, decoders):
223
223
class LinkLayer (Module , AutoCSR ):
224
224
def __init__ (self , encoder , decoders ):
225
225
self .link_status = CSRStatus ()
226
- self .link_reset = CSR ()
227
226
228
- # pulsed to reset receiver, rx_ready must immediately go low
229
- self .rx_reset = Signal ()
230
- # receiver locked including comma alignment
227
+ # receiver locked, comma aligned, receiving valid 8b10b symbols
231
228
self .rx_ready = Signal ()
232
229
233
230
tx = ClockDomainsRenamer ("rtio" )(LinkLayerTX (encoder ))
@@ -251,45 +248,30 @@ def __init__(self, encoder, decoders):
251
248
# # #
252
249
253
250
ready = Signal ()
254
- reset_ps = PulseSynchronizer ("sys" , "rtio" )
255
- done_ps = PulseSynchronizer ("rtio" , "sys" )
256
- self .submodules += reset_ps , done_ps
257
- self .comb += reset_ps .i .eq (self .link_reset .re )
258
- self .sync += [
259
- If (done_ps .o , ready .eq (1 )),
260
- If (reset_ps .i , ready .eq (0 )),
261
- ]
262
- self .comb += self .link_status .status .eq (ready )
263
-
251
+ ready_r = Signal ()
252
+ self .sync .rtio += ready_r .eq (ready )
264
253
ready_rx = Signal ()
265
- ready .attr .add ("no_retiming" )
266
- self .specials += MultiReg (ready , ready_rx , "rtio_rx" )
254
+ ready_r .attr .add ("no_retiming" )
255
+ self .specials += MultiReg (ready_r , ready_rx , "rtio_rx" )
267
256
self .comb += [
268
257
self .rx_aux_frame .eq (rx .aux_frame & ready_rx ),
269
258
self .rx_rt_frame .eq (rx .rt_frame & ready_rx ),
270
259
]
260
+ self .specials += MultiReg (ready_r , self .link_status .status )
271
261
272
262
wait_scrambler = ClockDomainsRenamer ("rtio" )(WaitTimer (15 ))
273
263
self .submodules += wait_scrambler
274
264
275
- fsm = ClockDomainsRenamer ("rtio" )(FSM (reset_state = "RESET_RX " ))
265
+ fsm = ClockDomainsRenamer ("rtio" )(FSM (reset_state = "WAIT_RX_READY " ))
276
266
self .submodules += fsm
277
267
278
- fsm .act ("RESET_RX" ,
279
- self .rx_reset .eq (1 ),
280
- NextState ("WAIT_RX_READY" )
281
- )
282
268
fsm .act ("WAIT_RX_READY" ,
283
- If (self .rx_ready , NextState ("WAIT_SCRAMBLER_SYNC" )),
284
- If (reset_ps .o , NextState ("RESET_RX" ))
269
+ If (self .rx_ready , NextState ("WAIT_SCRAMBLER_SYNC" ))
285
270
)
286
271
fsm .act ("WAIT_SCRAMBLER_SYNC" ,
287
272
wait_scrambler .wait .eq (1 ),
288
- If (wait_scrambler .done ,
289
- done_ps .i .eq (1 ),
290
- NextState ("READY" )
291
- )
273
+ If (wait_scrambler .done , NextState ("READY" ))
292
274
)
293
275
fsm .act ("READY" ,
294
- If ( reset_ps . o , NextState ( "RESET_RX" ) )
276
+ ready . eq ( 1 )
295
277
)
0 commit comments