|
10 | 10 | from migen.genlib.resetsync import AsyncResetSynchronizer |
11 | 11 |
|
12 | 12 | from litex.gen import * |
| 13 | +from litex.gen.genlib.misc import WaitTimer |
13 | 14 |
|
14 | 15 | from litex.build.io import DDROutput, SDROutput, SDRTristate |
15 | 16 | from litex.build.generic_platform import Subsignal, Pins, Misc, IOStandard |
|
39 | 40 |
|
40 | 41 | class _CRG(LiteXModule): |
41 | 42 | def __init__(self, platform, sys_clk_freq, cpu_clk_freq): |
42 | | - #self.rst = Signal() |
| 43 | + self.rst = Signal() |
43 | 44 | self.cd_sys = ClockDomain() |
44 | 45 | self.cd_usb = ClockDomain() |
45 | 46 | self.cd_video = ClockDomain() |
46 | 47 | self.cd_cpu = ClockDomain() |
| 48 | + self.cd_rst = ClockDomain(reset_less=True) |
47 | 49 |
|
48 | 50 | # # # |
49 | 51 |
|
50 | 52 | # Clk/Rst. |
51 | 53 | clk100 = platform.request("clk100") |
52 | 54 | rst_n = platform.request("user_btn", 0) |
53 | 55 |
|
| 56 | + self.comb += self.cd_rst.clk.eq(clk100) |
| 57 | + |
| 58 | + # A pulse is necessary to do a reset. |
| 59 | + self.rst_pulse = Signal() |
| 60 | + self.reset_timer = reset_timer = ClockDomainsRenamer("rst")(WaitTimer(25e-6*platform.default_clk_freq)) |
| 61 | + self.comb += self.rst_pulse.eq(self.rst ^ reset_timer.done) |
| 62 | + self.comb += reset_timer.wait.eq(self.rst) |
| 63 | + |
54 | 64 | # PLL. |
55 | 65 | self.pll = pll = TITANIUMPLL(platform) |
56 | | - self.comb += pll.reset.eq(~rst_n) |
57 | | - pll.register_clkin(clk100, 100e6) |
| 66 | + self.comb += pll.reset.eq(~rst_n | self.rst_pulse) |
| 67 | + pll.register_clkin(clk100, platform.default_clk_freq) |
58 | 68 | # You can use CLKOUT0 only for clocks with a maximum frequency of 4x |
59 | 69 | # (integer) of the reference clock. If all your system clocks do not fall within |
60 | 70 | # this range, you should dedicate one unused clock for CLKOUT0. |
|
0 commit comments