OpenCores
URL https://opencores.org/ocsvn/ternary_adder/ternary_adder/trunk

Subversion Repositories ternary_adder

[/] [ternary_adder/] [trunk/] [vhdl/] [ternary_adder_altera.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 plutonium
---------------------------------------------------------------------------------------------
2
-- Author:          Martin Kumm
3
-- Contact:         kumm@uni-kassel.de
4
-- License:         LGPL
5
-- Date:            03.04.2013
6
-- Compatibility:   Altera Arria I,II,V and Stratix II-V FPGAs
7
--
8
-- Description:
9
-- Implementation of a ternary adder including subtraction of up to two inputs.
10
-- The output coresponds to sum_o = x_i + y_i + z_i, where the inputs have a word size of 
11
-- 'input_word_size' while the output has a word size of input_word_size+2.
12
--
13
-- Flipflops at the outputs can be activated by setting 'use_output_ff' to true.
14
-- Signed operation is activated by using the 'is_signed' generic.
15
-- The inputs y_i and z_i can be negated by setting 'subtract_y' or 'subtract_z'
16
-- to realize sum_o = x_i +/- y_i +/- z_i. The negation requires no extra resources.
17
---------------------------------------------------------------------------------------------
18
 
19
library ieee;
20
use ieee.std_logic_1164.all;
21
use ieee.numeric_std.all;
22
 
23
entity ternary_adder is
24
  generic(
25
    input_word_size  : integer := 10;
26
    subtract_y       : boolean := false;
27
    subtract_z       : boolean := false;
28
    use_output_ff    : boolean := true
29
  );
30
  port(
31
    clk_i   : in  std_logic;
32
    rst_i   : in  std_logic;
33
    x_i   : in  std_logic_vector((input_word_size - 1) downto 0);
34
    y_i   : in  std_logic_vector((input_word_size - 1) downto 0);
35
    z_i   : in  std_logic_vector((input_word_size - 1) downto 0);
36
    sum_o : out std_logic_vector((input_word_size + 1) downto 0)
37
  );
38
end entity;
39
 
40
 
41
architecture behavior of ternary_adder is
42
 
43
  signal sum : std_logic_vector(input_word_size + 1 downto 0);
44
  signal sum_tmp : std_logic_vector(input_word_size+3 downto 0);
45
  signal x_i_ext : std_logic_vector(input_word_size+1 downto 0);
46
  signal y_i_ext : std_logic_vector(input_word_size+1 downto 0);
47
  signal z_i_ext : std_logic_vector(input_word_size+1 downto 0);
48
 
49
begin
50
 
51
        add_sub_case1_gen: if subtract_y = false and subtract_z = false generate
52
    sum <= std_logic_vector(resize(signed(x_i),input_word_size+2) + resize(signed(y_i),input_word_size+2) + resize(signed(z_i),input_word_size+2));
53
  end generate;
54
 
55
        add_sub_case2_gen: if subtract_y = false and subtract_z = true generate
56
    x_i_ext <= x_i & "00";
57
    y_i_ext <= y_i & "10";
58
    z_i_ext <= (not z_i) & "10";
59
    sum_tmp <= std_logic_vector(resize(signed(x_i_ext),input_word_size+4) + resize(signed(y_i_ext),input_word_size+4) + resize(signed(z_i_ext),input_word_size+4));
60
    sum <= sum_tmp(input_word_size+3 downto 2);
61
  end generate;
62
 
63
        add_sub_case3_gen: if subtract_y = true and subtract_z = false generate
64
    x_i_ext <= x_i & "00";
65
    y_i_ext <= (not y_i) & "10";
66
    z_i_ext <= z_i & "10";
67
    sum_tmp <= std_logic_vector(resize(signed(x_i_ext),input_word_size+4) + resize(signed(y_i_ext),input_word_size+4) + resize(signed(z_i_ext),input_word_size+4));
68
    sum <= sum_tmp(input_word_size+3 downto 2);
69
  end generate;
70
 
71
        add_sub_case4_gen: if subtract_y = true and subtract_z = true generate
72
    x_i_ext <= x_i & "11";
73
    y_i_ext <= (not y_i) & "11";
74
    z_i_ext <= (not z_i) & "11";
75
    sum_tmp <= std_logic_vector(resize(signed(x_i_ext),input_word_size+4) + resize(signed(y_i_ext),input_word_size+4) + resize(signed(z_i_ext),input_word_size+4));
76
    sum <= sum_tmp(input_word_size+3 downto 2);
77
  end generate;
78
 
79
        use_output_ff_gen: if use_output_ff = true generate
80
          process(clk_i,rst_i)
81
          begin
82
            if rst_i = '1' then
83
                    sum_o <= (others => '0');
84
            elsif clk_i'event and clk_i='1' then
85
                    sum_o <= sum;
86
                  end if;
87
                end process;
88
        end generate;
89
 
90
        dont_use_output_ff_gen: if use_output_ff = false generate
91
                sum_o <= sum;
92
        end generate;
93
 
94
 
95
end architecture;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.