Project

General

Profile

-- ===================================================================================
-- Package / Component definition
-- ===================================================================================

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

PACKAGE sin_cos_pkg IS
COMPONENT sin_cos
PORT(
-- Clock
clk : IN STD_LOGIC;
clk_ena : IN STD_LOGIC;
-- Sine computation
sin_ph : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
sin_amp : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
sin_out : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);
-- Cosine computation
cos_ph : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
cos_amp : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
cos_out : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
);
END COMPONENT;
END PACKAGE;

-- ===================================================================================
-- Entity / Architecture definition
-- ===================================================================================

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY sin_cos IS
PORT(
-- Clock
clk : IN STD_LOGIC;
clk_ena : IN STD_LOGIC;
-- Sine computation
sin_ph : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
sin_amp : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
sin_out : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);
-- Cosine computation
cos_ph : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
cos_amp : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
cos_out : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
);
END sin_cos;

ARCHITECTURE rtl OF sin_cos IS

COMPONENT sin_rom IS
PORT
(
clock : IN STD_LOGIC;
enable : IN STD_LOGIC := '1';
address_a : IN STD_LOGIC_VECTOR(10 DOWNTO 0);
address_b : IN STD_LOGIC_VECTOR(10 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
q_b : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END COMPONENT sin_rom;

SIGNAL sin_val : STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL cos_val : STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL sin_ph_dly : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL cos_ph_dly : STD_LOGIC_VECTOR(4 DOWNTO 0);

BEGIN

sin_inst : sin_rom
PORT MAP
(
clock => clk,
enable => clk_ena,
address_a(10 DOWNTO 3) => sin_amp,
address_a(2) => sin_ph(2) XOR sin_ph(3),
address_a(1) => sin_ph(1) XOR sin_ph(3),
address_a(0) => sin_ph(0) XOR sin_ph(3),
q_a => sin_val(7 DOWNTO 0),
address_b(10 DOWNTO 3) => cos_amp,
address_b(2) => cos_ph(2) XOR (NOT cos_ph(3)),
address_b(1) => cos_ph(1) XOR (NOT cos_ph(3)),
address_b(0) => cos_ph(0) XOR (NOT cos_ph(3)),
q_b => cos_val(7 DOWNTO 0)
);
sin_val(8) <= '0';
cos_val(8) <= '0';
-- Delayed phase for output generation
sin_ph_dly <= sin_ph WHEN rising_edge(clk);
cos_ph_dly <= cos_ph WHEN rising_edge(clk);

-- Output generation using sine and cosine symetries
sin_cos_gen:
FOR i IN 0 TO 8 GENERATE
sin_out(i) <= sin_val(i) XOR sin_ph_dly(4);
cos_out(i) <= cos_val(i) XOR cos_ph_dly(3) XOR cos_ph_dly(4);
END GENERATE;

END rtl;
(1-1/7)