+++ /dev/null
-from fractions import Fraction
-
-from migen.fhdl.structure import *
-
-class ClkFX:
- def __init__(self, infreq, outfreq):
- self.clkin = Signal()
- self.clkout = Signal()
-
- ratio = Fraction(outfreq)/Fraction(infreq)
- appr = ratio.limit_denominator(32)
- m = appr.numerator
- if m < 2 or m > 32:
- raise OverflowError
- d = appr.denominator
-
- in_period = float(Fraction(1000000000)/Fraction(infreq))
-
- self._inst = Instance("DCM_SP",
- [("CLKFX", self.clkout)],
- [("CLKIN", self.clkin),
- ("PSEN", BV(1)),
- ("RST", BV(1))],
- [("CLKDV_DIVIDE", 2.0),
- ("CLKFX_DIVIDE", d),
- ("CLKFX_MULTIPLY", m),
- ("CLKIN_DIVIDE_BY_2", "FALSE"),
- ("CLKIN_PERIOD", in_period),
- ("CLKOUT_PHASE_SHIFT", "NONE"),
- ("CLK_FEEDBACK", "NONE"),
- ("DESKEW_ADJUST", "SYSTEM_SYNCHRONOUS"),
- ("DUTY_CYCLE_CORRECTION", "TRUE"),
- ("PHASE_SHIFT", 0),
- ("STARTUP_WAIT", "TRUE")]
- )
-
- def get_fragment(self):
- return Fragment([self._inst.ins["PSEN"].eq(0), self._inst.ins["RST"].eq(0)], instances=[self._inst])