|
1 | 1 | from migen.fhdl.std import *
|
| 2 | +from migen.bank.description import * |
2 | 3 | from migen.bank import wbgen
|
3 | 4 | from mibuild.generic_platform import *
|
4 | 5 |
|
|
13 | 14 |
|
14 | 15 | ("pmt", 0, Pins("C:13"), IOStandard("LVTTL")),
|
15 | 16 | ("pmt", 1, Pins("C:14"), IOStandard("LVTTL")),
|
| 17 | + ("xtrig", 0, Pins("C:12"), IOStandard("LVTTL")), # used for DDS clock |
16 | 18 |
|
17 | 19 | ("ttl", 0, Pins("C:11"), IOStandard("LVTTL")),
|
18 | 20 | ("ttl", 1, Pins("C:10"), IOStandard("LVTTL")),
|
@@ -51,27 +53,42 @@ def __init__(self, pad):
|
51 | 53 | self.comb += pad.eq(sr[0])
|
52 | 54 |
|
53 | 55 |
|
54 |
| -class _RTIOMiniCRG(Module): |
| 56 | +class _RTIOMiniCRG(Module, AutoCSR): |
55 | 57 | def __init__(self, platform):
|
| 58 | + self._r_clock_sel = CSRStorage() |
56 | 59 | self.clock_domains.cd_rtio = ClockDomain()
|
| 60 | + |
57 | 61 | # 80MHz -> 125MHz
|
| 62 | + rtio_internal_clk = Signal() |
58 | 63 | self.specials += Instance("DCM_CLKGEN",
|
59 |
| - p_CLKFXDV_DIVIDE=2, p_CLKFX_DIVIDE=16, p_CLKFX_MD_MAX=1.6, p_CLKFX_MULTIPLY=25, |
60 |
| - p_CLKIN_PERIOD=12.5, p_SPREAD_SPECTRUM="NONE", p_STARTUP_WAIT="FALSE", |
| 64 | + p_CLKFXDV_DIVIDE=2, |
| 65 | + p_CLKFX_DIVIDE=16, p_CLKFX_MD_MAX=1.6, p_CLKFX_MULTIPLY=25, |
| 66 | + p_CLKIN_PERIOD=12.5, p_SPREAD_SPECTRUM="NONE", |
| 67 | + p_STARTUP_WAIT="FALSE", |
61 | 68 |
|
62 |
| - i_CLKIN=ClockSignal(), o_CLKFX=self.cd_rtio.clk, |
| 69 | + i_CLKIN=ClockSignal(), o_CLKFX=rtio_internal_clk, |
63 | 70 | i_FREEZEDCM=0, i_RST=ResetSignal())
|
| 71 | + |
| 72 | + rtio_external_clk = platform.request("xtrig") |
| 73 | + platform.add_period_constraint(rtio_external_clk, 8.0) |
| 74 | + self.specials += Instance("BUFGMUX", |
| 75 | + i_I0=rtio_internal_clk, |
| 76 | + i_I1=rtio_external_clk, |
| 77 | + i_S=self._r_clock_sel.storage, |
| 78 | + o_O=self.cd_rtio.clk) |
| 79 | + |
64 | 80 | platform.add_platform_command("""
|
65 | 81 | NET "{rtio_clk}" TNM_NET = "GRPrtio_clk";
|
66 | 82 | NET "sys_clk" TNM_NET = "GRPsys_clk";
|
67 | 83 | TIMESPEC "TSfix_ise1" = FROM "GRPrtio_clk" TO "GRPsys_clk" TIG;
|
68 | 84 | TIMESPEC "TSfix_ise2" = FROM "GRPsys_clk" TO "GRPrtio_clk" TIG;
|
69 |
| -""", rtio_clk=self.cd_rtio.clk) |
| 85 | +""", rtio_clk=rtio_internal_clk) |
70 | 86 |
|
71 | 87 |
|
72 | 88 | class ARTIQMiniSoC(BaseSoC):
|
73 | 89 | csr_map = {
|
74 |
| - "rtio": None # mapped on Wishbone instead |
| 90 | + "rtio": None, # mapped on Wishbone instead |
| 91 | + "rtiocrg": 13 |
75 | 92 | }
|
76 | 93 | csr_map.update(BaseSoC.csr_map)
|
77 | 94 |
|
|
0 commit comments