import enum from amaranth.build import Platform from amaranth import * class ClockState(enum.Enum): LOW = 0 FALLING = 1 HIGH = 2 RISING = 3 class ExiClock(Elaboratable): def __init__(self): # Ports self.exiClk = Signal() self.exiClkState = Signal(2) # State self.prevExiClkValid = Signal() self.prevExiClk = Signal() self.prevExiClkState = Signal(2) def elaborate(self, platform: Platform): m = Module() with m.If(self.prevExiClkValid): with m.If(self.prevExiClkState == ClockState.FALLING): m.d.comb += self.exiClkState.eq(ClockState.LOW) with m.Elif(self.prevExiClkState == ClockState.RISING): m.d.comb += self.exiClkState.eq(ClockState.HIGH) with m.Else(): with m.If(self.prevExiClk ^ self.exiClk): m.d.comb += self.exiClkState.eq(Cat(1, self.exiClk)) with m.Else(): m.d.comb += self.exiClkState.eq(Cat(0, self.exiClk)) m.d.sync += self.prevExiClkState.eq(self.exiClkState) m.d.sync += self.prevExiClk.eq(self.exiClk) m.d.sync += self.prevExiClkValid.eq(1) return m