forked from M-Labs/artiq
1
0
Fork 0

Revert "pipistrello: use 4x serdes for rtio ttl"

This reverts commit 8e92cc91f5.

Broken. Will revisit.
This commit is contained in:
Robert Jördens 2015-07-27 23:38:23 -06:00
parent f0a7078336
commit 1809a70f5c
1 changed files with 32 additions and 77 deletions

View File

@ -3,8 +3,6 @@ from fractions import Fraction
from migen.fhdl.std import * from migen.fhdl.std import *
from migen.bank.description import * from migen.bank.description import *
from migen.bank import wbgen from migen.bank import wbgen
from migen.genlib.resetsync import AsyncResetSynchronizer
from migen.genlib.cdc import MultiReg
from misoclib.com import gpio from misoclib.com import gpio
from misoclib.soc import mem_decoder from misoclib.soc import mem_decoder
@ -13,84 +11,46 @@ from targets.pipistrello import BaseSoC
from artiq.gateware.soc import AMPSoC from artiq.gateware.soc import AMPSoC
from artiq.gateware import rtio, nist_qc1 from artiq.gateware import rtio, nist_qc1
from artiq.gateware.rtio.phy import ttl_simple, ttl_serdes_spartan6, dds from artiq.gateware.rtio.phy import ttl_simple, dds
class _RTIOCRG(Module, AutoCSR): class _RTIOCRG(Module, AutoCSR):
def __init__(self, platform, clk_freq): def __init__(self, platform, clk_freq):
self._clock_sel = CSRStorage() self._clock_sel = CSRStorage()
self._pll_reset = CSRStorage(reset=1) self.clock_domains.cd_rtio = ClockDomain(reset_less=True)
self._pll_locked = CSRStatus()
self.clock_domains.cd_rtio = ClockDomain() f = Fraction(125*1000*1000, clk_freq)
self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True)
self.clock_domains.cd_rtiox8 = ClockDomain(reset_less=True)
self.rtiox4_stb = Signal()
self.rtiox8_stb = Signal()
rtio_f = 125*1000*1000
f = Fraction(rtio_f, clk_freq)
rtio_internal_clk = Signal() rtio_internal_clk = Signal()
rtio_external_clk = Signal() self.specials += Instance("DCM_CLKGEN",
pmt2 = platform.request("pmt", 2) p_CLKFXDV_DIVIDE=2,
dcm_locked = Signal() p_CLKFX_DIVIDE=f.denominator,
rtio_clk = Signal() p_CLKFX_MD_MAX=float(f),
pll_locked = Signal() p_CLKFX_MULTIPLY=f.numerator,
pll = Signal(3) p_CLKIN_PERIOD=1e9/clk_freq,
pll_fb = Signal() p_SPREAD_SPECTRUM="NONE",
self.specials += [ p_STARTUP_WAIT="FALSE",
Instance("IBUFG", i_I=pmt2, o_O=rtio_external_clk), i_CLKIN=ClockSignal(),
Instance("DCM_CLKGEN", p_CLKFXDV_DIVIDE=2, o_CLKFX=rtio_internal_clk,
p_CLKFX_DIVIDE=f.denominator, p_CLKFX_MD_MAX=float(f), i_FREEZEDCM=0,
p_CLKFX_MULTIPLY=f.numerator, p_CLKIN_PERIOD=1e9/clk_freq, i_RST=ResetSignal())
p_SPREAD_SPECTRUM="NONE", p_STARTUP_WAIT="FALSE",
i_CLKIN=ClockSignal(), o_CLKFX=rtio_internal_clk, rtio_external_clk = platform.request("pmt", 2)
i_FREEZEDCM=0, i_RST=ResetSignal(), o_LOCKED=dcm_locked), # ISE infers constraints for the internal clock
Instance("BUFGMUX", # and propagates them through the BUFGMUX. Adding this:
i_I0=rtio_internal_clk, i_I1=rtio_external_clk, # platform.add_period_constraint(rtio_external_clk, 8.0)
i_S=self._clock_sel.storage, o_O=rtio_clk), # seems to confuse it
Instance("PLL_ADV", p_SIM_DEVICE="SPARTAN6", self.specials += Instance("BUFGMUX",
p_BANDWIDTH="OPTIMIZED", p_COMPENSATION="INTERNAL", i_I0=rtio_internal_clk,
p_REF_JITTER=.01, p_CLK_FEEDBACK="CLKFBOUT", i_I1=rtio_external_clk,
i_DADDR=0, i_DCLK=0, i_DEN=0, i_DI=0, i_DWE=0, i_S=self._clock_sel.storage,
i_RST=self._pll_reset.storage | ~dcm_locked, i_REL=0, o_O=self.cd_rtio.clk)
p_DIVCLK_DIVIDE=1, p_CLKFBOUT_MULT=8,
p_CLKFBOUT_PHASE=0., i_CLKINSEL=1,
i_CLKIN1=rtio_clk, i_CLKIN2=0,
p_CLKIN1_PERIOD=1e9/rtio_f, p_CLKIN2_PERIOD=0.,
i_CLKFBIN=pll_fb, o_CLKFBOUT=pll_fb, o_LOCKED=pll_locked,
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,
p_CLKOUT0_PHASE=0., p_CLKOUT0_DIVIDE=1,
p_CLKOUT1_PHASE=0., p_CLKOUT1_DIVIDE=2,
p_CLKOUT2_PHASE=0., p_CLKOUT2_DIVIDE=8),
Instance("BUFPLL", p_DIVIDE=8,
i_PLLIN=pll[0], i_GCLK=self.cd_rtio.clk,
i_LOCKED=pll_locked, o_IOCLK=self.cd_rtiox8.clk,
o_SERDESSTROBE=self.rtiox8_stb),
Instance("BUFPLL", p_DIVIDE=4,
i_PLLIN=pll[1], i_GCLK=self.cd_rtio.clk,
i_LOCKED=pll_locked, o_IOCLK=self.cd_rtiox4.clk,
o_SERDESSTROBE=self.rtiox4_stb),
Instance("BUFG", i_I=pll[2], o_O=self.cd_rtio.clk),
AsyncResetSynchronizer(self.cd_rtio, ~pll_locked),
MultiReg(pll_locked, self._pll_locked.status),
]
# ISE infers correct period constraints for cd_rtio.clk from
# the internal clock. The first two TIGs target just the BUFGMUX.
platform.add_platform_command(""" platform.add_platform_command("""
NET "sys_clk" TNM_NET = "GRPsys_clk";
NET "{ext_clk}" TNM_NET = "GRPext_clk";
TIMESPEC "TSfix_ise1" = FROM "GRPsys_clk" TO "GRPext_clk" TIG;
NET "{int_clk}" TNM_NET = "GRPint_clk"; NET "{int_clk}" TNM_NET = "GRPint_clk";
NET "sys_clk" TNM_NET = "GRPsys_clk";
TIMESPEC "TSfix_ise1" = FROM "GRPint_clk" TO "GRPsys_clk" TIG;
TIMESPEC "TSfix_ise2" = FROM "GRPsys_clk" TO "GRPint_clk" TIG; TIMESPEC "TSfix_ise2" = FROM "GRPsys_clk" TO "GRPint_clk" TIG;
NET "{rtio_clk}" TNM_NET = "GRPrtio_clk"; """, int_clk=rtio_internal_clk)
TIMESPEC "TSfix_ise3" = FROM "GRPrtio_clk" TO "GRPsys_clk" TIG;
TIMESPEC "TSfix_ise4" = FROM "GRPsys_clk" TO "GRPrtio_clk" TIG;
""", ext_clk=rtio_external_clk, int_clk=rtio_internal_clk,
rtio_clk=self.cd_rtio.clk)
class NIST_QC1(BaseSoC, AMPSoC): class NIST_QC1(BaseSoC, AMPSoC):
@ -130,22 +90,16 @@ trce -v 12 -fastpaths -tsi {build_name}.tsi -o {build_name}.twr {build_name}.ncd
platform.request("ttl_h_tx_en").eq(1) platform.request("ttl_h_tx_en").eq(1)
] ]
self.submodules.rtio_crg = _RTIOCRG(platform, self.clk_freq)
# RTIO channels # RTIO channels
rtio_channels = [] rtio_channels = []
# pmt1 can run on a 8x serdes if pmt0 is not used
for i in range(2): for i in range(2):
phy = ttl_serdes_spartan6.Inout_4X(platform.request("pmt", i), phy = ttl_simple.Inout(platform.request("pmt", i))
self.rtio_crg.rtiox4_stb)
self.submodules += phy self.submodules += phy
rtio_channels.append(rtio.Channel.from_phy(phy, ififo_depth=512, rtio_channels.append(rtio.Channel.from_phy(phy, ififo_depth=512,
ofifo_depth=4)) ofifo_depth=4))
# ttl2 can run on a 8x serdes if xtrig is not used
for i in range(15): for i in range(15):
phy = ttl_serdes_spartan6.Output_4X(platform.request("ttl", i), phy = ttl_simple.Output(platform.request("ttl", i))
self.rtio_crg.rtiox4_stb)
self.submodules += phy self.submodules += phy
rtio_channels.append(rtio.Channel.from_phy(phy, ofifo_depth=256)) rtio_channels.append(rtio.Channel.from_phy(phy, ofifo_depth=256))
@ -175,6 +129,7 @@ trce -v 12 -fastpaths -tsi {build_name}.tsi -o {build_name}.twr {build_name}.ncd
ififo_depth=4)) ififo_depth=4))
# RTIO core # RTIO core
self.submodules.rtio_crg = _RTIOCRG(platform, self.clk_freq)
self.submodules.rtio = rtio.RTIO(rtio_channels) self.submodules.rtio = rtio.RTIO(rtio_channels)
self.add_constant("RTIO_FINE_TS_WIDTH", self.rtio.fine_ts_width) self.add_constant("RTIO_FINE_TS_WIDTH", self.rtio.fine_ts_width)
self.add_constant("DDS_RTIO_CLK_RATIO", 8 >> self.rtio.fine_ts_width) self.add_constant("DDS_RTIO_CLK_RATIO", 8 >> self.rtio.fine_ts_width)