blob: 0d577e3f22fa90cf781ba654dd6ed0fbe3492d6d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-- loopfilter.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity loopfilter is
port(clk, reset: in std_logic;
mult_error_op:in signed(38 downto 0);
f_desired: in unsigned(5 downto 0);
f_word_output: out unsigned(5 downto 0));
end loopfilter;
architecture loopfilter_arch of loopfilter is
signal beta_e, alpha_e: signed(45 downto 0);
constant alpha: signed(7 downto 0) := "01110011";
constant beta: signed(7 downto 0) := "00011010";
constant plus_one: signed(alpha_e'range) := ('0', others => '1');
component q_one_dot_fp_multiplier is
generic (a_word_size, b_word_size:integer);
port(a: in signed(a_word_size-1 downto 0);
b: in signed(b_word_size-1 downto 0);
mult_out: out signed(a_word_size + b_word_size -2 downto 0));
end component;
begin
M0: q_one_dot_fp_multiplier generic map(a_word_size => beta'length, b_word_size => mult_error_op'length)
port map(beta, mult_error_op,beta_e );
M1: q_one_dot_fp_multiplier generic map(a_word_size => alpha'length, b_word_size => mult_error_op'length)
port map(alpha, mult_error_op, alpha_e);
ADDERS : process(clk, reset)
variable freq_add_var : signed(beta_e'range);
variable n_total_var: signed(alpha_e'range);
variable temp: signed(n_total_var'range);
begin
if reset = '1' then
freq_add_var := (others => '0');
freq_add_var(42 downto 37) := signed(std_logic_vector(f_desired));
n_total_var := (others => '0');
elsif rising_edge(clk) then
freq_add_var := freq_add_var + beta_e;
n_total_var := freq_add_var + alpha_e;
end if;
if n_total_var(n_total_var'length -1) = '1' then
temp := plus_one + n_total_var;
else
temp := n_total_var;
end if;
f_word_output <= unsigned(temp(42 downto 37));
end process;
end loopfilter_arch;
|