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