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
|