c5207734505010a30bdbeed36c0be716a64a8af6
1 from nmigen
import Array
, Module
, Signal
2 from nmigen
.lib
.coding
import PriorityEncoder
, Decoder
4 class WalkingPriorityEncoder():
6 def __init__(self
, width
):
8 self
.current
= Signal(width
)
9 self
.encoder
= PriorityEncoder(width
)
12 self
.write
= Signal(1)
13 self
.input = Signal(width
)
16 self
.match
= Signal(1)
17 self
.output
= Signal(width
)
19 def elaborate(self
, platform
=None):
22 m
.submodules
+= self
.encoder
24 with m
.If(self
.write
== 0):
25 with m
.If(self
.encoder
.n
== 0):
27 self
.output
.eq(self
.encoder
.o
),
30 m
.d
.sync
+= self
.current
.eq(self
.current ^
(1 << self
.encoder
.o
))
31 m
.d
.sync
+= self
.encoder
.i
.eq(self
.current ^
(1 << self
.encoder
.o
))
34 m
.d
.sync
+= self
.match
.eq(0)
35 m
.d
.sync
+= self
.encoder
.i
.eq(0)
38 m
.d
.sync
+= self
.encoder
.i
.eq(self
.input)
39 m
.d
.sync
+= self
.current
.eq(self
.input)
40 m
.d
.sync
+= self
.encoder
.i
.eq(self
.input)
41 m
.d
.sync
+= self
.match
.eq(0)