library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.math_real.all;

library work;
    use work.cordic_pkg.all;
    use work.float.all;

entity float_sine is
    generic (
        ITERATIONS : positive    -- Number of CORDIC iterations
    );
    port (
        clk : in std_logic;
        reset : in std_logic;

        data_valid : in std_logic;  --# load new input data
        busy : out std_logic; --# generating new result
        result_valid : out std_logic; --# flag when result is valid
        angle : in signed(31 downto 0); -- angle in brads (2**size brads = 2*pi radians)
        sine : out signed(31 downto 0)
    );
end entity float_sine;

architecture rtl of float_sine is
    signal fixed : signed( 31 downto 0 );
begin

    u_fixed_sine : entity work.fixed_sine
        generic map (
          SIZE => 32,
          ITERATIONS => 8,
          FRAC_BITS => 31
        )
        port map (
            clock => clk,
            reset => reset,

            data_valid => data_valid,
            busy => busy,
            result_valid => result_valid,
            angle => angle,
            sine => fixed
          );

    sine <= signed( to_float( std_logic_vector( fixed ) ) );

end architecture;
