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