diff options
author | Tristan Gingold <tgingold@free.fr> | 2016-03-26 18:04:59 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2016-03-26 18:04:59 +0100 |
commit | 2b2b76a1afd1916907c216be5151574833099c0d (patch) | |
tree | b3ab48848c904d8bf6eeee41a3c09c3310790cab /testsuite/gna/issue44/costasloop.vhdl | |
parent | 449f4ac088da240a42cfd791e12de533c1bc5377 (diff) | |
download | ghdl-2b2b76a1afd1916907c216be5151574833099c0d.tar.gz ghdl-2b2b76a1afd1916907c216be5151574833099c0d.tar.bz2 ghdl-2b2b76a1afd1916907c216be5151574833099c0d.zip |
Add files from ticket.
Diffstat (limited to 'testsuite/gna/issue44/costasloop.vhdl')
-rw-r--r-- | testsuite/gna/issue44/costasloop.vhdl | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/testsuite/gna/issue44/costasloop.vhdl b/testsuite/gna/issue44/costasloop.vhdl new file mode 100644 index 000000000..26966aa7c --- /dev/null +++ b/testsuite/gna/issue44/costasloop.vhdl @@ -0,0 +1,64 @@ +-- costasloop.vhd +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity costasloop is + port(carrier: in signed(11 downto 0); + clk, reset: in std_logic; + op: out std_logic); +end costasloop; + +architecture costasloop_arch of costasloop is + component nco is + port(clk, reset: in std_logic; + fword: in unsigned(5 downto 0); + op_sin: out signed(4 downto 0); + op_cos: out signed(4 downto 0)); + end component; + + 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; + + component lpf is + port(clk, reset: in std_logic; + x_in: in signed(15 downto 0); + y_out: out signed(19 downto 0)); + end component; + + component 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 component; + + signal nco_input: unsigned(5 downto 0); + signal nco_sin, nco_cos: signed(4 downto 0); + signal mult_sin, mult_cos: signed(15 downto 0); + signal raw_op_sin, raw_op_cos: signed(19 downto 0); + signal mult_error_op: signed(38 downto 0); +begin + --NCO phase multiplier + N: nco port map(clk, reset, nco_input, nco_sin, nco_cos); + + --Multiplier + M0: q_one_dot_fp_multiplier generic map(a_word_size=>nco_sin'length, b_word_size => carrier'length) port map(nco_sin, carrier, mult_sin); + M1: q_one_dot_fp_multiplier generic map(a_word_size=>nco_sin'length, b_word_size => carrier'length) port map(nco_cos, carrier, mult_cos); + + --FIR Filter + L0: lpf port map(clk, reset, mult_sin, raw_op_sin); + L1: lpf port map(clk, reset, mult_cos, raw_op_cos); + --Extract output (Comparator) + COMPARATOR: op <= raw_op_sin(raw_op_sin'length -1); --Sign bit + --Error Multiplier + EM: q_one_dot_fp_multiplier generic map(a_word_size=>raw_op_sin'length, b_word_size => raw_op_cos'length) port map(raw_op_sin, raw_op_cos, mult_error_op); + --Loop Filter + + --NCO mapping to error + LF: loopfilter port map(clk, reset, mult_error_op, to_unsigned(16, 6), nco_input); +end costasloop_arch; |