1 from nmigen
import Module
, Signal
2 from nmutil
.pipemodbase
import PipeModBase
3 from ieee754
.cordic
.pipe_data
import CordicData
, CordicInitialData
7 class CordicInitialStage(PipeModBase
):
8 def __init__(self
, pspec
):
9 super().__init
__(pspec
, "cordicinit")
12 return CordicInitialData(self
.pspec
)
15 return CordicData(self
.pspec
)
17 def elaborate(self
, platform
):
22 for i
in range(self
.pspec
.iterations
):
23 An
*= math
.sqrt(1 + 2**(-2*i
))
24 X0
= int(round(self
.pspec
.M
*1/An
))
26 comb
+= self
.o
.x
.eq(X0
)
27 comb
+= self
.o
.y
.eq(0)
28 comb
+= self
.o
.z
.eq(self
.i
.z0
)
32 class CordicStage(PipeModBase
):
33 def __init__(self
, pspec
, stagenum
):
34 super().__init
__(pspec
, "cordicstage%d" % stagenum
)
35 self
.stagenum
= stagenum
38 return CordicData(self
.pspec
)
41 return CordicData(self
.pspec
)
43 def elaborate(self
, platform
):
47 dx
= Signal(self
.i
.x
.shape())
48 dy
= Signal(self
.i
.y
.shape())
49 dz
= Signal(self
.i
.z
.shape())
50 angle
= int(round(self
.pspec
.M
*
51 math
.atan(2**(-self
.stagenum
))))
53 comb
+= dx
.eq(self
.i
.y
>> self
.stagenum
)
54 comb
+= dy
.eq(self
.i
.x
>> self
.stagenum
)
57 with m
.If(self
.i
.z
>= 0):
58 comb
+= self
.o
.x
.eq(self
.i
.x
- dx
)
59 comb
+= self
.o
.y
.eq(self
.i
.y
+ dy
)
60 comb
+= self
.o
.z
.eq(self
.i
.z
- dz
)
62 comb
+= self
.o
.x
.eq(self
.i
.x
+ dx
)
63 comb
+= self
.o
.y
.eq(self
.i
.y
- dy
)
64 comb
+= self
.o
.z
.eq(self
.i
.z
+ dz
)