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.
© Copyright 2024 ExpyDoc