1 from migen
.fhdl
.std
import *
2 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
4 from misoclib
import lasmicon
, spiflash
, ethmac
5 from misoclib
.sdramphy
import k7ddrphy
6 from misoclib
.gensoc
import SDRAMSoC
7 from misoclib
.ethmac
.phys
import gmii
10 def __init__(self
, platform
):
11 self
.clock_domains
.cd_sys
= ClockDomain()
12 self
.clock_domains
.cd_sys4x
= ClockDomain(reset_less
=True)
13 self
.clock_domains
.cd_clk200
= ClockDomain()
15 clk200
= platform
.request("clk200")
17 self
.specials
+= Instance("IBUFDS", i_I
=clk200
.p
, i_IB
=clk200
.n
, o_O
=clk200_se
)
25 Instance("PLLE2_BASE",
26 p_STARTUP_WAIT
="FALSE", o_LOCKED
=pll_locked
,
29 p_REF_JITTER1
=0.01, p_CLKIN1_PERIOD
=5.0,
30 p_CLKFBOUT_MULT
=5, p_DIVCLK_DIVIDE
=1,
31 i_CLKIN1
=clk200_se
, i_CLKFBIN
=pll_fb
, o_CLKFBOUT
=pll_fb
,
34 p_CLKOUT0_DIVIDE
=8, p_CLKOUT0_PHASE
=0.0, o_CLKOUT0
=pll_sys
,
37 p_CLKOUT1_DIVIDE
=2, p_CLKOUT1_PHASE
=0.0, o_CLKOUT1
=pll_sys4x
,
40 p_CLKOUT2_DIVIDE
=5, p_CLKOUT2_PHASE
=0.0, o_CLKOUT2
=pll_clk200
,
42 p_CLKOUT3_DIVIDE
=2, p_CLKOUT3_PHASE
=0.0, #o_CLKOUT3=,
44 p_CLKOUT4_DIVIDE
=4, p_CLKOUT4_PHASE
=0.0, #o_CLKOUT4=
46 Instance("BUFG", i_I
=pll_sys
, o_O
=self
.cd_sys
.clk
),
47 Instance("BUFG", i_I
=pll_sys4x
, o_O
=self
.cd_sys4x
.clk
),
48 Instance("BUFG", i_I
=pll_clk200
, o_O
=self
.cd_clk200
.clk
),
49 AsyncResetSynchronizer(self
.cd_sys
, ~pll_locked
),
50 AsyncResetSynchronizer(self
.cd_clk200
, ~pll_locked
),
53 reset_counter
= Signal(4, reset
=15)
54 ic_reset
= Signal(reset
=1)
56 If(reset_counter
!= 0,
57 reset_counter
.eq(reset_counter
- 1)
61 self
.specials
+= Instance("IDELAYCTRL", i_REFCLK
=ClockSignal("clk200"), i_RST
=ic_reset
)
63 class BaseSoC(SDRAMSoC
):
64 default_platform
= "kc705"
69 csr_map
.update(SDRAMSoC
.csr_map
)
71 def __init__(self
, platform
, **kwargs
):
72 SDRAMSoC
.__init
__(self
, platform
,
73 clk_freq
=125*1000000, cpu_reset_address
=0xaf0000,
76 self
.submodules
.crg
= _CRG(platform
)
78 sdram_geom
= lasmicon
.GeomSettings(
83 sdram_timing
= lasmicon
.TimingSettings(
88 tREFI
=self
.ns(7800, False),
95 self
.submodules
.ddrphy
= k7ddrphy
.K7DDRPHY(platform
.request("ddram"), memtype
="DDR3")
96 self
.register_sdram_phy(self
.ddrphy
.dfi
, self
.ddrphy
.phy_settings
, sdram_geom
, sdram_timing
)
98 # BIOS is in SPI flash
99 spiflash_pads
= platform
.request("spiflash")
100 spiflash_pads
.clk
= Signal()
101 self
.specials
+= Instance("STARTUPE2",
102 i_CLK
=0, i_GSR
=0, i_GTS
=0, i_KEYCLEARB
=0, i_PACK
=0,
103 i_USRCCLKO
=spiflash_pads
.clk
, i_USRCCLKTS
=0, i_USRDONEO
=1, i_USRDONETS
=1)
104 self
.submodules
.spiflash
= spiflash
.SpiFlash(spiflash_pads
, dummy
=11, div
=2)
105 self
.flash_boot_address
= 0xb00000
106 self
.register_rom(self
.spiflash
.bus
)
108 class MiniSoC(BaseSoC
):
113 csr_map
.update(BaseSoC
.csr_map
)
118 interrupt_map
.update(BaseSoC
.interrupt_map
)
120 def __init__(self
, platform
, **kwargs
):
121 BaseSoC
.__init
__(self
, platform
, **kwargs
)
123 self
.submodules
.ethphy
= gmii
.GMIIPHY(platform
.request("eth_clocks"), platform
.request("eth"))
124 self
.submodules
.ethmac
= ethmac
.EthMAC(phy
=self
.ethphy
, with_hw_preamble_crc
=True)
125 self
.add_wb_slave(lambda a
: a
[26:29] == 3, self
.ethmac
.bus
)
126 self
.add_cpu_memory_region("ethmac_mem", 0xb0000000, 0x2000)
128 default_subtarget
= BaseSoC