Line 29... |
Line 29... |
|
|
--! 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.
|
--! 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.
|
|
|
entity rca_logic_block is
|
entity rca_logic_block is
|
generic (
|
generic (
|
w : integer := 8 --! Tamaño estandar del bloque Ripple Carry Adder.
|
width : integer := 8 --! Tamaño estandar del bloque Ripple Carry Adder.
|
);
|
);
|
port (
|
port (
|
p,g: in std_logic_vector(w-1 downto 0); --! Señales de Propagación y Generación del carry.
|
p,g: in std_logic_vector(width-1 downto 0); --! Señales de Propagación y Generación del carry.
|
cin : in std_logic; --! Señal de entrada Carry In.
|
cin : in std_logic; --! Señal de entrada Carry In.
|
|
|
c : out std_logic_vector(w downto 1) --! Señales Carry Out Cálculadas.
|
c : out std_logic_vector(width downto 1) --! Señales Carry Out Cálculadas.
|
);
|
);
|
end rca_logic_block;
|
end rca_logic_block;
|
|
|
|
|
--! Arquitectura del bloque Ripple Carry Adder.
|
--! Arquitectura del bloque Ripple Carry Adder.
|
Line 58... |
Line 58... |
--! 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.
|
--! 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.
|
|
|
rcaProc: -- rcaProc instancia funciones combinatorias en sCarry(i) haciendo uso de los resultados intermedios obtenidos
|
rcaProc: -- rcaProc instancia funciones combinatorias en sCarry(i) haciendo uso de los resultados intermedios obtenidos
|
-- en sCarry(i-1), por lo que se crea un delay path en el calculo del Cout del circuito
|
-- en sCarry(i-1), por lo que se crea un delay path en el calculo del Cout del circuito
|
process (p,g,cin)
|
process (p,g,cin)
|
variable i: integer range 0 to 2*w;
|
variable i: integer range 0 to 2*width;
|
variable sCarry: std_logic_vector(w downto 1);
|
variable sCarry: std_logic_vector(width downto 1);
|
begin
|
begin
|
|
|
sCarry(w downto 1) := g(w-1 downto 0);
|
sCarry(width downto 1) := g(width-1 downto 0);
|
sCarry(1) := sCarry(1) or (p(0) and cin);
|
sCarry(1) := sCarry(1) or (p(0) and cin);
|
|
|
for i in 1 to w-1 loop
|
for i in 1 to width-1 loop
|
sCarry(i+1) := sCarry(i+1) or (p(i) and sCarry(i));
|
sCarry(i+1) := sCarry(i+1) or (p(i) and sCarry(i));
|
end loop;
|
end loop;
|
|
|
c <= sCarry;
|
c <= sCarry;
|
|
|