from enum import Enum, unique
from ieee754.fpcommon.fpbase import FPNumBaseRecord, FPNumDecode
+import gmpy2
+from gmpy2 import mpfr
+
+
@unique
class CordicState(Enum):
self.addr = Signal(range(iterations))
self.data = Signal(range(-M, M-1))
- angles = [int(round(M*math.atan(2**(-i))))
- for i in range(self.iterations)]
+ angles = []
+ gmpy2.get_context().precision = 150
+ for i in range(self.iterations):
+ x = mpfr(2) ** -i
+ x = gmpy2.atan(x)
+ x = x/(gmpy2.const_pi()/mpfr(2))
+ x = x * mpfr(M)
+ angles.append(int(round(x)))
self.mem = Memory(width=self.data.width,
depth=self.iterations,
self.ready = Signal(reset=True)
self.width = self.z0.width
- self.iterations = self.width - 1
+ self.iterations = self.fracbits - 1
def elaborate(self, platform):
m = Module()
sync += i.eq(0)
sync += state.eq(CordicState.RUNNING)
sync += anglerom.addr.eq(1)
- sync += self.ready.eq(1) # debug
with m.If(state == CordicState.RUNNING):
with m.If(z >= 0):
sync += x.eq(x - dx)