Working sin/cos cordic
authorMichael Nolan <mtnolan2640@gmail.com>
Tue, 31 Mar 2020 20:44:27 +0000 (16:44 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Tue, 31 Mar 2020 20:44:27 +0000 (16:44 -0400)
src/ieee754/cordic/sin_cos.py
src/ieee754/cordic/test/test_sincos.py

index 911880dba17fc9555ab2fc4310bb5de7c7bfafd0..dbe5a18a835691c900cf824c9aaba2629aa195e5 100644 (file)
@@ -41,8 +41,8 @@ class CORDIC(Elaboratable):
         self.ZMAX = ZMAX = int(round(self.M * math.pi/2))
 
         # sin/cos output in 0.ffffff format
-        self.cos = Signal(range(-M, M-1), reset=0)
-        self.sin = Signal(range(-M, M-1), reset=0)
+        self.cos = Signal(range(-M, M+1), reset=0)
+        self.sin = Signal(range(-M, M+1), reset=0)
         # angle input
         self.z0 = Signal(range(-ZMAX, ZMAX), reset_less=True)
 
@@ -104,6 +104,7 @@ class CORDIC(Elaboratable):
             with m.If(i == self.iterations - 1):
                 sync += state.eq(CordicState.WAITING)
                 sync += self.ready.eq(1)
+                sync += anglerom.addr.eq(0)
             with m.Else():
                 sync += i.eq(i+1)
                 sync += anglerom.addr.eq(i+2)
index c17b86faad35c46651f15100ba1991e3509f7f39..50d5fd5387835e788afe65b1d6316f2f09f54e88 100644 (file)
@@ -38,7 +38,7 @@ class SinCosTestCase(FHDLTestCase):
             yield
             yield start.eq(0)
             yield
-            for i in range(10):
+            for i in range(fracbits + 5):
                 rdy = yield ready
                 if rdy == 1:
                     result = yield sin
@@ -56,16 +56,20 @@ class SinCosTestCase(FHDLTestCase):
             sim.run()
 
     def run_test_assert(self, z, fracbits=8):
-        (sin, cos) = run_cordic(z, fracbits=8, log=False)
-        self.run_test(zin=z, fracbits=8,
+        (sin, cos) = run_cordic(z, fracbits=fracbits, log=False)
+        self.run_test(zin=z, fracbits=fracbits,
                       expected_sin=sin, expected_cos=cos)
     def test_0(self):
         self.run_test_assert(0)
+
+    def test_neg(self):
+        self.run_test_assert(-6)
+    
     def test_rand(self):
-        fracbits = 8
+        fracbits = 16
         M = (1 << fracbits)
         ZMAX = int(round(M * math.pi/2))
-        for i in range(100):
+        for i in range(500):
             z = random.randrange(-ZMAX, ZMAX-1)
             self.run_test_assert(z, fracbits=fracbits)