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 ^ \
31 (1 << self
.encoder
.o
))
32 m
.d
.sync
+= self
.encoder
.i
.eq(self
.current ^ \
33 (1 << self
.encoder
.o
))
36 m
.d
.sync
+= self
.match
.eq(0)
37 m
.d
.sync
+= self
.encoder
.i
.eq(0)
40 m
.d
.sync
+= self
.encoder
.i
.eq(self
.input)
41 m
.d
.sync
+= self
.current
.eq(self
.input)
42 m
.d
.sync
+= self
.encoder
.i
.eq(self
.input)
43 m
.d
.sync
+= self
.match
.eq(0)