1 from fractions
import Fraction
3 from migen
.fhdl
.std
import *
4 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
6 from misoclib
.mem
.sdram
.module
import MT48LC4M16
7 from misoclib
.mem
.sdram
.phy
import gensdrphy
8 from misoclib
.mem
.sdram
.core
.lasmicon
import LASMIconSettings
9 from misoclib
.mem
.flash
import spiflash
10 from misoclib
.soc
.sdram
import SDRAMSoC
14 def __init__(self
, platform
, clk_freq
):
15 self
.clock_domains
.cd_sys
= ClockDomain()
16 self
.clock_domains
.cd_sys_ps
= ClockDomain()
19 clk32
= platform
.request("clk32")
21 self
.specials
+= Instance("IBUFG", i_I
=clk32
, o_O
=clk32a
)
23 self
.specials
+= Instance("BUFIO2", p_DIVIDE
=1,
24 p_DIVIDE_BYPASS
="TRUE", p_I_INVERT
="FALSE",
25 i_I
=clk32a
, o_DIVCLK
=clk32b
)
26 f
= Fraction(int(clk_freq
), int(f0
))
27 n
, m
, p
= f
.denominator
, f
.numerator
, 8
28 assert f0
/n
*m
== clk_freq
32 self
.specials
.pll
= Instance("PLL_ADV", p_SIM_DEVICE
="SPARTAN6",
33 p_BANDWIDTH
="OPTIMIZED", p_COMPENSATION
="INTERNAL",
34 p_REF_JITTER
=.01, p_CLK_FEEDBACK
="CLKFBOUT",
35 i_DADDR
=0, i_DCLK
=0, i_DEN
=0, i_DI
=0, i_DWE
=0, i_RST
=0, i_REL
=0,
36 p_DIVCLK_DIVIDE
=1, p_CLKFBOUT_MULT
=m
*p
//n
, p_CLKFBOUT_PHASE
=0.,
37 i_CLKIN1
=clk32b
, i_CLKIN2
=0, i_CLKINSEL
=1,
38 p_CLKIN1_PERIOD
=1000000000/f0
, p_CLKIN2_PERIOD
=0.,
39 i_CLKFBIN
=pll_fb
, o_CLKFBOUT
=pll_fb
, o_LOCKED
=pll_lckd
,
40 o_CLKOUT0
=pll
[0], p_CLKOUT0_DUTY_CYCLE
=.5,
41 o_CLKOUT1
=pll
[1], p_CLKOUT1_DUTY_CYCLE
=.5,
42 o_CLKOUT2
=pll
[2], p_CLKOUT2_DUTY_CYCLE
=.5,
43 o_CLKOUT3
=pll
[3], p_CLKOUT3_DUTY_CYCLE
=.5,
44 o_CLKOUT4
=pll
[4], p_CLKOUT4_DUTY_CYCLE
=.5,
45 o_CLKOUT5
=pll
[5], p_CLKOUT5_DUTY_CYCLE
=.5,
46 p_CLKOUT0_PHASE
=0., p_CLKOUT0_DIVIDE
=p
//1,
47 p_CLKOUT1_PHASE
=0., p_CLKOUT1_DIVIDE
=p
//1,
48 p_CLKOUT2_PHASE
=0., p_CLKOUT2_DIVIDE
=p
//1,
49 p_CLKOUT3_PHASE
=0., p_CLKOUT3_DIVIDE
=p
//1,
50 p_CLKOUT4_PHASE
=0., p_CLKOUT4_DIVIDE
=p
//1, # sys
51 p_CLKOUT5_PHASE
=270., p_CLKOUT5_DIVIDE
=p
//1, # sys_ps
53 self
.specials
+= Instance("BUFG", i_I
=pll
[4], o_O
=self
.cd_sys
.clk
)
54 self
.specials
+= Instance("BUFG", i_I
=pll
[5], o_O
=self
.cd_sys_ps
.clk
)
55 self
.specials
+= AsyncResetSynchronizer(self
.cd_sys
, ~pll_lckd
)
57 self
.specials
+= Instance("ODDR2", p_DDR_ALIGNMENT
="NONE",
58 p_INIT
=0, p_SRTYPE
="SYNC",
59 i_D0
=0, i_D1
=1, i_S
=0, i_R
=0, i_CE
=1,
60 i_C0
=self
.cd_sys
.clk
, i_C1
=~self
.cd_sys
.clk
,
61 o_Q
=platform
.request("sdram_clock"))
64 class BaseSoC(SDRAMSoC
):
65 default_platform
= "papilio_pro"
70 csr_map
.update(SDRAMSoC
.csr_map
)
72 def __init__(self
, platform
, sdram_controller_settings
=LASMIconSettings(), **kwargs
):
74 SDRAMSoC
.__init
__(self
, platform
, clk_freq
,
75 cpu_reset_address
=0x60000,
76 sdram_controller_settings
=sdram_controller_settings
,
79 self
.submodules
.crg
= _CRG(platform
, clk_freq
)
81 if not self
.integrated_main_ram_size
:
82 self
.submodules
.sdrphy
= gensdrphy
.GENSDRPHY(platform
.request("sdram"),
84 self
.register_sdram_phy(self
.sdrphy
)
86 if not self
.integrated_rom_size
:
87 self
.submodules
.spiflash
= spiflash
.SpiFlash(platform
.request("spiflash2x"),
89 self
.flash_boot_address
= 0x70000
90 self
.register_rom(self
.spiflash
.bus
)
92 default_subtarget
= BaseSoC