litex/milkymist/clkfx/__init__.py

39 lines
1.0 KiB
Python

from fractions import Fraction
from migen.fhdl.structure import *
class Inst:
def __init__(self, infreq, outfreq):
declare_signal(self, "clkin")
declare_signal(self, "clkout")
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])