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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [rca_logic_block.vhd] - Blame information for rev 39

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

Line No. Rev Author Line
1 22 jguarin200
--! @file rca_logic_block.vhd
2
--! @author Julian Andres Guarin
3
--! @brief Bloque de lógica Carry Look Ahead. 
4
-- rca_logic_block.vhd
5
-- This file is part of raytrac.
6
-- 
7
--     raytrac is free software: you can redistribute it and/or modify
8
--     it under the terms of the GNU General Public License as published by
9
--     the Free Software Foundation, either version 3 of the License, or
10
--     (at your option) any later version.
11
-- 
12
--     raytrac is distributed in the hope that it will be useful,
13
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
14
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
--     GNU General Public License for more details.
16
-- 
17
--     You should have received a copy of the GNU General Public License
18
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>.library ieee;
19
 
20
-- Check out arithpack.vhd to understand in general terms what this file describes,
21
-- or checkout this file to check in detailed way what this file intends to.
22
--! Libreria de definicion de senales y tipos estandares, comportamiento de operadores aritmeticos y logicos.\n Signal and types definition library. This library also defines 
23 2 jguarin200
library ieee;
24 22 jguarin200
--! Paquete de definicion estandard de logica. Standard logic definition pack.
25 2 jguarin200
use ieee.std_logic_1164.all;
26
 
27 22 jguarin200
 
28
--! Entidad generadora del Bloque de Ripple Carry Adder. 
29
 
30
--! En una suma A+B para cada par de bits Ai, Bi, se genera un carry out Couti, este Couti en un bloque generador de carry Ripple Carry, depende del cálculo de los Carry Out anteriores, Couti-1, Couti-2,...., Cout0. Lo que hace el Ripple Carry Adder Logic Block, es calcular secuencialmente los valores de todos los Couti, usando las señales de propagación y generación, Pi y Gi, y los Carry Out anteriores. Comparado con el Carry Look Ahead, empleará el doble del tiempo, pero usará muchas menos elementos lógicos en una FPGA o muchos menos transistores en un procesos de fabricación CMOS. En síntesis se sacrifica desempeño por ahorro de recursos. 
31
 
32 2 jguarin200
entity rca_logic_block is
33
        generic (
34 27 jguarin200
                width : integer := 8 --! Tamaño estandar del bloque Ripple Carry Adder.
35 2 jguarin200
        );
36
        port (
37 27 jguarin200
                p,g: in std_logic_vector(width-1 downto 0); --! Señales de Propagación y Generación del carry.
38 22 jguarin200
                cin : in std_logic;                                             --! Señal de entrada Carry In.
39 2 jguarin200
 
40 27 jguarin200
                c : out std_logic_vector(width downto 1)        --! Señales Carry Out Cálculadas. 
41 2 jguarin200
        );
42
end rca_logic_block;
43
 
44
 
45 22 jguarin200
--! Arquitectura del bloque Ripple Carry Adder.
46
 
47
--! El bloque de lógica de Ripple Carry Adder, se sintetiza a partir de un código comportamental.
48
--! Para cada Couti, se instancia una función combinatoria. 
49
 
50
 
51 2 jguarin200
architecture rca_logic_block_arch of rca_logic_block is
52
 
53
 
54
 
55
begin
56 22 jguarin200
        --! El siguiente proceso instancia funciones combinatorias para CADA UNO de los valores de Couti a calcular. En TODO momemnto se utiliza el resultado de los Cout antrerioes a Couti, optimizando en uso de recursos. 
57 2 jguarin200
 
58 22 jguarin200
        --! La razón principal para realizar la instanciación de las funciones combinatorias necesarias con un process en vez de un generate, rádica en utilizar un conjunto de variables que afecte unicamente al proceso comportamental descrito y no a la arquitectura entera. 
59
 
60 2 jguarin200
        rcaProc:                -- rcaProc instancia funciones combinatorias en sCarry(i) haciendo uso de los resultados intermedios obtenidos
61
                                -- en sCarry(i-1), por lo que se crea un delay path en el calculo del Cout del circuito
62
        process (p,g,cin)
63 27 jguarin200
                variable i:                     integer range 0 to 2*width;
64
                variable sCarry:        std_logic_vector(width downto 1);
65 2 jguarin200
        begin
66
 
67 27 jguarin200
                sCarry(width downto 1) := g(width-1 downto 0);
68 2 jguarin200
                sCarry(1) := sCarry(1) or (p(0) and cin);
69
 
70 27 jguarin200
                for i in 1 to width-1 loop
71 2 jguarin200
                        sCarry(i+1) := sCarry(i+1) or (p(i) and sCarry(i));
72
                end loop;
73
 
74
                c <= sCarry;
75
 
76
 
77
        end process rcaProc;
78
end rca_logic_block_arch;

powered by: WebSVN 2.1.0

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