216b01934c60a125df1d0522a6865d4c1b7d37b3
1 from nmigen
import Module
, Signal
, Cat
, Mux
2 from nmutil
.pipemodbase
import PipeModBase
3 from ieee754
.cordic
.pipe_data
import CordicData
7 class CordicStage(PipeModBase
):
8 def __init__(self
, pspec
, stagenum
):
9 super().__init
__(pspec
, "cordicstage%d" % stagenum
)
10 self
.stagenum
= stagenum
13 return CordicData(self
.pspec
, False)
16 return CordicData(self
.pspec
, False)
18 def elaborate(self
, platform
):
22 dx
= Signal(self
.i
.x
.shape())
23 dy
= Signal(self
.i
.y
.shape())
24 dz
= Signal(self
.i
.z
.shape())
25 angle
= int(round(self
.pspec
.M
*
26 math
.atan(2**(-self
.stagenum
))))
28 comb
+= dx
.eq(self
.i
.y
>> self
.stagenum
)
29 comb
+= dy
.eq(self
.i
.x
>> self
.stagenum
)
32 with m
.If(self
.i
.z
>= 0):
33 comb
+= self
.o
.x
.eq(self
.i
.x
- dx
)
34 comb
+= self
.o
.y
.eq(self
.i
.y
+ dy
)
35 comb
+= self
.o
.z
.eq(self
.i
.z
- dz
)
37 comb
+= self
.o
.x
.eq(self
.i
.x
+ dx
)
38 comb
+= self
.o
.y
.eq(self
.i
.y
- dy
)
39 comb
+= self
.o
.z
.eq(self
.i
.z
+ dz
)