1  | library ieee;
  | 
2  | use ieee.std_logic_1164.all;
  | 
3  | USE ieee.numeric_std.ALL;
  | 
4  | use ieee.math_real.all;
  | 
5  | 
  | 
6  | entity Zaehler is
  | 
7  |   
  | 
8  |   generic ( NBits : integer := 8 );              -- Bitbreite
  | 
9  | 
  | 
10  |   port (
  | 
11  |     ausgang : out unsigned(NBits-1 downto 0);  -- Ausgangsvektor
  | 
12  |     takt    : in  std_logic;            -- Taktsignal
  | 
13  |     reset   : in  std_logic);           -- Reset-Signal (aktiv L)
  | 
14  | 
  | 
15  | end Zaehler;
  | 
16  | 
  | 
17  | architecture Zaehler_arch of Zaehler is
  | 
18  |   signal zaehlstand : unsigned(NBits-1 downto 0) := to_unsigned(0,8);  -- Zaehlstand
  | 
19  | begin  -- Zaehler_arch
  | 
20  |   
  | 
21  |   process(takt)
  | 
22  |     begin
  | 
23  |       if(rising_edge(takt)) then
  | 
24  |         if(reset = '0') then
  | 
25  |           zaehlstand <= (others => '0');
  | 
26  |         else
  | 
27  |           zaehlstand <= zaehlstand + 1;
  | 
28  |         end if;
  | 
29  |       end if;
  | 
30  |     end process;
  | 
31  |     ausgang <= zaehlstand;
  | 
32  | end Zaehler_arch;
  | 
33  | 
  | 
34  | 
  | 
35  | library ieee;
  | 
36  | use ieee.std_logic_1164.all;
  | 
37  | USE ieee.numeric_std.ALL;
  | 
38  | use work.Zaehler;
  | 
39  | use ieee.math_real.all;
  | 
40  | 
  | 
41  | entity SinGen is
  | 
42  | 
  | 
43  |   generic(
  | 
44  |     NsinLog2 : integer := 4;        -- Number of sinus values
  | 
45  |     Nbits : integer := 8        -- Bit resolution for the sine
  | 
46  |     );
  | 
47  |   
  | 
48  |   port (
  | 
49  |     ausgang : out unsigned(Nbits-1 downto 0);  -- Ausgangssignal
  | 
50  |     takt    : in  std_logic;    -- Taktsignal
  | 
51  |     reset   : in  std_logic);   -- Reset
  | 
52  | 
  | 
53  | end SinGen;
  | 
54  | 
  | 
55  | architecture SinGen_arch of SinGen is
  | 
56  |   constant Nsin : integer := 2**NsinLog2;
  | 
57  |   constant A : real := 2.0**(real(Nbits-1))-1.0;  -- Amplitude for the sine.
  | 
58  |   constant Omega : real := 2.0*MATH_PI/real(Nsin);  -- Phase angular velocity
  | 
59  |   type RomType is array (0 to Nsin-1) of unsigned(Nbits-1 downto 0);  -- ROM datatype
  | 
60  |   signal SinusTabelle : RomType;
  | 
61  |   component Zaehler
  | 
62  |     generic (NBits : integer := 8);              -- Bitbreite
  | 
63  | 
  | 
64  |     port (
  | 
65  |       ausgang : out unsigned(NBits-1 downto 0);  -- Ausgangsvektor
  | 
66  |       takt    : in  std_logic;            -- Taktsignal
  | 
67  |       reset   : in  std_logic);           -- Reset-Signal (aktiv L)    
  | 
68  |   end component;
  | 
69  |   signal zaehlstand : unsigned(NBits-1 downto 0) := (others => '0');  -- Zählstand
  | 
70  | begin  -- SinGen_arch
  | 
71  | 
  | 
72  |   tabelle: for i in 0 to Nsin-1 generate
  | 
73  |     SinusTabelle(i) <= to_unsigned(integer(A*(1.0+sin(Omega*real(i)))),Nbits);
  | 
74  |   end generate tabelle;
  | 
75  |   
  | 
76  |   Z0 : Zaehler generic map (NBits => NSinLog2) port map (
  | 
77  |     ausgang => zaehlstand,
  | 
78  |     takt => takt,
  | 
79  |     reset => reset);
  | 
80  | 
  | 
81  |   ausgang <= SinusTabelle(to_integer(zaehlstand));
  | 
82  |     
  | 
83  | end SinGen_arch;
  | 
84  | 
  | 
85  | library ieee;
  | 
86  | use ieee.std_logic_1164.all;
  | 
87  | USE ieee.numeric_std.ALL;
  | 
88  | use work.Zaehler;
  | 
89  | use work.SinGen;
  | 
90  | use ieee.math_real.all;
  | 
91  | 
  | 
92  | entity SinGenTest is
  | 
93  | end SinGenTest;
  | 
94  | 
  | 
95  | architecture SinGenTest_arch of SinGenTest is
  | 
96  |   constant Nbits : integer := 8;              -- Bitaufloesung
  | 
97  |   constant NSinLog2 : integer := 4;     -- log_2(Anzahl der Sinuswerte)
  | 
98  |   component SinGen
  | 
99  |     generic (
  | 
100  |       NsinLog2 : integer;
  | 
101  |       NBits    : integer);
  | 
102  |     port (
  | 
103  |       ausgang : out unsigned(Nbits-1 downto 0);
  | 
104  |       takt    : in  std_logic;
  | 
105  |       reset   : in  std_logic);
  | 
106  |   end component;
  | 
107  | 
  | 
108  |   signal testausgang : unsigned(Nbits-1 downto 0) := (others => '0');  -- Ausgangssignal
  | 
109  |   signal testtakt : std_logic := '0';       -- Taktsignal
  | 
110  |   signal testreset : std_logic := '0';      -- Reset-Signal
  | 
111  | begin  -- SinGenTest_arch
  | 
112  | 
  | 
113  |   G0 : SinGen generic map (
  | 
114  |     NsinLog2 => NSinLog2,
  | 
115  |     Nbits     => Nbits) port map (
  | 
116  |       ausgang => testausgang,
  | 
117  |       takt    => testtakt,
  | 
118  |       reset   => testreset);
  | 
119  |   
  | 
120  |   testtakt <= not(testtakt) after 10 ns;
  | 
121  |   testreset <= '0' after 0 ns, '1' after 15 ns;
  | 
122  |   
  | 
123  | end SinGenTest_arch;
  |