6
6
# SPDX-License-Identifier: BSD-2-Clause
7
7
8
8
from migen import *
9
+ from migen .genlib .cdc import MultiReg
9
10
from migen .genlib .resetsync import AsyncResetSynchronizer
10
11
11
12
from litex .gen import *
@@ -505,17 +506,16 @@ def __init__(self, sys_clk_freq, data_timeout):
505
506
# SDCard PHY IO ------------------------------------------------------------------------------------
506
507
507
508
class SDPHYIO (LiteXModule ):
508
- def __init__ (self , clocker , sdpads , round_trip_latency = 2 ):
509
- # Generate a data_i_ce pulse round_trip_latency cycles after clocker.clk goes high so that
510
- # the data input effectively get sampled on the first sys_clk after the SDCard clk goes high.
511
- clocker_clk_delay = Signal (round_trip_latency )
512
- self .sync += clocker_clk_delay . eq ( Cat ( clocker .clk , clocker_clk_delay ))
513
- self .sync += sdpads . data_i_ce . eq (clocker_clk_delay [ - 1 ] & ~ clocker_clk_delay [ - 2 ] )
514
-
509
+ def add_data_i_ce (self , clocker , sdpads ):
510
+ # Sample Data on Sys Clk before SDCard Clk rising edge.
511
+ clk_i = Signal ()
512
+ clk_i_d = Signal ()
513
+ self .specials += MultiReg ( ~ clocker .clk , clk_i , n = 1 , odomain = "sys" ) # n = 1 = SDROutput / SDRTristate delay.
514
+ self .sync += clk_i_d . eq (clk_i )
515
+ self . comb += sdpads . data_i_ce . eq ( clk_i & ~ clk_i_d ) # Rising Edge.
515
516
516
517
class SDPHYIOGen (SDPHYIO ):
517
518
def __init__ (self , clocker , sdpads , pads ):
518
- SDPHYIO .__init__ (self , clocker , sdpads , round_trip_latency = 2 )
519
519
# Rst
520
520
if hasattr (pads , "rst" ):
521
521
self .comb += pads .rst .eq (0 )
@@ -545,6 +545,7 @@ def __init__(self, clocker, sdpads, pads):
545
545
oe = sdpads .data .oe ,
546
546
i = sdpads .data .i [i ],
547
547
)
548
+ self .add_data_i_ce (clocker , sdpads )
548
549
549
550
# Direction (optional)
550
551
if hasattr (pads , "cmd_dir" ):
@@ -570,7 +571,6 @@ def __init__(self, clocker, sdpads, pads):
570
571
571
572
class SDPHYIOEmulator (SDPHYIO ):
572
573
def __init__ (self , clocker , sdpads , pads ):
573
- SDPHYIO .__init__ (self , clocker , sdpads , round_trip_latency = 2 ) # FIXME: check round_trip_latency.
574
574
# Clk
575
575
self .comb += pads .clk .eq (clocker .clk )
576
576
@@ -588,6 +588,7 @@ def __init__(self, clocker, sdpads, pads):
588
588
If (sdpads .data .oe , pads .dat_i .eq (sdpads .data .o )),
589
589
sdpads .data .i .eq (0b1111 ),
590
590
]
591
+ self .data_i_ce (clocker , sdpads )
591
592
for i in range (4 ):
592
593
self .comb += If (~ pads .dat_t [i ], sdpads .data .i [i ].eq (pads .dat_o [i ]))
593
594
0 commit comments