1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1

Sčítačky
Válcový posouvač
INP
Demonstrační cvičení 6
Poloviční sčítačka (Half Adder)
A
0
0
1
1
B
0
1
0
1
S
0
1
1
0
C
0
0
0
1
A
B
S:
S
HA
C
C:
A
0 1
1 0
B
A
0 0
0 1
S <= A xor B;
C <= A and B;
B
Úplná sčítačka (Full Adder)
A
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
CI
0
1
0
1
0
1
0
1
S COUT
0 0
A
1 0
S
1 0 B
FA
0 1
COUT
CI
1 0
0 1
0 1
COUT:
S:
A
A
1 1
0 0 1 0
0 1 0 1
0 1 1 1 B
1 0 1 0
CI
B
CI
S <= A xor B xor Cin;
COUT <= (A and B) or (A and CI) or (B and CI);
Dataflow
VHDL:
Úplná sčítačka
Poloviční sčítačka
library IEEE;
use IEEE.std_logic_1164.all;
entity HA is
port (
A, B : in std_logic;
S, C : out std_logic);
end HA;
architecture RTL of HA is
begin
S <= A xor B;
C <= A and B;
end RTL;
library IEEE;
use IEEE.std_logic_1164.all;
entity FA is
port (
A, B, CI : in std_logic;
S, COUT : out std_logic);
end FA;
architecture RTL of FA is
begin
S <= A xor B xor CI;
COUT <= (A and B) or (A and CI) or (B and CI);
end RTL;
Sčítačky: cena vs. rychlost
•
•
•
•
•
•
Sériová – levná, ale pomalá
S postupným přenosem
S přeskakováním přenosu
CLA - Carry Look Ahead
stromový CLA
a další
Sčítačky s postupným přenosem
(Carry Ripple Adders)
Sčítačka s postupným přenosem
genericky ve VHDL
N-bitová
sčítačka
library IEEE;
use IEEE.std_logic_1164.all;
entity RPADDER is
generic (N : in integer := 8);
port (
A, B : in std_logic_vector(N-1 downto 0);
CI
: in std_logic;
S
: out std_logic_vector(N-1 downto 0);
COUT : out std_logic);
end RPADDER;
architecture RTL1 of RPADDER is
component FA
port (
A, B, CI : in std_logic;
S, COUT : out std_logic);
end component;
signal C : std_logic_vector(A'length-1 downto 1);
begin
…
Architektura sčítačky genericky
begin
gen : for j in A'range generate
genlsb : if j = 0 generate
fa0 : FA port map (A => A(j), B => B(j),
CI => CI, S => S(j), COUT => C(1));
end generate;
genmid : if (j > 0) and (j < A'length-1) generate
fa0 : FA port map (A => A(j), B => B(j),
CI => C(j), S => S(j), COUT => C(j+1));
end generate;
genmsb : if j = A'length-1 generate
fa0 : FA port map (A => A(j), B => B(j),
CI => C(j), S => S(j), COUT => COUT);
end generate;
end generate;
end RTL1;
Sčítačky s CLA logikou
(Carry-Look Ahead Adders)
Rozšířená sčítačka
Ci
0
0
0
0
1
1
1
1
Ai
0
0
1
1
0
0
1
1
Bi
0
1
0
1
0
1
0
1
Si
0
1
1
0
1
0
0
1
Pi
0
1
1
0
0
1
1
0
Gi
0
0
0
1
0
0
0
1
Ci+1
0
0
0
1
0
1
1
1
Pi – šířený (propagate) přenos
Gi – generovaný přenos
Si = Ai ⊕ Bi ⊕ Ci
Pi = Ai ⊕ Bi
Gi = Ai.Bi
Ci+1 = Pi.Ci + Gi
Ai
Rozšířená sčítačka:
Bi
Ci+1
Si
Ci
Gi
Pi
Rozšířená sčítačka ve VHDL
library IEEE;
use IEEE.std_logic_1164.all;
entity FAPG is
port (
A, B, CI : in std_logic;
S, P, G : out std_logic);
end FAPG;
architecture RTL of FAPG is
signal Gsig, Psig : std_logic;
begin
Gsig <= A and B;
Psig <= A xor B;
S
<= Psig xor CI;
G
<= Gsig;
P
<= Psig;
end RTL;
P - propagate
G - generate
Si = Ai ⊕ Bi ⊕ Ci
Pi = Ai ⊕ Bi
Gi = Ai.Bi
Ci+1 = Pi.Ci + Gi
4b sčítačka s CLA logikou
A3
4∆
S3
3∆
B3
A2
B2
3∆
C3
A1
B1
3∆
C2
S2
4∆ G2 P2
G3 P3
GP (zde již nevyužito)
GG=CO (3∆)
S1
4∆
G1 P1
A0
3∆
C1
S0
2∆
B0
C0
G0 P0
4b CLA
C0=CI
C1=C0P0+G0
C2=C1P1+G1=C0P0P1+G0P1+G1
C3=C2P2+G2=C0P0P1P2+G0P1P2+G1P2+G2
C4=C3P3+G3=C0P0P1P2P3+G0P1P2P3+G1P2P3+G2P3+G3
GP
Obecně pro
N-bitovou CLA:
GG=CO
C0=CI
Ci=C0Pi-1+Gi-1 pro 1<i≤N, kde GN-1=CO
CI
library IEEE;
use IEEE.std_logic_1164.all;
entity CLAU is
port (
P, G
: in std_logic_vector(3 downto 0);
CI
: in std_logic;
CO
: out std_logic_vector(3 downto 0);
GP, GG : out std_logic);
end CLAU;
architecture RTL of CLAU is
begin
CO(0) <= CI;
CO(1) <= (CI and P(0)) or
G(0);
CO(2) <= (CI and P(0) and P(1)) or
(G(0) and P(1)) or
G(1);
CO(3) <= (CI and P(0) and P(1) and P(2)) or
(G(0) and P(1) and P(2)) or
(G(1) and P(2)) or
G(2);
GG
<= (G(0) and P(1) and P(2) and P(3)) or
(G(1) and P(2) and P(3)) or
(G(2) and P(3)) or
G(3);
GP
<= P(3) and P(2) and P(1) and P(0);
end RTL;
4b CLA
Složitost CLA obvodu
• Kvadratická závislost plochy CLA jednotky
na počtu bitů sčítačky!
• U 16b-CLA je to už neúnosné...
• Proto pět 4b-CLA sestavíme do „stromu“
(víceúrovňová CLA logika) pro vytvoření
16b sčítačky.
16b sčítačka s 4b CLA (strom CLA)
A15 B15 A14 B14 A13 B13 A12 B12
S15
P15
S14
S13
S12
C15
C14
C13
G15
P14
P13
G14
A11 B11 A10 B10 A9 B9
S11
C12
G13
P12
P11
G12
S10
S9
S8
C11
C10
C9
G11
P10
CLAU
GP3
GG3
A8 B8
P9
G10
A7 B7
S7
C8
G9
P7
P8
A6 B6
GP2
GG2
S5
S4
C7
C6
C5
G7
G8
P5
P6
G6
A3 B3
S3
C4
G5
P3
P4
A2 B2
GC2
GG=CO
Popis ve VHDL
GP1
GG1
A1 B1
A0 B0
S2
S1
S0
C3
C2
C1
G3
G4
P1
P2
CLAU
GP (nevyužito)
entity CLA16 is
port (
A, B : in std_logic_vector(15 downto 0);
CI : in std_logic;
S : out std_logic_vector(15 downto 0);
CO : out std_logic);
end CLA16;
A4 B4
S6
CLAU
GC3
A5 B5
G2
C0
G1
P0
G0
CLAU
GC1
GP0
GG0
GC0
CLAU
architecture RTL of CLA16 is
component FAPG
port (
A, B, CI : in std_logic;
S, P, G : out std_logic);
end component;
CI
component CLAU
port (
P, G : in std_logic_vector(3 downto 0);
CI : in std_logic;
CO : out std_logic_vector(3 downto 0);
GP, GG : out std_logic);
end component;
Stromová CLA ve VHDL (pokrač.)
claugen : for i in 0 to N-1 generate
clau0 : CLAU port map (P => P(i*4+3 downto i*4),
G => G(i*4+3 downto i*4), CI => GC(i),
CO => C(i*4+3 downto i*4),
GP => GP(i), GG => GG(i));
end generate;
constant N : integer := 4; -- number of 4 bits
signal P, G, C : std_logic_vector(N*4-1 downto 0);
signal GP,GG,GC : std_logic_vector(N-1 downto 0);
begin
fagen : for i in 0 to N*4-1 generate
fapg0 : FAPG port map (A => A(i), B => B(i),
CI => C(i), S => S(i), P => P(i), G => G(i)
);
end generate;
A15 B15 A14 B14 A13 B13 A12 B12
S15
P15
S14
S13
S12
C15
C14
C13
G15
P14
P13
G14
A11 B11 A10 B10 A9 B9
S11
C12
G13
P12
P11
G12
S9
S8
C11
C10
C9
P10
CLAU
GP3
GP (nevyužito)
GG=CO
GG3
A8 B8
S10
G11
P9
G10
clau1 : CLAU port map (P => GP, G => GG,
CI => CI, CO => GC, GP => open, GG => CO);
end RTL;
A7 B7
S7
C8
G9
P7
P8
A6 B6
GP2
GG2
A4 B4
S6
S5
S4
C7
C6
C5
G7
G8
P5
P6
CLAU
GC3
A5 B5
G6
A3 B3
S3
C4
G5
P3
P4
GP1
GG1
A1 B1
A0 B0
S2
S1
S0
C3
C2
C1
G3
G4
P1
P2
CLAU
GC2
A2 B2
G2
C0
G1
P0
G0
CLAU
GC1
GP0
GG0
GC0
CLAU
CI
Válcový posouvač
(Barrel Shifter)
• pro posuvy a rotace (v 1 taktu)
• neimplementuje se pomocí posuvného
registru, vždy pouze jako kombinační
obvod!
a0
a1
a2
a3
0
1
2
3
x
y
0
1
2
3
x
y
0
1
2
3
x
y
0
1
2
3
x
y
2
mpx
b0
mpx
b1
4b válcový
posouvač
pro rotace
vpravo
b3 b2 b1 b0
mpx
mpx
b2
b3
↓
↓ ↓
↓
a3 a2 a1 a0
a0 a3 a2 a1
a1 a0 a3 a2
a2 a1 a0 a3
0 bit
1 bit
2 bit
3 bit
Válcový posunovač (16b)
- 16 x 16-vstupový multiplexor – drahé řešení
- multiplexory (2,2,2,2) – levnější (64 x 2-MUX)
0
1
2
3
4 .
..
8
15
0
1
3
4 .
..
.
..
7
..
.
..
.
(2, 2, 2, 2)
.
..
..
.
15
0, 8
0, 4
0, 2
0, 1
∆
∆
∆
∆
Τ = 4∆
Válcový posunovač (16b)
library IEEE;
use IEEE.std_logic_1164.all;
entity BARREL is
port (
IN0
: in std_logic_vector(15 downto 0);
S
: in std_logic_vector( 3 downto 0);
Y
: out std_logic_vector(15 downto 0));
end BARREL;
architecture RTL1 of BARREL is
constant
N
: integer := 16;
constant
M
: integer := 4;
type arytype is array(M downto 0) of
std_logic_vector(N-1 downto 0);
signal INTSIG, SHIFT, PASS : arytype;
signal ZEROS : std_logic_vector(N-1 downto 0);
begin
ZEROS <= (others => '0');
INTSIG(0) <= IN0;
muxgen : for j in 1 to M generate
PASS(j) <= INTSIG(j-1);
SHIFT(j) <= INTSIG(j-1)(N-2**(j-1)-1 downto 0) &
ZEROS(2**(j-1)-1 downto 0);
INTSIG(j) <= PASS(j) when S(j-1) = '0' else SHIFT(j);
end generate;
Y <= INTSIG(M);
end RTL1;
Úlohy:
- Navrhněte 16b válcový
posouvač s multiplexory (2,4,2),
- Navrhněte 4b válcový
posouvač (4) pro rotaci vlevo
Literatura
• Drábek, V.: Výstavba počítačů, skriptum
VUT v Brně, 1995.
• Wakerly, J. F.: Digital Design: Principles
and Practices
• Chang, K. C.: Digital Design and
Modeling with VHDL and Synthesis.
• Chang, K. C.: Digital Systems Design
with VHDL and Synthesis.