|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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;
|