1 -- title: Numeric Controlled Oscillator
2 -- author: Sebastian Weiss
3 -- last change: 22.10.13
4
5 library IEEE;
6 use IEEE.std_logic_1164.all;
7 use IEEE.numeric_std.all;
8
9 entity nco is
10 generic
11 (
12 A : natural := 16; -- amplitude resolution
13 F : natural := 24; -- frequency resolution
14 P : natural := 24; -- phase resolution
15 N : natural := 14 -- number of stages
16 );
17
18 port
19 (
20 clk : in std_logic; -- signal processing clock
21 fcw : in unsigned(F-1 downto 0);
22 sin : out signed(A-1 downto 0); -- sine output
23 cos : out signed(A-1 downto 0) -- cosine output
24 );
25 end entity;
26
27 architecture behavioral of nco is
28 type q_vector is array(natural range <>) of std_logic_vector(1 downto 0);
29 signal cordic_phi : unsigned(P-3 downto 0);
30 signal cordic_sin : signed(A-1 downto 0);
31 signal cordic_cos : signed(A-1 downto 0);
32 signal phi : unsigned(P-1 downto 0) := (others => '0');
33 signal phase : unsigned(P-2 downto 0);
34 signal q : q_vector(N+1 downto 0) := (others => (others => '0'));
35 begin
36
37 cordic : entity work.cordic
38 generic map(
39 A => A,
40 P => P,
41 N => N
42 )
43 port map(
44 clk => clk,
45 phi => cordic_phi,
46 sin => cordic_sin,
47 cos => cordic_cos
48 );
49
50 process
51 begin
52 wait until rising_edge(clk);
53 phi <= phi + fcw;
54
55 if phi(P-2) = '1' then
56 phase <= 0 - phi(P-2 downto 0);
57 else
58 phase <= phi(P-2 downto 0);
59 end if;
60
61 q(0) <= phi(P-1) & phi(P-2);
62 for i in 1 to N+1 loop
63 q(i) <= q(i-1);
64 end loop;
65
66 if q(N+1) = "00" then
67 sin <= cordic_sin;
68 cos <= cordic_cos;
69 elsif q(N+1) = "01" then
70 sin <= cordic_sin;
71 cos <= -cordic_cos;
72 elsif q(N+1) = "10" then
73 sin <= -cordic_sin;
74 cos <= -cordic_cos;
75 elsif q(N+1) = "11" then
76 sin <= -cordic_sin;
77 cos <= cordic_cos;
78 end if;
79 end process;
80
81 cordic_phi <= phase(P-3 downto 0);
82 end behavioral;
83
This page was generated using GHDL 0.29 (20100109) [Sokcho edition], a program written by Tristan Gingold