targets: add de0nano (100MHz, integrated bios and SDRAM)
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Feb 2015 18:21:58 +0000 (19:21 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Fri, 27 Feb 2015 18:47:32 +0000 (19:47 +0100)
targets/de0nano.py [new file with mode: 0644]

diff --git a/targets/de0nano.py b/targets/de0nano.py
new file mode 100644 (file)
index 0000000..6c9e56f
--- /dev/null
@@ -0,0 +1,112 @@
+from migen.fhdl.std import *
+from migen.bus import wishbone
+
+from misoclib import uart, gpio, sdram
+from misoclib.sdram.phy import gensdrphy
+from misoclib.gensoc import SDRAMSoC
+
+class _PLL(Module):
+       def __init__(self, period_in, name, phase_shift, operation_mode):
+               self.clk_in = Signal()
+               self.clk_out = Signal()
+
+               self.specials += Instance("ALTPLL",
+                       p_bandwidth_type = "AUTO",
+                       p_clk0_divide_by = 1,
+                       p_clk0_duty_cycle = 50,
+                       p_clk0_multiply_by = 2,
+                       p_clk0_phase_shift = "{}".format(str(phase_shift)),
+                       p_compensate_clock = "CLK0",
+                       p_inclk0_input_frequency = int(period_in*1000),
+                       p_intended_device_family = "Cyclone IV E",
+                       p_lpm_hint = "CBX_MODULE_PREFIX={}_pll".format(name),
+                       p_lpm_type = "altpll",
+                       p_operation_mode = operation_mode,
+                       i_inclk=self.clk_in,
+                       o_clk=self.clk_out,
+                       i_areset=0,
+                       i_clkena=0x3f,
+                       i_clkswitch=0,
+                       i_configupdate=0,
+                       i_extclkena=0xf,
+                       i_fbin=1,
+                       i_pfdena=1,
+                       i_phasecounterselect=0xf,
+                       i_phasestep=1,
+                       i_phaseupdown=1,
+                       i_pllena=1,
+                       i_scanaclr=0,
+                       i_scanclk=0,
+                       i_scanclkena=1,
+                       i_scandata=0,
+                       i_scanread=0,
+                       i_scanwrite=0
+               )
+
+class _CRG(Module):
+       def __init__(self, platform):
+               self.clock_domains.cd_sys = ClockDomain()
+               self.clock_domains.cd_sys_ps = ClockDomain()
+               self.clock_domains.cd_por = ClockDomain(reset_less=True)
+
+               clk50 = platform.request("clk50")
+
+               sys_pll = _PLL(20, "sys", 0, "NORMAL")
+               self.submodules += sys_pll
+               self.comb += [
+                       sys_pll.clk_in.eq(clk50),
+                       self.cd_sys.clk.eq(sys_pll.clk_out)
+               ]
+
+               sdram_pll = _PLL(20, "sdram", -3000, "ZERO_DELAY_BUFFER")
+               self.submodules += sdram_pll
+               self.comb += [
+                       sdram_pll.clk_in.eq(clk50),
+                       self.cd_sys_ps.clk.eq(sdram_pll.clk_out)
+               ]
+
+               # Power on Reset (vendor agnostic)
+               rst_n = Signal()
+               self.sync.por += rst_n.eq(1)
+               self.comb += [
+                       self.cd_por.clk.eq(self.cd_sys.clk),
+                       self.cd_sys.rst.eq(~rst_n),
+                       self.cd_sys_ps.rst.eq(~rst_n)
+               ]
+
+               self.comb += platform.request("sdram_clock").eq(self.cd_sys_ps.clk)
+
+class BaseSoC(SDRAMSoC):
+       default_platform = "de0nano"
+
+       def __init__(self, platform, **kwargs):
+               SDRAMSoC.__init__(self, platform,
+                       clk_freq=100*1000000,
+                       with_rom=True,
+                       **kwargs)
+
+               sdram_geom = sdram.GeomSettings(
+                       bank_a=2,
+                       row_a=13,
+                       col_a=9
+               )
+
+               sdram_timing = sdram.TimingSettings(
+                       tRP=self.ns(20),
+                       tRCD=self.ns(20),
+                       tWR=self.ns(20),
+                       tWTR=2,
+                       tREFI=self.ns(7800, False),
+                       tRFC=self.ns(70),
+
+                       req_queue_size=8,
+                       read_time=32,
+                       write_time=16
+               )
+
+               self.submodules.crg = _CRG(platform)
+
+               self.submodules.sdrphy = gensdrphy.GENSDRPHY(platform.request("sdram"))
+               self.register_sdram_phy(self.sdrphy.dfi, self.sdrphy.phy_settings, sdram_geom, sdram_timing)
+
+default_subtarget = BaseSoC