DESIGN AV KOMBINATORISK LOGIK Innehåll Fördröjninar i kombinatorisk loik Byblock för kombinatorisk loik Multilexer / De-multilexer Kodare / Avkodare Aritmetiska Funktioner
GATE-DELAYS Gate-delay är tiden det tar för en ändrin å en inån att resultera i en ändrin å utånen. A B & Z t LH Proaation delay Low-to-Hih A Hih-to-Low B Z t LH t HL t HL Mäts från där sinalen nådde 5% av sitt slutiltia värde. Coyriht (c) Miun 4
FÖRDRÖJNINGAR I KOMBINATORISK LOGIK Bestäm fördröjninen i ett kombinatoriskt nätverk. Loisk funktion A B f C D C B A D t -cf f t -df Fördröjninar för alla sinalväar: t HL-af, t LH-af t HL-bf, t LH-bf t HL-cf, t LH-cf t HL-df, t LH-df Den länsta väen I nätverket (t -cf eller t -df ): T -cf =. +.35 +.47 ns =.3 ns Gate delays från datablad Gate Inv and or3 Delay tlh =. thl =.9 tlh =.3 thl =.35 tlh =.47 thl =.43 Coyriht (c) Miun 4 3
MULTIPLEXER / DEMULTIPLEXER Väljer varifrån oerand A tas A A B B Väljer varifrån oerand B tas Sa MUX MUX Sb A B Sum Väljer var summan ska skickas (S eller S) DEMUX Ss S S Coyriht (c) Miun 4 4
4-TO- MULTIPLEXER I VHDL architecture rtl of mux4_ is bein -- rtl rocess (I, I, I, I3, S, S) variable sel: bit_vector( downto ); bein -- rocess comb sel := S & S; case sel is when "" => Y <= I; when "" => Y <= I; when "" => Y <= I; when others => Y <= I3; end case; end rocess; end rtl; Alla inånar 4- Multilexer Konkatenerar bitarna till en bitvektor så att man enkelt kan hantera casesatserna I I I I3 S S Y Coyriht (c) Miun 4 5
GENERELL N -TO- MULTIPLEXER library IEEE; use IEEE.STD_LOGIC_64.all; use IEEE.STD_LOGIC_ARITH.all; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity muxn_ is eneric ( N : inteer := 3); -- lo(number of inuts) ort ( I: in std_loic_vector((**n - ) downto ); S: in std_loic_vector(n- downto ); Y : out std_loic); end muxn_; architecture rtl of muxn_ is bein -- rtl rocess (I, S) variable v_s : inteer; bein v_s := conv_inteer(s); Y <= I(v_S); end rocess; end rtl; Möjliör arametriserade komonenter N n - Multilexer Konverterar sinalen S från bitvektor till Inteer (v_s) Använd v_s för att avöra vilken av inånarna som ska tilldelas till utånen Y. I S N Y Coyriht (c) Miun 4 6
DEMULTIPLEXER -4 Demultilexer Y architecture rtl of demux_4 is bein rocess (A, S, S) S bein case S&S is when "" => Y <= A; Y <= ; Y <= ; Y3 <= ; when "" => Y <= ; Y <= A; Y <= ; Y3 <= ; when "" => Y <= ; Y <= ; Y <= A; Y3 <= ; when others => Y <= ; Y <= ; Y <= ; Y3 <= A; end case; end rocess; end rtl; A S Y Y Y3 Coyriht (c) Miun 4 7
AVKODARE I ALLMÄNHET Avkodare (Decoder) Kombinatoriskt nät med en eller fler inånar, och fler än en utån. Antalet inånar är samma eller färre än antalet utånar. Konverterar en inut-code till en outut-code One-to-one main För varje inut-code finns det endast en outut-code Avkodare Inut-code Outut-code Coyriht (c) Miun 4 8
AVKODARE/KODARE I ALLMÄNHET Kodare/Avkodare Binary Gray BCD- One-hot Any code Binary Gray BCD One-hot Any code Coyriht (c) Miun 4 9
-4 BINÄR AVKODARE I VHDL architecture rtl of decoder 4 is bein -- rtl I rocess (I, I) I variable I : bit_vector( downto ); bein -- rocess I := I & I; case I is when "" => Y3 <= ; Y <= ; Y <= ; Y <= ; when "" => Y3 <= ; Y <= ; Y <= ; Y <= ; when "" => Y3 <= ; Y <= ; Y <= ; Y <= ; when "" => Y3 <= ; Y <= ; Y <= ; Y <= ; end case; end rocess; end rtl; -4 decoder Y Y Y Y3 Coyriht (c) Miun 4
N-TO- N BINÄR AVKODARE entity decoder_n_m is eneric ( n : inteer := 3; -- number of inuts m : inteer := 8); -- number of oututs (=**n) ort ( I: in std_loic_vector(n- downto ); Y: out std_loic_vector(m- downto ) ); end decoder_n_m; n n to n decoder Konverterar sinalen I till en inteer I Y n architecture rtl of decoder_n_m is bein rocess(i) variable v_i: inteer; -- inteer values for inut bein v_i := conv_inteer(i); Y <= conv_std_loic_vector(**v_i,m); end rocess; end architecture; Konverterar det avkodade värdet från inteer till en m-bitars bitvektor. Coyriht (c) Miun 4
EXEMPEL PÅ AVKODARE 7-sement dislay LED (Liht Emittin Diode) Drivkretsar Avkodare LCD (Liquid Crystal Dislay) BCD inut-tal Coyriht (c) Miun 4
7-SEGMENT DISPLAY Varje sement är en LED som kan slås å searat För att visa siffran 5 ska sementen a, f,, c och d lysa. Coyriht (c) Miun 4 3
AVKODARE FÖR 7-SEGM. DISPLAY Inut-kod: BCD (tal från till 9) Outut-kod: 7-sements-kod Nr D C B A a b c d e f 3 4 5 6 7 8 9 A B C D a b c d e f Coyriht (c) Miun 4 4
7-SEGMENTS DISPLAY Common anode Common cathode Oututs är active low Oututs är active hih Coyriht (c) Miun 4 5
7-SEGMENTS AVKODARE I VHDL Generell avkodare Kan driva både Common cathode och Common anode dislayer entity ss_decoder is eneric ( cc_ca : bit := ); ort ( Ai, Bi, Ci, Di: in bit; a, b, c, d, e, f, : out bit ); end ss_decoder; / Ai Bi Ci Di cc_ca a b c d e f Väljer om avkodaren driver en common cathode eller en common anode dislay Coyriht (c) Miun 4 6
FORTS. 7-SEGMENT AVKODARE I VHDL architecture rtl of ss_decoder is bein -- rtl rocess (Ai, Bi, Ci, Di) variable BCD_strin : bit_vector(3 downto ); variable control_strin : bit_vector(6 downto ); bein -- rocess BCD_strin := Di & Ci & Bi & Ai; case BCD_strin is when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when "" => control_strin := ""; when others => control_strin := ""; end case; Skaa en bitvektor för inut-koden Coyriht (c) Miun 4 7
FORTS. 7-SEGMENT AVKODARE I VHDL -- Common Cathode if cc_ca = then a <= control_strin(6); b <= control_strin(5); c <= control_strin(4); d <= control_strin(3); e <= control_strin(); f <= control_strin(); <= control_strin(); -- Common Anode else a <= not control_strin(6); b <= not control_strin(5); c <= not control_strin(4); d <= not control_strin(3); e <= not control_strin(); f <= not control_strin(); <= not control_strin(); end if; end rocess; end rtl; Sinaler är active hih för common cathode Sinaler är active low för common anode, och måste inverteras Coyriht (c) Miun 4 8
EXEMPEL PÅ ANVÄNDNING AV BINÄR 4- KODARE Enhet 3 larm 4- kodare Enhet larm Enhet larm u 3 u u u a a A= Enhet larm Enhet larmar A= Vad händer om två enheter larmar samtidit? Coyriht (c) Miun 4 9
PRIORITETSKODARE Inånarna har inbördes rioritet När fler än en inån är aktiv så enereras en kod för den inån som har höst rioritet Exemel: Låt insinal 3 ha höst rioritet, näst höst, o.s.v rioriterin 4- kodare c 3 c c c 3 u 3 u u u a a 3 = c 3 = c c 3 = c c 3 c = c c 3 c c Coyriht (c) Miun 4
PRIORITETSKODARE Inbördes rioritet för inånarna Om fler än en inut är aktiv enereras en kod för inånen med höst rioritet rioencoder library IEEE; use IEEE.STD_LOGIC_64.all; entity rioencoder is ort ( C3, C, C, C: in std_loic; A, A : out std_loic); end rioencoder; riority c 3 c c c 3 4- coder u 3 u u u a a Coyriht (c) Miun 4
FORTS. PRIORITETSKODARE architecture rtl of rioencoder is bein -- rtl rocess (C3, C, C, C) variable out_vector : std_loic_vector( downto ); bein if C3= then out_vector := "; elsif C = then out_vector := "; elsif C = then out_vector := "; elsif C= then out_vector := "; end if; A <= out_vector(); A <= out_vector(); end rocess; end rtl; Coyriht (c) Miun 4
ADDERARE Carry-Rile Adder Enkel Lånsam a N- b N- a 3 b 3 a b a b a b c out a b FA c out c in a b FA c out c in a b FA c out c in a b FA c out c in a b FA c out c in c in s N- s 3 s s s Fördröjnin för en n- bitars adderare är nt FA Coyriht (c) Miun 4 3
CARRY-LOOKAHEAD-ADDER Snabb adderare Accelererar beräkninen av carry-bitarna Princi: Betrakta flera bitar å samma ån. Exemel: + X Y + X Y S S I en carry-rile adderare betraktar vi endast en bit i taet, och resultatet från föreående osition används. I en Carry-Lookahead Adderare betraktas även bitarna i osition när vi tar fram carry in för osition. Coyriht (c) Miun 4 4
LOGIK FÖR CARRY-LOOKAHEAD Loik för att beräkna carry-bitarna + X Y S x i y i x i- y i- x i+ y i+ a b FA c in Carry-Lookahed Loic c i S i Seciell loik för att beräkna carry Coyriht (c) Miun 4 5
LOGIK FÖR CARRY-LOOKAHEAD Loik för Carry-Lookahead baseras å två funktioner Carry enerate: i x i y i Addition i osition i enererar en carry om den roducerar en carry= oberoende av värdena å x i-, y i-, x, y, c Carry roaate: i x i y i Addition i osition i roaerar en carry om den roducerar en carry= (c i+ ) när x i-, y i-, x, y, c roducerar en carry-in (C i =) Ett ste i adderaren enererar en carry (c i+ ): c i i i c i Om inånarna (x i, y i ) antinen enererar en carry ( i =) eller det steet roaerar ett carry-in från ett tidiare ste ( i =) Coyriht (c) Miun 4 6
EXEMPEL: FUNKTIONER FÖR PROPAGATE OCH GENERATE X + Y i i i c i x x i i i i i y y i c X Y + C S Addition utan carry-roaation Coyriht (c) Miun 4 7
Coyriht (c) Miun 4 UTVECKLA UTTRYCK FÖR CLA-LOGIK 8 Utveckla uttryck för c, c, c 3 och c 4 c c c c ( ) c c 3 c c ( ) c c 3 3 3 4 c c ( ) 3 3 c 3 3 3 3 3 c c, c, c 3 och c 4 är funktioner av och
-BIT CLA ADDERARE X[-8] Y[-8] X[7-4] Y[7-4] X[3-] Y[3-] P G P G Länsta fördröjnin P G P[-8] G[-8] P[7-4] G[7-4] P[3-] G[3-] CLA-L C8 CLA-L C4 CLA-L X[-8] Y[-8] C[-8] X[7-4] Y[7-4] C[7-4] X[3-] Y[3-] C[3-] ADD ADD ADD S[-8] S[7-4] S[3-] Coyriht (c) Miun 4 9
EXEMPEL: SYNTETISERING AV EN ADDERARE VHDLdescrition Delay Constraints 35 Delay [ns] CLA adder Rile adder 5 Synthesis tool Area CLA adder 7 Gatenetlist Reort file Rile adder Coyriht (c) Miun 4 3
ADDERARE I VHDL library IEEE; use IEEE.STD_LOGIC_64.all; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity add is eneric ( N : inteer := 3); Inkluderas så att + funerar för datatyen std_loic ort ( X, Y : in std_loic_vector(n- downto ); S : out std_loic_vector(n- downto ); Cout : out std_loic); end add; architecture rtl of add is bein -- rtl add_sub : rocess (X, Y) variable sum : std_loic_vector(n downto ); bein -- rocess add_sub sum := ( & X) + ( & Y); S <= sum(n- downto ); Cout <= sum(n); end rocess add; end rtl; &X används eftersom + ska returnera en summa å N+ bitar Sum (S) är de N minst sinifikanta bitarna Carry-out är den mest sinifikanta biten Coyriht (c) Miun 4 3
MULTIPLIKATION I VHDL library IEEE; use IEEE.STD_LOGIC_64.all; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity multilicator is eneric ( N : inteer := 3); ort ( X, Y : in std_loic_vector(n- downto ); P : out std_loic_vector(*n- downto ); end multilicator; architecture rtl of multilicator is bein -- rtl rocess (X, Y) bein -- rocess P <= X*Y; end rocess; end rtl; Inkluderas så att * funerar för datatyen std_loic Antalet bitar i rodukten är summan av antalet bitar hos oeranderna Coyriht (c) Miun 4 3
SLUT PÅ FÖRELÄSNING 5 Innehåll Fördröjninar i kombinatorisk loik Byblock för kombinatorisk loik Multilexer / De-multilexer Kodare / Avkodare Aritmetiska Funktioner Coyriht (c) Miun 4 33