123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- library ieee;
- use ieee.std_logic_1164.all;
- use ieee.numeric_std.all;
- use ieee.math_real.all;
-
- package cordic_pkg is
- type cordic_mode is (cordic_rotate, cordic_vector);
-
- function cordic_gain(Iterations : positive) return real;
-
- procedure adjust_angle(x, y, z : in signed; signal xa, ya, za : out signed);
- end package cordic_pkg;
-
- package body cordic_pkg is
- function cordic_gain(iterations : positive) return real is
- variable g : real := 1.0;
- begin
- for i in 0 to iterations-1 loop
- g := g * sqrt(1.0 + 2.0**(-2*i));
- end loop;
- return g;
- end function;
-
- procedure adjust_angle(x, y, z : in signed; signal xa, ya, za : out signed) is
- variable quad : unsigned(1 downto 0);
- variable zp : signed(z'length-1 downto 0) := z;
- variable yp : signed(y'length-1 downto 0) := y;
- variable xp : signed(x'length-1 downto 0) := x;
- begin
-
- -- 0-based quadrant number of angle
- quad := unsigned(zp(zp'high downto zp'high-1));
-
- if quad = 1 or quad = 2 then -- Rotate into quadrant 0 and 3 (right half of plane)
- xp := -xp;
- yp := -yp;
- -- Add 180 degrees (flip the sign bit)
- zp := (not zp(zp'left)) & zp(zp'left-1 downto 0);
- end if;
-
- xa <= xp;
- ya <= yp;
- za <= zp;
- end procedure;
- end package body cordic_pkg;
|