You are on page 1of 6

DISEÑO DIGITAL CON VHDL 1

SUMADORES Y RESTADORES BINARIOS


(Diseño jerárquico en VHDL)

Medio Sumador

Cout =AB A B Cout


å
! B+AB
Σ=A ! 0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

A å A
B
å

B Cout
Cout

Sumador Completo
Cout = ABCin + ABCin + ABCin + ABCin A å
å = ABCin + ABCin + ABCin + ABCin B
Cin Cout

Después de aplicar mapas de Karnaugh:


Cout = AB + ACin + BCin
= (A Å B )Cin + AB
å = (A Å B) Å Cin
Un sumador completo a partir de dos medios sumadores:
A A å A å å

B B Cout B Cout

Cin
Cout

Sumador/Restador Binario Paralelo


Consiste de n sumadores completos, que sumarán dos números binarios de n bits. La salida consiste
de n bits de suma y un bit de carry.

Acarreo de Ripple (Ripple Carry)


Método de pasar el bit de acarreo del COUT de un sumador al CIN del sumador siguiente.

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA


DISEÑO DIGITAL CON VHDL 2

å 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.

Acarreo Rápido (Look-ahead carry)


Una red de compuertas que generan directamente un bit de acarreo a partir de todos los bits
operando que ingresan, independiente de las operaciones de cada etapa de sumador completo. La
idea es que el circuito examinará todos los bits A y B en forma simultánea y producirá un acarreo de
salida que usa menos niveles de compuertas que un circuito de acarreo ripple. Como existe una red
de compuertas por cada etapa interna, el retardo de propagación es el mismo para cada sumador
completo, sin importar los operandos de entrada.

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 )

Sumador Paralelo en VHDL

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.

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA


DISEÑO DIGITAL CON VHDL 3

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.

Estatuto de declación de componente (Component declaration statement)


Un estatuto que define los nombres de los puertos de entrada y salida de una componente usada
en en una entidad de diseño de VHDL.

Instanciar (Instantiate)
Usar una instancia (copia) de una componente.

Estatuto de instanciación de componente (Component instantiation statement)


Un estatuto que mapea nombres de puertos de una componente VHDL a los nombres de puertos,
señales internas, o variables de una entidad de diseño VHDL de mayor nivel.

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;

ARCHITECTURE adder OF full_add IS


BEGIN
c_out <= ((a xor b) and c_in) or (a and b);
sum <= (a xor b) xor c_in;
END adder;

El sumador completo de 4 bits sería:

-- 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;

ARCHITECTURE adder OF add4par IS


-- Component declaration

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA


DISEÑO DIGITAL CON VHDL 4

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;

El estatuo de instanciación de una componente es:

_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 genérico, un nombre de parámetro generalizado puede mapearse a un valor específico


cuando la componente es instanciada. Por ejemplo, puede darse a un nombre de parámetro un
valor que especifique el número de bits de salida de la componente.

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

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA


DISEÑO DIGITAL CON VHDL 5

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:

adder1: full_add PORT MAP (a(1),b(1),c0 , c(1), sum(1));


adder2: full_add PORT MAP (a(2),b(2),c(1), c(2), sum(2));
adder3: full_add PORT MAP (a(3),b(3),c(2), c(3), sum(3));
adder4: full_add PORT MAP (a(4),b(4),c(3), c4, sum(4));

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:

adder(i): full_add PORT MAP (a(i), b(i), c(i-1), c(i), sum(i));

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;

El código para generar el sumador completo usando generate es:

-- 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;

ARCHITECTURE adder OF add4gen IS


-- Component
COMPONENT full_add
PORT(
a, b, c_in : IN BIT;
c_out, sum : OUT BIT);
END COMPONENT;
-- Signal para carry bits internos; 5 valores
SIGNAL c: BIT_VECTOR (4 downto 0);
BEGIN
c(0) <= c0;

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA


DISEÑO DIGITAL CON VHDL 6

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;

ARCHITECTURE adder OF add8gen IS


-- Component
COMPONENT full_add
PORT(
a, b, c_in : IN BIT;
c_out, sum : OUT BIT);
END COMPONENT;
-- Signal para carry bits internos
SIGNAL c : BIT_VECTOR (8 downto 0);
BEGIN
c(0) <= c0;

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;

DR. JAVIER VEGA PINEDA INSTITUTO TECNOLÓGICO DE CHIHUAHUA

You might also like