Line 30... |
Line 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 Carry Look Ahead, no depende del cálculo de los Carry Out anteriores, Couti-1, Couti-2,...., Cout0. Lo que hace el Carry Look Ahead Logic Block, es calcular en paralelo los valores de toso los Couti, usando las señales de propagación y generación, Pi y Gi, y através de una formula "recurrente". Comparado con el Ripple Carry Adder el Carry Look Ahead Adder, empleará la mitad del tiempo, pero para lograrlo usará muchas elementos lógicos en una FPGA o mas transistores en un procesos de fabricación CMOS. En síntesis se sacrifica un mayor uso de recursos para lograr mayor desempeño.
|
--! 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 Carry Look Ahead, no depende del cálculo de los Carry Out anteriores, Couti-1, Couti-2,...., Cout0. Lo que hace el Carry Look Ahead Logic Block, es calcular en paralelo los valores de toso los Couti, usando las señales de propagación y generación, Pi y Gi, y através de una formula "recurrente". Comparado con el Ripple Carry Adder el Carry Look Ahead Adder, empleará la mitad del tiempo, pero para lograrlo usará muchas elementos lógicos en una FPGA o mas transistores en un procesos de fabricación CMOS. En síntesis se sacrifica un mayor uso de recursos para lograr mayor desempeño.
|
|
|
entity cla_logic_block is
|
entity cla_logic_block is
|
generic (
|
generic (
|
w : integer := 4 --! Tamaño por defecto de un bloque Carry Look Ahead.
|
width : integer := 4 --! Tamaño por defecto de un bloque Carry Look Ahead.
|
);
|
);
|
|
|
port (
|
port (
|
p,g : in std_logic_vector(w-1 downto 0); --! Señales de Propagación y Generación.
|
p,g : in std_logic_vector(width-1 downto 0); --! Señales de Propagación y Generación.
|
cin : in std_logic; --! Señal de Carry de entrada.
|
cin : in std_logic; --! Señal de Carry de entrada.
|
|
|
c : out std_logic_vector(w downto 1) --! Carry Out.
|
c : out std_logic_vector(width downto 1) --! Carry Out.
|
);
|
);
|
end cla_logic_block;
|
end cla_logic_block;
|
|
|
|
|
--! Arquitectura del bloque Carry Look Ahead.
|
--! Arquitectura del bloque Carry Look Ahead.
|
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.
|
claProc: -- claProc instancia funciones combinatorias en las variables iCarry,
|
claProc: -- claProc instancia funciones combinatorias en las variables iCarry,
|
-- pero notese que los valores de iCarry(i) no dependen jamas de iCarry(i-1) a diferencia de rcaProc.
|
-- pero notese que los valores de iCarry(i) no dependen jamas de iCarry(i-1) a diferencia de rcaProc.
|
process(p,g,cin)
|
process(p,g,cin)
|
|
|
variable i,j,k : integer range 0 to w; -- Variables de control de loop
|
variable i,j,k : integer range 0 to width; -- Variables de control de loop
|
variable iCarry: std_logic_vector(w downto 1); -- Carry Interno
|
variable iCarry: std_logic_vector(width downto 1); -- Carry Interno
|
variable iResults: std_logic_vector(((w+w**2)/2)-1 downto 0); -- Resultados intermedios
|
variable iResults: std_logic_vector(((width+width**2)/2)-1 downto 0); -- Resultados intermedios
|
variable index: integer;
|
variable index: integer;
|
begin
|
begin
|
|
|
iCarry(w downto 1) := g(w-1 downto 0);
|
iCarry(width downto 1) := g(width-1 downto 0);
|
index := 0;
|
index := 0;
|
for j in 0 to w-1 loop
|
for j in 0 to width-1 loop
|
for i in 1 to j+1 loop
|
for i in 1 to j+1 loop
|
iResults(index) := '1';
|
iResults(index) := '1';
|
for k in j-i+1 to j loop
|
for k in j-i+1 to j loop
|
iResults(index) := iResults(index) and p(k);
|
iResults(index) := iResults(index) and p(k);
|
end loop;
|
end loop;
|