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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [adder.vhd] - Blame information for rev 22

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 22 jguarin200
--! @file adder.vhd
2
--! @brief Sumador parametrizable.  
3
 
4
 
5
--! Libreria de definicion de senales y tipos estandares, comportamiento de operadores aritmeticos y logicos.\n Signal and types definition library. This library also defines 
6 2 jguarin200
library ieee;
7 22 jguarin200
--! Paquete de definicion estandard de logica. Standard logic definition pack.
8 2 jguarin200
use ieee.std_logic_1164.all;
9 22 jguarin200
--! Se usaran en esta descripcion los componentes del package arithpack.vhd.\n It will be used in this description the components on the arithpack.vhd package. 
10 2 jguarin200
use work.arithpack.all;
11 22 jguarin200
 
12
--! Sumador parametrizable.
13
 
14
--! La entidad es un sumador parametrizable. Las características parametrizables son el ancho de los sumandos, si se usa un circuito ripple carry adder y si se sintetiza una compuerta xor en la entrada que permita la selección de la operación a realizar (suma o resta).
15
--! Las entradas y las salidas son las usuales de un sumador: a y b los sumandos, ci el carry de entrada, cout el carry de salida y el valor de la suma en result. Adicionalmente si se selecciona el parametro substractor_selector como "YES" entonces la entrada s, servirá para seleccionar si el sumador realizará la operacion A+B (s=0) ó A-B (s=0). Finalmente la siguiente tabla sintetiza el comportamiento de la entidad.
16
--! \n\n
17
--! <table>
18
--! <tr><th>substractor_selector</th><th>S</th><th>Operación ejecutada</th></tr> <tr><td>"YES"</td><td>0</td><td>A+B</td></tr> --! <tr><td>"YES"</td><td>1</td><td>A-B</td></tr> <tr><td>Otro valor.</td><td>n/a</td><td>A+B</td></tr></table>
19
 
20
--! El circuito es combinatorio puro y la propagación de las señales hasta el resultado del ultimo carry tiene un tiempo, el cual debe ser considerado para implementar posteriores etapas de pipe en caso de ser necesario.   
21 2 jguarin200
entity adder is
22
        generic (
23 22 jguarin200
                w : integer := 9;       --! Ancho de los sumandos
24
                carry_logic : string := "CLA";                  --! Carry logic, seleccione "CLA" para Carry Look Ahead ó "RCA" para Ripple Carry Adder. 
25
                substractor_selector : string := "YES"  --! Al seleccionar este parametro en "YES" se puede usar el sumador para restar a través de la señal s.
26 2 jguarin200
        );
27
 
28
        port (
29 22 jguarin200
                a,b     : in std_logic_vector(w-1 downto 0);     --! Sumandos
30
                s       : in std_logic;                                                 --! Selector Suma / Resta
31
                ci      : in std_logic;                                                 --! Datos Carry In.                                                              
32
                result  : out std_logic_vector(w-1 downto 0);--! Resultado de la suma.
33
                cout    : out std_logic                                         --! Carry out (Overflow).
34 2 jguarin200
        );
35
end adder;
36 22 jguarin200
--! Arquitectura del sumador parametrizable.
37 2 jguarin200
 
38 22 jguarin200
--! Si se configura el sumador para que s seleccione si se va a realizar una suma ó una resta, entonces se instanciara para cada bit de la entrada a, una compuerta xor. Por cada bit del operando a se realizará la operación lógica ai xor s. El resultado se almacena en la señal sa. Si por el contrario el sumador está configurado para ignorar el selector s, entonces la señal sa se conecta directamente a la entrada a. 
39 2 jguarin200
 
40
architecture adder_arch of adder is
41
 
42
        signal sa,p,g:  std_logic_vector(w-1 downto 0);
43
        signal sCarry:  std_logic_vector(w downto 1);
44
 
45
 
46
begin
47
        -- Usual Structural Model / wether or not CLA/RCA is used and wether or not add/sub selector is used, this port is always instanced --
48
 
49
        result(0)<= a(0) xor b(0) xor ci;
50
        wide_adder:
51
        if (w>1) generate
52
                wide_adder_generate_loop:
53
                for i in 1 to w-1 generate
54
                        result(i) <= a(i) xor b(i) xor sCarry(i);
55
                end generate wide_adder_generate_loop;
56
        end generate wide_adder;
57
        cout <= sCarry(w);
58
        g<= sa and b;
59
        p<= sa or b;
60
 
61
 
62
        -- Conditional Instantiation / Adder Substraction Logic --
63
 
64
        adder_sub_logic :       -- adder substractor logic
65
        if substractor_selector = "YES" generate
66
                a_xor_s:
67
                for i in 0 to w-1 generate
68
                        sa(i) <= a(i) xor s;
69
                end generate a_xor_s;
70
        end generate adder_sub_Logic;
71
 
72
        add_logic:      -- just adder.
73
        if substractor_selector = "NO" generate
74
                sa <= a;
75
        end generate add_logic;
76
 
77
 
78
 
79
        -- Conditional Instantiation / RCA/CLA Logical Blocks Generation --
80
        rca_logic_block_instancing:     -- Ripple Carry Adder
81 22 jguarin200
        if carry_logic="RCA" generate
82
                --! Generar un bloque de cálculo de Carry, Ripple Carry Adder. carry_logic = "RCA". 
83 2 jguarin200
                rca_x: rca_logic_block
84
                generic map (w=>w)
85
                port map (
86
                        p=>p,
87
                        g=>g,
88
                        cin=>ci,
89
                        c=>sCarry
90
                );
91
        end generate rca_logic_block_instancing;
92
 
93
        cla_logic_block_instancing:     -- Carry Lookahead Adder
94
        if carry_logic="CLA" generate
95 22 jguarin200
                --! Generar un bloque de cálculo de Carry, Carry Look Ahead. carry_logic = "CLA".
96 2 jguarin200
                cla_x: cla_logic_block
97
                generic map (w=>w)
98
                port map (
99
                        p=>p,
100
                        g=>g,
101
                        cin=>ci,
102
                        c=>sCarry
103
                );
104
        end generate cla_logic_block_instancing;
105
 
106
end adder_arch;
107
 
108
 

powered by: WebSVN 2.1.0

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