Johannes Kutning 0d1b73e3e0 Initial commit
2023-10-31 07:47:27 +01:00

84 lines
2.5 KiB
VHDL

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;
entity fixed_sine is
generic (
SIZE : positive; -- Width of parameters
ITERATIONS : positive; -- Number of CORDIC iterations
FRAC_BITS : positive; -- Total fractional bits
MAGNITUDE : real := 1.0;
RESET_ACTIVE_LEVEL : std_ulogic := '1'
);
port (
clock : in std_ulogic;
reset : in std_ulogic;
data_valid : in std_ulogic; --# load new input data
busy : out std_ulogic; --# generating new result
result_valid : out std_ulogic; --# flag when result is valid
angle : in signed(size-1 downto 0); -- angle in brads (2**size brads = 2*pi radians)
sine : out signed(size-1 downto 0)
);
end entity fixed_sine;
architecture rtl of fixed_sine is
signal xa, ya, za, x_result, y_result : signed(Angle'range);
signal rv_loc : std_ulogic;
begin
adj: process(clock, reset) is
constant Y : signed(Angle'range) := (others => '0');
constant X : signed(Angle'range) := --to_signed(1, Angle'length);
to_signed(integer(MAGNITUDE/cordic_gain(ITERATIONS) * 2.0 ** FRAC_BITS), Angle'length);
begin
if reset = RESET_ACTIVE_LEVEL then
xa <= (others => '0');
ya <= (others => '0');
za <= (others => '0');
elsif rising_edge(clock) then
adjust_angle(X, Y, Angle, xa, ya, za);
end if;
end process;
c: entity work.cordic
generic map (
SIZE => SIZE,
ITERATIONS => ITERATIONS,
RESET_ACTIVE_LEVEL => RESET_ACTIVE_LEVEL
)
port map (
clock => clock,
reset => reset,
data_valid => data_valid,
result_valid => rv_loc,
busy => busy,
Mode => cordic_rotate,
X => xa,
Y => ya,
Z => za,
X_result => x_result,
Y_result => y_result,
Z_result => open
);
reg: process(clock, reset) is
begin
if reset = RESET_ACTIVE_LEVEL then
sine <= (others => '0');
result_valid <= '0';
elsif rising_edge(clock) then
result_valid <= rv_loc;
if rv_loc = '1' then -- Capture result
sine <= y_result;
end if;
end if;
end process;
end architecture;