20
Lógica Combinacional en VHDL (II)

Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Lógica Combinacional en

VHDL (II)

Page 2: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Sumadores de 1-Bit

A B

0 0

0 1

1 0

1 1

SCout

S =

Cout

=

Half

Adder

A B

S

Cout +

A B

0 0

0 1

1 0

1 1

SCout

S =

Cout

=

Full

Adder

Cin

0 0

0 1

1 0

1 1

0

0

0

0

1

1

1

1

A B

S

Cout

Cin+

Page 3: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

A B

0 0

0 1

1 0

1 1

0

1

1

0

SCout

0

0

0

1

S =

Cout

=

Half

Adder

A B

S

Cout +

A B

0 0

0 1

1 0

1 1

0

1

1

0

SCout

0

0

0

1

S =

Cout

=

Full

Adder

Cin

0 0

0 1

1 0

1 1

0

0

0

0

1

1

1

1

1

0

0

1

0

1

1

1

A B

S

Cout

Cin+

Sumadores de 1-Bit

Page 4: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

A B

0 0

0 1

1 0

1 1

0

1

1

0

SCout

0

0

0

1

S = A B

Cout

= AB

Half

Adder

A B

S

Cout +

A B

0 0

0 1

1 0

1 1

0

1

1

0

SCout

0

0

0

1

S = A B Cin

Cout

= AB + ACin

+ BCin

Full

Adder

Cin

0 0

0 1

1 0

1 1

0

0

0

0

1

1

1

1

1

0

0

1

0

1

1

1

A B

S

Cout

Cin+

Sumadores de 1-Bit

Page 5: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Implementación en VHDLlibrary IEEE;

use IEEE.STD_LOGIC_1164.all;

entity fulladder is

port(a, b, cin: in STD_LOGIC;

s, cout: out STD_LOGIC);

end fulladder;

architecture synth of fulladder is

signal p, g: STD_LOGIC;

begin

p <= a xor b;

g <= a and b;

s <= p xor cin;

cout <= g or (p and cin);

end synth;

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity adder is

generic(N: integer := 8);

port(a, b: in STD_LOGIC_VECTOR(N-1 downto 0);

cin: in STD_LOGIC;

s: out STD_LOGIC_VECTOR(N-1 downto 0);

cout: out STD_LOGIC);

end adder;

architecture synth of adder is

signal result: STD_LOGIC_VECTOR(N downto 0);

begin

result <= ("0" & a) + ("0" & b) + cin;

s <= result(N-1 downto 0);

cout <= result(N);

end synth;

Page 6: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Sumadores multibit (CPAs)

• Tipos de carry propagate adders (CPAs):– Ripple-carry (slow)

– Carry-lookahead (fast)

– Prefix (faster)

• Carry-lookahead y prefix adders son más rápidos para sumadores

más grandes, pero requieren más hardware.

A B

S

Cout

Cin+

N

NN

Page 7: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Ripple-Carry Adder

• Cadena de sumadores de 1-bit

• El acarreo se propaga a través de toda la

cadena

• Desventaja: lento

S31

A30

B30

S30

A1

B1

S1

A0

B0

S0

C30

C29

C1

C0

Cout ++++

A31

B31

Cin

Page 8: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Retardo del Ripple-Carry Adder

tripple = NtFA

donde tFA es el retardo de un full adder

Page 9: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Carry-Lookahead Adder• Calcula el acarreo (Cout) para bloques de k-bits usando

señales generar y propagar.

• Algunas definiciones:

– El elemento/columna i produce un acarreo o generando uno Nuevo o propaganda el que le llega a la entrada.

– Se definen señales Generar (Gi) y Propagar (Pi) para cada columna:

• La columna i generará un acarreo nuevo si Ai y Bi son ambos 1.

Gi = Ai Bi• La columna i propagará un acarreo de la entrada a la salida si Ai

o Bi son 1.

Pi = Ai + Bi• El acarreo de la columna i (Ci) es:

Ci = Ai Bi + (Ai + Bi )Ci-1 = Gi + Pi Ci-1

Generar

Propagar

Page 10: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Suma Carry-Lookahead

• Step 1: Calcula Gi y Pi para todas las columnas

• Step 2: Calcula G y P para los bloques de k-bits

• Step 3: Cin se propaga a través de cada bloque

de generar/propagar para k-bits.

Page 11: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Carry-Lookahead Adder• Ejemplo: bloques de 4-bits (G3:0 and P3:0) :

– G3:0 = G3 + P3 (G2 + P2 (G1 + P1G0 )

– P3:0 = P3P2 P1P0

• Generalizando,

– Gi:j = Gi + Pi (Gi-1 + Pi-1 (Gi-2 + Pi-2Gj )

– Pi:j = PiPi-1 Pi-2Pj

– Ci = Gi:j + Pi:j Ci-1

Page 12: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

32-bit CLA con bloques de 4-bits

B0

++++

P3:0

G3

P3

G2

P2

G1

P1

G0

P3

P2

P1

P0

G3:0

Cin

Cout

A0

S0

C0

B1

A1

S1

C1

B2

A2

S2

C2

B3

A3

S3

Cin

A3:0

B3:0

S3:0

4-bit CLA

BlockC

in

A7:4

B7:4

S7:4

4-bit CLA

Block

C3

C7

A27:24

B27:24

S27:24

4-bit CLA

Block

C23

A31:28

B31:28

S31:28

4-bit CLA

Block

C27

Cout

Page 13: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Retardo del Carry-Lookahead Adder

• Para un CLA de N-bit con bloques de k-bits:

• tCLA = tpg + tpg_block + (N/k – 1)tAND_OR + ktFA

– tpg : retardo para generar todos los Pi, Gi (solo dependen de Ai y Bi)

– tpg_block : retardo para generar todos los Pi:j, Gi:j

– tAND_OR : retardo desde Cin a Cout de la puerta AND/OR final en el bloque CLA de

k-bits

• Un sumador carry-lookahead de N-bits es, en general, mucho más rápido

que un ripple-carry adder para N > 16.

Page 14: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Prefix Adder

• Calcula el acarreo de entrada para cada

columna (Ci-1) y luego la suma:

Si = (Ai Bi) Ci

• Calcula G y P para bloques de 1-, 2-, 4-, 8-bits,

etc. hasta que todos los Gi se conocen

• log2N etapas

Page 15: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Prefix Adder• El acarreo de entrada o se genera en la columna anterior o se propaga desde

las previas.

• Definimos una columna auxiliar -1 para introducir Cin:

G-1 = Cin, P-1 = 0

• El acarreo de entrada de la columna i = acarreo de salida de la columna:

Ci-1 = Gi-1:-1

• Gi-1:-1: señal para las columnas i-1 a -1

• Ecuación de la suma:

– Si = (Ai Bi) Gi-1:-1

• Objetivo: Calcular rápidamente G0:-1, G1:-1, G2:-1, G3:-1, G4:-1, G5:-1, … (llamados prefijos)

Page 16: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Prefix Adder• Generar and propagar señales para un bloque que cubre los bits i:j:

Gi:j = Gi:k + Pi:k Gk-1:j

Pi:j = Pi:kPk-1:j

• En palabras:

– Generar: el bloque i:j generará acarreo si:

• La parte superior (i:k) genera un acarreo o

• La parte superior propaga un acarreo generado por la parte inferior (k-1:j)

– Propagar: el bloque i:j propagará un acarreo si tanto la parte superior como la inferior lo propagan.

Page 17: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Esquema del Prefix Adder

0:-1

-1

2:1

1:-12:-1

012

4:3

3

6:5

5:36:3

456

5:-16:-1 3:-14:-1

8:7

7

10:9

9:710:7

8910

12:11

11

14:13

13:1114:11

121314

13:714:7 11:712:7

9:-110:-1 7:-18:-113:-114:-1 11:-112:-1

15

0123456789101112131415

Bi

Ai

Gi:i

Pi:i

Gk-1:j

Pk-1:j

Gi:k

Pi:k

Gi:j

Pi:j

ii:j

Bi

Ai

Gi-1:-1

Si

iLegend

Page 18: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Retardo del Prefix Adder

tPA = tpg + log2N(tpg_prefix ) + tXOR

– tpg: retardo en producir Pi Gi (puerta AND o OR)

– tpg_prefix: retardo de las celdas de prefijo negras (AND + OR)

Page 19: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

Comparación de retardo de sumadores

• Compara el retardo de: sumadores de 32-bit

ripple-carry, carry-lookahead, y prefix adder

• CLA tiene bloques de 4-bits

• Retado de puerta de 2 entradas = 100 ps;

• Retardo de full adder = 300 ps

Page 20: Lógica Combinacional en VHDL (II) - Cartagena99 · 2020. 3. 11. · Implementación en VHDL library IEEE; use IEEE.STD_LOGIC_1164.all; entity fulladder is port(a, b, cin: in STD_LOGIC;

• Compara retardo de: 32-bit ripple-carry, carry-lookahead, y prefix adder

• CLA tiene bloques de 4-bits

• Retado de puerta de 2 entradas = 100 ps;

• Retardo de full adder = 300 ps

tripple = NtFA = 32(300 ps)

= 9.6 ns

tCLA = tpg + tpg_block + (N/k – 1)tAND_OR + ktFA

= [100 + 600 + (7)200 + 4(300)] ps

= 3.3 ns

tPA = tpg + log2N(tpg_prefix ) + tXOR

= [100 + log232(200) + 100] ps

= 1.2 ns

Comparación de retardo de sumadores