from liteeth.phy.rmii import LiteEthPHYRMII
from liteeth.mac import LiteEthMAC
+from litesdcard.phy import SDPHY
+from litesdcard.clocker import SDClockerS7
+from litesdcard.core import SDCore
+from litesdcard.bist import BISTBlockGenerator, BISTBlockChecker
+from litex.soc.cores.timer import Timer
+
# CRG ----------------------------------------------------------------------------------------------
class _CRG(Module):
self.clock_domains.cd_sys2x_dqs = ClockDomain(reset_less=True)
self.clock_domains.cd_clk200 = ClockDomain()
self.clock_domains.cd_eth = ClockDomain()
+ self.clock_domains.cd_sdcard = ClockDomain(reset_less=True)
# # #
+ self.sd_clk_freq = int(100e6)
+
self.submodules.pll = pll = S7MMCM(speedgrade=-1)
self.comb += pll.reset.eq(~platform.request("cpu_reset"))
pll.register_clkin(platform.request("clk100"), 100e6)
pll.create_clkout(self.cd_sys2x_dqs, 2*sys_clk_freq, phase=90)
pll.create_clkout(self.cd_clk200, 200e6)
pll.create_clkout(self.cd_eth, 50e6)
+ pll.create_clkout(self.cd_sdcard, self.sd_clk_freq)
self.submodules.idelayctrl = S7IDELAYCTRL(self.cd_clk200)
self.ethphy.crg.cd_eth_rx.clk,
self.ethphy.crg.cd_eth_tx.clk)
+ def add_sdcard(self):
+ sdcard_pads = self.platform.request("sdcard")
+ self.comb += sdcard_pads.rst.eq(0)
+ self.submodules.sdclk = SDClockerS7(clkin=ClockSignal("sdcard"), clkin_freq=self.crg.sd_clk_freq)
+ self.submodules.sdphy = SDPHY(sdcard_pads, self.platform.device)
+ self.submodules.sdcore = SDCore(self.sdphy)
+ self.submodules.sdtimer = Timer()
+ self.add_csr("sdclk")
+ self.add_csr("sdphy")
+ self.add_csr("sdcore")
+ self.add_csr("sdtimer")
+
+ self.submodules.bist_generator = BISTBlockGenerator(random=True)
+ self.submodules.bist_checker = BISTBlockChecker(random=True)
+ self.add_csr("bist_generator")
+ self.add_csr("bist_checker")
+ self.comb += [
+ self.sdcore.source.connect(self.bist_checker.sink),
+ self.bist_generator.source.connect(self.sdcore.sink)
+ ]
+ self.platform.add_period_constraint(self.sdclk.cd_sd.clk, period_ns(self.crg.sd_clk_freq))
+ self.platform.add_period_constraint(self.sdclk.cd_sd_fb.clk, period_ns(self.crg.sd_clk_freq))
+ self.platform.add_false_path_constraints(
+ self.crg.cd_sys.clk,
+ self.sdclk.cd_sd.clk,
+ self.sdclk.cd_sd_fb.clk)
+
# Build --------------------------------------------------------------------------------------------
def main():
help="system clock frequency (default=75MHz)")
parser.add_argument("--with-ethernet", action="store_true",
help="enable Ethernet support")
+ parser.add_argument("--with-sdcard", action="store_true",
+ help="enable SDCard support")
args = parser.parse_args()
soc = BaseSoC(sys_clk_freq=int(float(args.sys_clk_freq)), **soc_sdram_argdict(args))
if args.with_ethernet:
soc.add_ethernet()
+ if args.with_sdcard:
+ soc.add_sdcard()
builder = Builder(soc, **builder_argdict(args))
builder.build()