This is based on the Pipistrello target code. --- misoc/targets/mimasv2.py | 137 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100755 misoc/targets/mimasv2.py
diff --git a/misoc/targets/mimasv2.py b/misoc/targets/mimasv2.py new file mode 100755 index 0000000..223d11e --- /dev/null +++ b/misoc/targets/mimasv2.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 + +import argparse +from fractions import Fraction + +from migen import * +from migen.genlib.resetsync import AsyncResetSynchronizer +from migen.build.platforms import mimasv2 + +from misoc.cores.sdram_settings import MT46H32M16 +from misoc.cores.sdram_phy import S6HalfRateDDRPHY +from misoc.integration.soc_sdram import * +from misoc.integration.builder import * + + +class _CRG(Module): + def __init__(self, platform, clk_freq): + self.clock_domains.cd_sys = ClockDomain() + self.clock_domains.cd_sdram_half = ClockDomain() + self.clock_domains.cd_sdram_full_wr = ClockDomain() + self.clock_domains.cd_sdram_full_rd = ClockDomain() + + self.clk4x_wr_strb = Signal() + self.clk4x_rd_strb = Signal() + + f0 = 100*1000000 + p = 8 + f = Fraction(clk_freq*p, f0) + n, d = f.numerator, f.denominator + assert 19e6 <= f0/d <= 500e6 # pfd + assert 400e6 <= f0*n/d <= 1080e6 # vco + + clk100 = platform.request("clk100") + clk100a = Signal() + self.specials += Instance("IBUFG", i_I=clk100, o_O=clk100a) + clk100b = Signal() + self.specials += Instance("BUFIO2", p_DIVIDE=1, + p_DIVIDE_BYPASS="TRUE", p_I_INVERT="FALSE", + i_I=clk100a, o_DIVCLK=clk100b) + pll_lckd = Signal() + pll_fb = Signal() + pll = Signal(6) + self.specials.pll = Instance("PLL_ADV", p_SIM_DEVICE="SPARTAN6", + p_BANDWIDTH="OPTIMIZED", p_COMPENSATION="INTERNAL", + p_REF_JITTER=.01, p_CLK_FEEDBACK="CLKFBOUT", + i_DADDR=0, i_DCLK=0, i_DEN=0, i_DI=0, i_DWE=0, i_RST=0, i_REL=0, + p_DIVCLK_DIVIDE=d, p_CLKFBOUT_MULT=n, p_CLKFBOUT_PHASE=0., + i_CLKIN1=clk100b, i_CLKIN2=0, i_CLKINSEL=1, + p_CLKIN1_PERIOD=1e9/f0, p_CLKIN2_PERIOD=0., + i_CLKFBIN=pll_fb, o_CLKFBOUT=pll_fb, o_LOCKED=pll_lckd, + o_CLKOUT0=pll[0], p_CLKOUT0_DUTY_CYCLE=.5, + o_CLKOUT1=pll[1], p_CLKOUT1_DUTY_CYCLE=.5, + o_CLKOUT2=pll[2], p_CLKOUT2_DUTY_CYCLE=.5, + o_CLKOUT3=pll[3], p_CLKOUT3_DUTY_CYCLE=.5, + o_CLKOUT4=pll[4], p_CLKOUT4_DUTY_CYCLE=.5, + o_CLKOUT5=pll[5], p_CLKOUT5_DUTY_CYCLE=.5, + p_CLKOUT0_PHASE=0., p_CLKOUT0_DIVIDE=p//4, # sdram wr rd + p_CLKOUT1_PHASE=0., p_CLKOUT1_DIVIDE=p//4, + p_CLKOUT2_PHASE=270., p_CLKOUT2_DIVIDE=p//2, # sdram dqs adr ctrl + p_CLKOUT3_PHASE=270., p_CLKOUT3_DIVIDE=p//2, # off-chip ddr + p_CLKOUT4_PHASE=0., p_CLKOUT4_DIVIDE=p//1, + p_CLKOUT5_PHASE=0., p_CLKOUT5_DIVIDE=p//1, # sys + ) + self.specials += Instance("BUFG", i_I=pll[5], o_O=self.cd_sys.clk) + reset = ~platform.request("buttonswitch", 0) + self.clock_domains.cd_por = ClockDomain() + por = Signal(max=1 << 11, reset=(1 << 11) - 1) + self.sync.por += If(por != 0, por.eq(por - 1)) + self.comb += self.cd_por.clk.eq(self.cd_sys.clk) + self.specials += AsyncResetSynchronizer(self.cd_por, reset) + self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll_lckd | (por > 0)) + self.specials += Instance("BUFG", i_I=pll[2], o_O=self.cd_sdram_half.clk) + self.specials += Instance("BUFPLL", p_DIVIDE=4, + i_PLLIN=pll[0], i_GCLK=self.cd_sys.clk, + i_LOCKED=pll_lckd, o_IOCLK=self.cd_sdram_full_wr.clk, + o_SERDESSTROBE=self.clk4x_wr_strb) + self.comb += [ + self.cd_sdram_full_rd.clk.eq(self.cd_sdram_full_wr.clk), + self.clk4x_rd_strb.eq(self.clk4x_wr_strb), + ] + clk_sdram_half_shifted = Signal() + self.specials += Instance("BUFG", i_I=pll[3], o_O=clk_sdram_half_shifted) + clk = platform.request("ddram_clock") + self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE", + p_INIT=0, p_SRTYPE="SYNC", + i_D0=1, i_D1=0, i_S=0, i_R=0, i_CE=1, + i_C0=clk_sdram_half_shifted, i_C1=~clk_sdram_half_shifted, + o_Q=clk.p) + self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE", + p_INIT=0, p_SRTYPE="SYNC", + i_D0=0, i_D1=1, i_S=0, i_R=0, i_CE=1, + i_C0=clk_sdram_half_shifted, i_C1=~clk_sdram_half_shifted, + o_Q=clk.n) + + +soc_mimasv2_args = soc_sdram_args +soc_mimasv2_argdict = soc_sdram_argdict + + +class BaseSoC(SoCSDRAM): + def __init__(self, clk_freq=(83 + Fraction(1, 3))*1000*1000, **kwargs): + platform = mimasv2.Platform() + SoCSDRAM.__init__(self, platform, clk_freq, + integrated_rom_size=0x8000, + uart_baudrate=19200, + **kwargs) + + self.submodules.crg = _CRG(platform, clk_freq) + + if not self.integrated_main_ram_size: + sdram_module = MT46H32M16(self.clk_freq) + self.submodules.ddrphy = S6HalfRateDDRPHY(platform.request("ddram"), + sdram_module.memtype, + rd_bitslip=1, + wr_bitslip=3, + dqs_ddr_alignment="C1") + self.comb += [ + self.ddrphy.clk4x_wr_strb.eq(self.crg.clk4x_wr_strb), + self.ddrphy.clk4x_rd_strb.eq(self.crg.clk4x_rd_strb), + ] + self.register_sdram(self.ddrphy, "minicon", + sdram_module.geom_settings, sdram_module.timing_settings) + + +def main(): + parser = argparse.ArgumentParser(description="MiSoC port to the Mimas V2") + builder_args(parser) + soc_mimasv2_args(parser) + args = parser.parse_args() + + soc = BaseSoC(**soc_mimasv2_argdict(args)) + builder = Builder(soc, **builder_argdict(args)) + builder.build() + + +if __name__ == "__main__": + main() -- 2.6.2 _______________________________________________ M-Labs devel mailing list https://ssl.serverraum.org/lists/listinfo/devel