45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
|
|
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 |