Professional Documents
Culture Documents
Medio Sumador
A å A
B
å
B Cout
Cout
Sumador Completo
Cout = ABCin + ABCin + ABCin + ABCin A å
å = ABCin + ABCin + ABCin + ABCin B
Cin Cout
B B Cout B Cout
Cin
Cout
å A A4
B4
å A A3
B3
å A A2
B2
å A A1
B C4 B C3 B C1 B B1
Cout Cin Cout Cin Cout Cin Cout Cin C0
C4 S4 S3 S2 S1
La primera etapa (el bit menos significativo, BMS) puede ser un sumador completo con la entrada
de acarreo forzada a cero o un medio sumador.
El acarreo interno se lleva a cabo por un acarreo de ripple. El circuito equivalente al acarreo de ripple
de un sumador de 4 bits:
A4B4
A3B3 A 4 Å B4
A2B2 A 3 Å B3 C4
A1B1 A 2 Å B2
A 1 Å B1
C3
C0 C2
C1
El problema con este diseño es que el circuito sumador no conmuta instantáneamente. La
propagación del acarreo agrega retardos al tiempo de la suma y puede introducir estados
intermedios no deseados.
C 4 = A 4B 4 + A 3B 3 (A 4 + B 4 ) + A 2B 2 (A 4 + B 4 )(A 3 + B 3 )
+ A 1B1 (A 4 + B 4 )(A 3 + B 3 )(A 2 + B 2 )
+ C 0 (A 4 + B 4 )(A 3 + B 3 )(A 2 + B 2 )(A 1 + B1 )
En general, podemos generar cada uno de los acarreos internos expandiendo la siguiente expresión:
Cn = A nB n + Cn-1 (A n + B n )
Jerarquía (Hierarchy)
Un grupo de entidades de diseño asociadas en una serie de niveles o capas en la cual diseños
completos forman parte de otras entidades de diseño más generales. El diseño más general esta
considerado a ser el nivel más alto de la jerarquía.
Componente (Component)
Una entidad de diseño VHDL completa que puede usarse como una parte de un archivo de nivel
superior en un diseño jerárquico.
Puerto (Port)
Una entrada o salida de una entidad o componente de diseño VHDL.
Instanciar (Instantiate)
Usar una instancia (copia) de una componente.
Podemos crear un sumador paralelo en VHDL usando múltiples instancias de una componente “full
adder”.
-- full_add.vhd
-- Full adder: suma dos bit, a y b, mas carry
-- y genera el bit de sum y carry.
ENTITY full_add IS
PORT(
a, b, c_in : IN BIT;
c_out, sum : OUT BIT);
END full_add;
-- add4par.vhd
-- 4-bit parallel adder, usando 4 instancias de la component full_add
ENTITY add4par IS
PORT(
c0 : IN BIT;
a, b : IN BIT_VECTOR(4 downto 1);
c4 : OUT BIT;
sum : OUT BIT_VECTOR(4 downto 1));
END add4par;
COMPONENT full_add
PORT(
a, b, c_in : IN BIT;
c_out, sum : OUT BIT);
END COMPONENT;
-- Define a signal for internal carry bits
SIGNAL c : BIT_VECTOR (3 downto 1);
BEGIN
-- Four Component Instantiation Statements
adder1: full_add
PORT MAP ( a => a(1),
b => b(1),
c_in => c0,
c_out => c(1),
sum => sum(1));
adder2: full_add
PORT MAP ( a => a(2),
b => b(2),
c_in => c(1),
c_out => c(2),
sum => sum(2));
adder3: full_add
PORT MAP ( a => a(3),
b => b(3),
c_in => c(2),
c_out => c(3),
sum => sum(3));
adder4: full_add
PORT MAP ( a => a(4),
b => b(4),
c_in => c(3),
c_out => c4,
sum => sum(4));
END adder;
_instance_name: _component_name
GENERIC MAP (_parameter_name => _parameter_value ,
_parameter_name => _parameter_value)
PORT MAP (_component_port => _connect_port,
_component_port => _connect_port);
En el mapa de puertos, los puertos de componentes son los nombres de los puertos usados en el
archivo de las componentes y los puertos de conexión son los nombres de los puertos, variables, o
señales usadas en la entidad del diseño de nivel superior. Por ejemplo, los puertos de componentes
de la componente “full adder” son a, b, c, in, c_out, y sum. Los puertos de conexión para la instancia
adder1 son a(1), b(1), c0, c(1), y sum(1). El acarreo de ripple de adder1 a adder2 se logra mapeando
el puerto c_in de adder2 a c(1), el cual también esta mapeado al puerto c_out de adder1.
Una forma compacta y eficiente de describir la instanciación si decidimos usar todos los puertos de
la componente en el orden en que están definidos es:
Estatuto GENERATE
Una construcción VHDL usada para crear partes repetitivas de hardware. Los cuatro estatutos de
instanciación previamente mostrados pueden escribirse en una forma más general:
Un estatuto que puede escribirse en esta forma indexada puede implementarse usando un estatuto
GENERATE, de la forma
label:
FOR index IN range GENERATE
statements;
END GENERATE;
-- add4gen.vhd
-- 4-bit parallel adder, usando GENERATE y componentes
ENTITY add4gen IS
PORT(
c0 : IN BIT;
a, b : IN BIT_VECTOR(4 downto 1);
c4 : OUT BIT;
sum : OUT BIT_VECTOR(4 downto 1));
END add4gen;
adders:
FOR i IN 1 to 4 GENERATE
adder: full_add PORT MAP (a(i), b(i), c(i-1), c(i), sum(i));
END GENERATE;
c4 <= c(4);
END adder;
Es fácil expander el diseño a un sumador de 8 bits solo modificando el rango del estatuto for
generate y el número de bits de acarreo,
-- add8gen.vhd
-- 8-bit parallel adder
ENTITY add8gen IS
PORT(
c0 : IN BIT;
a, b : IN BIT_VECTOR(8 downto 1);
c8 : OUT BIT;
sum : OUT BIT_VECTOR(8 downto 1));
END add8gen;
adders:
FOR i IN 1 to 8 GENERATE
adder: full_add PORT MAP (a(i), b(i), c(i-1), c(i), sum(i));
END GENERATE;
c8 <= c(8);
END adder;