Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # This file is Copyright (c) 2018-2019 Florent Kermarrec <florent@enjoy-digital.fr>
- # This file is Copyright (c) 2018-2019 David Shah <dave@ds0.me>
- # License: BSD
- import argparse
- from migen import *
- from migen.genlib.resetsync import AsyncResetSynchronizer
- from litex.boards.platforms import pcmcia
- from litex.build.lattice.trellis import trellis_args, trellis_argdict
- from litex.soc.cores.clock import *
- from litex.soc.integration.soc_sdram import *
- from litex.soc.integration.builder import *
- from litedram.modules import MT41J128M16
- from litedram.phy import ECP5DDRPHY
- # CRG ----------------------------------------------------------------------------------------------
- class _CRG(Module):
- def __init__(self, platform, sys_clk_freq):
- self.clock_domains.cd_init = ClockDomain()
- self.clock_domains.cd_por = ClockDomain(reset_less=True)
- self.clock_domains.cd_sys = ClockDomain()
- self.clock_domains.cd_sys2x = ClockDomain()
- self.clock_domains.cd_sys2x_i = ClockDomain(reset_less=True)
- # # #
- self.stop = Signal()
- #clkosc = Signal()
- # PLL and HDMI TX init
- #self.platform.add_source("/home/claude/gateware/i2c_top.v")
- #self.platform.add_source("/home/claude/litex/gateware/i2c_init.v")
- #self.platform.add_source("/home/claude/litex/gateware/i2c_master.v")
- sda = platform.request("sda")
- scl = platform.request("scl")
- self.specials += [
- Instance("i2c_top",
- io_sda=sda,
- io_sdc=scl
- )
- ]
- self.platform.add_source("/home/claude/gateware/i2c_top.v")
- # Clk / Rst
- clk100 = platform.request("clk100")
- rst_n = platform.request("rst_n")
- platform.add_period_constraint(clk100, 1e9/25e6)
- # Power on reset
- por_count = Signal(16, reset=2**16-1)
- por_done = Signal()
- self.comb += self.cd_por.clk.eq(ClockSignal())
- self.comb += por_done.eq(por_count == 0)
- self.sync.por += If(~por_done, por_count.eq(por_count - 1))
- # PLL
- self.submodules.pll = pll = ECP5PLL()
- pll.register_clkin(clk100, 25e6)
- pll.create_clkout(self.cd_sys2x_i, 2*sys_clk_freq)
- pll.create_clkout(self.cd_init, 20.2e6)
- self.specials += [
- Instance("ECLKSYNCB",
- i_ECLKI = self.cd_sys2x_i.clk,
- i_STOP = self.stop,
- o_ECLKO = self.cd_sys2x.clk),
- Instance("CLKDIVF",
- p_DIV = "2.0",
- i_ALIGNWD = 0,
- i_CLKI = self.cd_sys2x.clk,
- i_RST = self.cd_sys2x.rst,
- o_CDIVX = self.cd_sys.clk),
- #Instance("OSCG",
- # p_DIV = "16",
- # o_OSC = clkosc),
- AsyncResetSynchronizer(self.cd_init, ~por_done | ~pll.locked | ~rst_n),
- AsyncResetSynchronizer(self.cd_sys, ~por_done | ~pll.locked | ~rst_n)
- ]
- # BaseSoC ------------------------------------------------------------------------------------------
- class BaseSoC(SoCSDRAM):
- def __init__(self, sys_clk_freq=int(75e6), toolchain="trellis", **kwargs):
- platform = pcmcia.Platform(toolchain=toolchain)
- # SoCSDRAM ---------------------------------------------------------------------------------
- SoCSDRAM.__init__(self, platform, clk_freq=sys_clk_freq, **kwargs)
- # CRG --------------------------------------------------------------------------------------
- self.submodules.crg = _CRG(platform, sys_clk_freq)
- # DDR3 SDRAM -------------------------------------------------------------------------------
- if not self.integrated_main_ram_size:
- self.submodules.ddrphy = ECP5DDRPHY(
- platform.request("ddram"),
- sys_clk_freq=sys_clk_freq)
- self.add_csr("ddrphy")
- self.add_constant("ECP5DDRPHY", None)
- self.comb += self.crg.stop.eq(self.ddrphy.init.stop)
- sdram_module = MT41J128M16(sys_clk_freq, "1:2")
- self.register_sdram(self.ddrphy,
- geom_settings = sdram_module.geom_settings,
- timing_settings = sdram_module.timing_settings)
- # Build --------------------------------------------------------------------------------------------
- def main():
- parser = argparse.ArgumentParser(description="LiteX SoC on PCMCIA")
- parser.add_argument("--gateware-toolchain", dest="toolchain", default="trellis",
- help='gateware toolchain to use, diamond (default) or trellis')
- builder_args(parser)
- soc_sdram_args(parser)
- trellis_args(parser)
- parser.add_argument("--sys-clk-freq", default=75e6,
- help="system clock frequency (default=75MHz)")
- args = parser.parse_args()
- cls = BaseSoC
- soc = cls(toolchain=args.toolchain, sys_clk_freq=int(float(args.sys_clk_freq)), **soc_sdram_argdict(args))
- builder = Builder(soc, **builder_argdict(args))
- builder_kargs = {}
- if args.toolchain == "trellis":
- builder_kargs == trellis_argdict(args)
- builder.build(**builder_kargs)
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement