forked from M-Labs/artiq
wrpll: new collector from Weida/Tom
This commit is contained in:
parent
dee16edb78
commit
dfa033eb87
|
@ -79,6 +79,9 @@ class WRPLL(Module, AutoCSR):
|
||||||
self.submodules.ddmtd_helper = DDMTD(ddmtd_counter, ddmtd_inputs.rec_clk)
|
self.submodules.ddmtd_helper = DDMTD(ddmtd_counter, ddmtd_inputs.rec_clk)
|
||||||
self.submodules.ddmtd_main = DDMTD(ddmtd_counter, ddmtd_inputs.main_xo)
|
self.submodules.ddmtd_main = DDMTD(ddmtd_counter, ddmtd_inputs.main_xo)
|
||||||
|
|
||||||
|
collector_update = Signal()
|
||||||
|
self.sync.helper += collector_update.eq(ddmtd_counter == (2**N - 1))
|
||||||
|
|
||||||
filter_cd = ClockDomainsRenamer("filter")
|
filter_cd = ClockDomainsRenamer("filter")
|
||||||
self.submodules.collector = filter_cd(Collector(N))
|
self.submodules.collector = filter_cd(Collector(N))
|
||||||
self.submodules.filter_helper = filter_cd(thls.make(filters.helper, data_width=48))
|
self.submodules.filter_helper = filter_cd(thls.make(filters.helper, data_width=48))
|
||||||
|
@ -98,7 +101,7 @@ class WRPLL(Module, AutoCSR):
|
||||||
]
|
]
|
||||||
self.comb += [
|
self.comb += [
|
||||||
self.filter_main.input.eq(self.collector.output),
|
self.filter_main.input.eq(self.collector.output),
|
||||||
self.filter_main.input_stb.eq(self.collector.output_update)
|
self.filter_main.input_stb.eq(collector_update)
|
||||||
]
|
]
|
||||||
|
|
||||||
self.sync.helper += [
|
self.sync.helper += [
|
||||||
|
|
|
@ -131,20 +131,19 @@ class DDMTD(Module, AutoCSR):
|
||||||
|
|
||||||
class Collector(Module):
|
class Collector(Module):
|
||||||
def __init__(self, N):
|
def __init__(self, N):
|
||||||
self.tag_helper = Signal(N)
|
self.tag_helper = Signal((N, True))
|
||||||
self.tag_helper_update = Signal()
|
self.tag_helper_update = Signal()
|
||||||
self.tag_main = Signal(N)
|
self.tag_main = Signal((N, True))
|
||||||
self.tag_main_update = Signal()
|
self.tag_main_update = Signal()
|
||||||
|
|
||||||
self.output = Signal((N, True))
|
self.output = Signal((N + 1, True))
|
||||||
self.output_update = Signal(N)
|
|
||||||
|
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
fsm = FSM(reset_state="IDLE")
|
fsm = FSM(reset_state="IDLE")
|
||||||
self.submodules += fsm
|
self.submodules += fsm
|
||||||
|
|
||||||
tag_collector = Signal(N)
|
tag_collector = Signal((N + 1, True))
|
||||||
fsm.act("IDLE",
|
fsm.act("IDLE",
|
||||||
If(self.tag_main_update & self.tag_helper_update,
|
If(self.tag_main_update & self.tag_helper_update,
|
||||||
NextValue(tag_collector, 0),
|
NextValue(tag_collector, 0),
|
||||||
|
@ -160,17 +159,32 @@ class Collector(Module):
|
||||||
fsm.act("WAITHELPER",
|
fsm.act("WAITHELPER",
|
||||||
If(self.tag_helper_update,
|
If(self.tag_helper_update,
|
||||||
NextValue(tag_collector, tag_collector - self.tag_helper),
|
NextValue(tag_collector, tag_collector - self.tag_helper),
|
||||||
NextState("UPDATE")
|
NextState("LEADCHECK")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
fsm.act("WAITMAIN",
|
fsm.act("WAITMAIN",
|
||||||
If(self.tag_main_update,
|
If(self.tag_main_update,
|
||||||
NextValue(tag_collector, tag_collector + self.tag_main),
|
NextValue(tag_collector, tag_collector + self.tag_main),
|
||||||
|
NextState("LAGCHECK")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# To compensate DDMTD counter roll-over when main is ahead of roll-over
|
||||||
|
# and helper is after roll-over
|
||||||
|
fsm.act("LEADCHECK",
|
||||||
|
If(tag_collector > 0,
|
||||||
|
NextValue(tag_collector, tag_collector - (2**N - 1))
|
||||||
|
),
|
||||||
NextState("UPDATE")
|
NextState("UPDATE")
|
||||||
)
|
)
|
||||||
|
# To compensate DDMTD counter roll-over when helper is ahead of roll-over
|
||||||
|
# and main is after roll-over
|
||||||
|
fsm.act("LAGCHECK",
|
||||||
|
If(tag_collector < 0,
|
||||||
|
NextValue(tag_collector, tag_collector + (2**N - 1))
|
||||||
|
),
|
||||||
|
NextState("UPDATE")
|
||||||
)
|
)
|
||||||
fsm.act("UPDATE",
|
fsm.act("UPDATE",
|
||||||
NextValue(self.output, tag_collector),
|
NextValue(self.output, tag_collector),
|
||||||
NextState("IDLE")
|
NextState("IDLE")
|
||||||
)
|
)
|
||||||
self.sync += self.output_update.eq(self.tag_helper_update)
|
|
||||||
|
|
Loading…
Reference in New Issue