LOGIKI TERVEZÉS PROGRMOZHTÓ ÁRMKÖRÖKKEL Elő Előadó: Dr. Oniga István
Funkcionális kombinációs ió egységek következő funkcionális egységek logikai felépítésével, és működésével foglalkozunk: kódolók, dekódolók, multiplexerek, demultiplexerek, komparátorok, összeadok, paritásvizsgáló áramkörök.
Kódolók kódoló egy olyan áramkör amelynek bármelyik az m - ből bemenetének az aktiválása esetén egy k bites kódot szolgál m Y a decimális CD átalakító r n I n r =,,,(k-) ), I Y 3 Y 2 Y Y I I I 2 I 3 I 4 I 5 I 6 I 7 I 8 I 9 Decimális bemenet 2 3 4 5 6 7 8 9 2 4 8 CD kimenet
Decimális CD átalakító táblázat alapján felírhatók az egyes kimeneteket megvalósító logikai függvények Y =I +I 3+I 5+I 7+I 9 Y =I 2 +I 3 +I 6 +I 7 I Y 3 Y 2 Y Y I I I 2 I 3 I 4 I 5 I 6 Y 2 =I 4 +I 5 +I 6 +I 7 Y 3 =I 8 +I I 7 9 I 8 I 9
Decimális CD átalakító strukturális leírása module CDmod( input [9:] din, output [3:] led ); assign led[]=din[] din[3] din[5] din[7] din[9]; di [] di [3] di [5] di [7] di [9] assign led[]=din[2] din[3] din[6] din[7]; assign led[2]=din[4] din[5] din[6] din[7]; assign led[3]=din[8] din[9]; din[8] din[9]; endmodule NET "led<>" LOC="P59" ; NET "led<>" LOC="P58" ; NET "led<2>" LOC="P54" ; NET "led<3>" LOC="P53" ; NET "din<>" LOC="P" ; NET "din<>" LOC="P95" ; NET "din<2>" " LOC="P89" ; NET "din<3>" LOC="P84" ; NET "din<4>" LOC="P78" ; NET "din<5>" LOC="P69" ; NET "din<6>" LOC="P48" ; NET "din<7>" LOC="P47" ; NET "din<8>" LOC="P4" ; NET "din<9>" LOC="P38" ;
Decimális CD átalakító procedurális leírása // 3-it -of-9 Priority Encoder // 3-it -of-9 Priority Encoder module v_priority_encoder_ (sel, code); input [7:] sel; output [2:] code; reg [2:] code; always @(sel) begin if (sel[]) code = 3'b; else if (sel[]) code = 3'b; else if (sel[2]) code = 3'b; else if (sel[3]) code = 3'b; else if (sel[4]) code = 3'b; else if (sel[5]) code = 3'b; else if (sel[6]) code = 3'b; else if (sel[7]) code = 3'b; else code = 3'bxxx; end endmodule module v_priority_encoder_ (input [7:] sel, output [2:] reg code); always @(sel) begin if (sel[]) code = 3'b; else if (sel[]) code = 3'b; else if (sel[2]) code = 3'b; else if (sel[3]) code = 3'b; else if (sel[4]) code = 3'b; else if (sel[5]) code = 3'b; else if (sel[6]) code = 3'b; else if (sel[7]) code = 3'b; else code = 3'bxxx; end endmodule
Dekódolók dekódoló (dekóder) egy olyan áramkör amely a bemenetire adott kód alapján dekódoló (dekóder) egy olyan áramkör amely a bemenetire adott kód alapján egyetlen kimenetet tesz aktívvá Egy bináris dekódolónak n bemenete és 2n kimenete van (ezek közül egyidejűleg csak egy lehet aktív logikai értékű).
ináris i dekódoló 2-ról 4-re
reg [3:] output; wire [:] select; wire enable; always @( * ) if (enable) else output <=; case (select) 2'b : output <= 4'b; 2'b : output <= 4'b; 2'b : output <= 4'b; 2'b : output <= 4'b; default : output <= 4'b; endcase Decoder wire [3:] output; wire [:] select; wire enable; assign output = enable << (select);
i á i d kód 3 ól 8 ináris dekóder 3-ról 8-ra 2 Y Y Y2 Y3 Y4 Y5 Y6 Y7 dekóder elvi rajza
ináris i dekóder 3-ról 8-ra Verilog leírása module decod( input, input, input 2, output [7:] led ); assign led[]=~&~&~2; assign led[]=&~&~2; assign led[2]=~&&~2; assign led[3]=&& 2; assign led[4]=~&~&2; assign led[5]=&~&2; assignled[6]= &&2; assign led[7]=&&2; endmodule NET "" LOC="P4" ; NET "" LOC="P38" ; NET "2" LOC= P36 ; NET "led<>" LOC="P59" ; NET "led<>" LOC="P58" ; NET led<2> LOC="P54" ; NET "led<3>" LOC="P53" ; NET "led<4>" LOC="P52" ; NET "led<5>" LOC="P5" ; NET "led<6>" LOC="P5" ; NET "led<7>" LOC="P43" ;
MUX-DEMUX Kevés számú adathordozó (vezeték, rádióhullám, stb.) igénybevételével - nagy számú jelek továbbítására alkalmas. datgyűjtés, adatelosztás nalóg multiplexelés, digitális multiplexelés yte vagy bitszervezésű multiplexelés Időmultiplexelés vagy címszerinti multiplexelés
MULTIPLEXEREK multiplexer olyan digitális kapcsoló amelyik m (m=2 n ) különböző forrásból multiplexer olyan digitális kapcsoló, amelyik m (m=2 n ) különböző forrásból származó adatokat kapcsol egy kimenetre. kiválasztó bemenetek határozzák meg, hogy melyik adatforrás jele kerül a kimenetre 2 n fél adathoz 2 n különböző cím kell 2 n különböző címet n bittel tudunk előállítani,
Példa MUX 2 2: multiplexer l module mux_2 (input in, in, sel, output r); assign r = (sel== b)? in : in; endmodule module mux_2 (input in, in, sel, output reg r); always @ (*) if (sel== b) r <= in; else r <= in; endmodule module mux_2 (input in, in, sel, output reg r); always @ (*) case(sel) b: r <= in; b: r <= in; endmodule ssign If Case
4 x MULTIPLEXER 4 féle adathoz két különböző címbit kell 4 vonalas multiplexer blokkdiagramja 4 vonalas multiplexer áramköri megvalósítása Cím választó MUX dat kimenet D D D dat bemenetek D2 D3 2 3 D D2 Y D3
Multiplexer l (4:) module mux_4 (input in, in, in2, in3, input [:] sel, output reg r); always @ (*) case(sel) 2 b: r <= in; 2 b: r <= in; 2 b: r <= in2; 2 b: r <= in3; endcase endmodule
Háromállapotú Multiplexer (4:) // // 4-to- -bit MUX using tristate buffers. // module v_multiplexers_3 (a, b, c, d, s, o); input a,b,c,d; input [3:] s; output o; assign o = s[3]? a :'bz; assign o = s[2]? b :'bz; assign o = s[]? c :'bz; assign o = s[]? d :'bz; endmodule
Háromállapotú vonalak Ketiranyu kommunikacios vonalak Mai FPG-kban belul l nincs HiZ buffer! Kétirányú kommunikációs vonalak, pl. Külső ő memóriák óiák adatbusza module tri_state (input clk, inout [7:] data_io); wire [7:] data_in, data_out; wire bus_drv; assign data_in = data_io; assign data_io = (bus_drv)? data_out : 8 bz; endmodule kétirányú vonalak meghajtását engedélyező jel (bus_drv) kritikus
Háromállapotú vonalak // Tristate Description Using Combinatorial lways lock // module v_three_st_ (T, I, I, O); input T, I, I; output O; reg O; always @(T or I) begin if (~T) O = I; else O = 'bz; bz; end assign O = O&I; assign O O & I; endmodule
Háromállapotú vonalak // // Tristate Description Using Concurrent ssignment // module v_three_st_2 (T, I, O); input T, I; output O; assign O = (~T)? I: 'bz; endmodule
Multiplexer er alkalmazási példák I Több digites 7 szegmenses kijelzők meghajtása egy CD/7 szegmenses dekóderrel 4 két bemenetű ( és ) multiplexer - 74LS57 CD/7 szegmenses dekóder - 74LS47 Vcc 2:4 dekóder 74LS39 2 5 Y4 O3 2 43 2Y7 7 4 3Y9 4Y2 2 6 C O D OC 2 OD 3 6 3 2 5 ~L OE9 3 4 ~R OF5 ~I/ OG4 34 T I 5~/ RO ~G G F E D C G F E D C C C 2 3 ~ G Y Y 4 5 Y 6 Y 7 2 3
Demultiplexerek erek demultiplexer egy olyan digitális kapcsoló, amely egy bemenő forrást n kimenet valamelyikére kapcsolja. Általában n-ből 2n re dekódolót használunk. dekódoló engedélyező jele a demultiplexer adatbemenete.
Digitális komparátorok Két szám között relációt jelzi, (egyenlő,, kisebb, nagyobb). három közül csak egy igaz Egy bites komparátor Komb. hál. fi < fi< fe= fs> fe = fs > f e f i f s
Legyen a két szám: Két bites komparátor I 2 2 Két bites számok akkor egyenlők, ha az azonos helyértékű bitek egyenlők F ( )( ) 2 2 = = = = = = = =
Két bites komparátor II Két bites komparátor II z egyenlőtlenségi relációkat jelző logikai függvények: < akkor igaz, ha <, ill. ha = és < > kk i h > ill h é > ) ( F > akkor igaz, ha >, ill. ha = és > ) ( F
Két bites komparátor III Két bites komparátor III F ) ( F F ) ( F < = > P P8 < P5 P2 = > < P3 P7 P6 P9 = > P3 P6 P4 >
Két bites komparátor III module compare_2_ algoritmikus ik (output t reg _lt_, _gt_, _eq_, input [:],); always @ ( or ) // Esemény figyelő begin _lt_ = ; _gt_ = ; _eq_ = ; if (==) _eq_ = ; else if (>) _gt_ = ; else _lt_ = ; end endmodule
Több bites komparátorok Négybites nagyság g komparátor SN 7485 típusú áramkör emenetei a két összehasonlítandó szám bitjei (,, 2, 3 és,, 2, 3) a bővítő bemenetek i<i, i=i, i>i, amelyekre az alacsonyabb helyértékű négy bit összehasonlításának eredményét kell adni. Kimenetei a relációkat jelzik (<, =, >). Komparátorok soros bővítése:
Komparátorok modellezése Verilogban // // Unsigned 8-bit Greater or Equal Comparator // module v_comparator_ (,, CMP); input [7:] ; input [7:] ; output CMP; assign CMP = ( >= )? 'b : 'b; endmodule
Paritásképzés és ellenőrzés HIFELISMERŐ ÉS HIJVÍTÓ KÓDOK Páros paritás Páratlan paritás Legegyszerűbb hibafelismerési eljárás: - paritásbit átvitele paritáselemes kód elve - egy adott kód kódszavát kiegészítjük úgy, hogy a kiegészített kódszóban az - esek száma páros, vagy páratlan legyen. páros paritás páratlan paritás P CD P CD paritás képzés hátrányai: Nem tudjuk kijavítani a hibát, ha detektáljuk is Ha egyszerre több bit hibásodik meg, nem biztos, hogy a paritásellenőrzés ő felfedezi, mert lehet, hogy egyszerre két (vagy páros számú) bit is megváltoztatja értékét. Legegyszerűbb paritásképző: XOR kapu x y x y x XOR y
Paritásellenőrző áramkör Paritásellenőrző áramkör 4 bites szavak részére 2 3 P P2 Y Y2 P3 Y3 P Paritás típus beállító jel: P Y3 P Y P4 Y 2 3 P = => Y = Y3 => páros paritás generáló P Y 2 3 Y Y2 Y3 P = => Y = Y3 => páratlan paritás generáló
Paritásellenőrző e ő ő áramkör áa module oddparity_for (output reg parity, input [7:] data); integer k; always@(data) begin parity = ; for (k = ; k <= 7; k = k+) begin if (data[k] == ) parity = ~parity; end endmodule end
datátviteli te rendszer e paritásellenőrzéssel e ő DÓ paritásgeneráló: - z adott jel biteket kiegészítjük a paritás bittel => a kiegészített kódszóban az -esek száma páros. VEVŐ paritásvizsgáló: - kiegészített kódszó - paritásellenőrzés ^ Jel bitek 2 3 P Y ^ 2 3 Paritás bit P Y Y ^ Paritás hiba jelző
Összeadok z összeadó áramkör (adder) bemenetek ésérkező számok az előző helyérték átvitel (Cin-carry) kimenetek az összeg (S) átvitel (Cout) é S ( C in C out k Fél összeadók (half adder) Teljes összeadók (full adder) Működési mód tekintetében: SOROS ÖSSZEDÓK PÁRHUZMOS ÖSSZEDÓK z operandusok kódolását tekintve: INÁRIS ÖSSZEDÓK CD ÖSSZEDÓK
Fél összeadok Nem veszik figyelembe az előző helyérték átvitelét Csak a legkisebb helyértéken használható S C S C 2
-bites fél összeadó Verilog strukturális modellje module half_add(output sum, carry, input a, b); xor (sum, a, b); and (carry, a,b); // exclusive OR // and endmodule
Teljes összeadok Figyelembe veszik az előző helyérték átvitelét i i C i- S i C i Teljes összeadó két félösszeadóból: i i ½Σ Σ S' i S i C ½Σ Σ i S i i i i i C C i i i C' i C'' Cout Cout Σ C i i i C i- i C i C i- C i S i
Verilog nested structural model of a -bit full-adder with carry with port connection by position module full_add(output sum_out, carry_out, input a_in, b_in, carry_in); endmodule wire w, w2, w3; half_add M (w, w2, a_in, b_in); half_add M2 (sum_out, w3, carry_in, w); or (carry y_ out, w2, w3);
Verilog nested structural model of a -bit full-adder with carry with port connection by name module full_add(output sum_out, carry_out, input a_in, b_in, carry_in); endmodule wire w, w2, w3; half_add M (.a(a_in),.sum(w),.b(b_in),.carry(w2)); half_add add M2 (.sum(sum_out),.b(w),.carry(w3),.a(carry_in)); or (carry_out, w2, w3);
Példa bit bites összeadó module add_full (input a, b, cin, output cout, s); xor3_m xor(.i(a),.i(b),.i2(cin),.o(s)); wire a, a, a2; and2_m and(.i(a),.i(b),.o(a)); and2_m and(.i(a),.i(cin),.o(a)); and2_m and2(.i(b),.i(cin),.o(a2)); or3_m or(.i(a),.i(a),.i2(a2),.o(cout)) endmodule module add_full (input a, b, cin, output cout, s); assign s = a ^ b ^ cin; assign cout = (a & b) (a & cin) (b & cin); endmodule module add full (input a b cin output cout s); module add_full (input a, b, cin, output cout, s); assign {cout, s} = a + b + cin; endmodule
Cin Sum Cout
Több bites összeadók I több bites számokat teljes összeadókból építhetjük meg Soros átvitelű 4 bites összeadó (Ripple carry adder): 7483 4 4 3 3 2 2 C C in C in C in C in C out C out C out C out C 4 C 3 S C S 3 C 2 S S Lassú S i és C i eredményt csak azután kapjuk meg amikor C i- felvette végső értékét
Példa 4 bites összeadó module add4 (input [3:] a, b, output [4:] s); wire [3:] cout; add_full add(.a(a[]),.b(b[]),.cin('b),.cout(cout[]),.s(s[])); add_full add(.a(a[]),.b(b[]),.cin(cout[]),.cout(cout[]),.s(s[])); add_ full add2(.a(a[2]), (.b(b[2]),.cin(cout[]),.cout(cout[2]),.s(s[2])); add_full add3(.a(a[3]),.b(b[3]),.cin(cout[2]),.cout(s[4]),.s(s[3])); endmodule module add4 (input [3:] a, b, output [4:] s); assign s = a + b; endmodule
Példa 4 bites összeadó, str.
Példa 4 bites összeadó, +
Példa 4 bites összeadó, + IUF IUF [3] I b_ibuf[3] IUF O [3] [3] [3] LUT2_6 XORCY [3] OUF [4] I O s_obuf[4] [4] [4:] s[4:] IUF [2] I b_ibuf[2] IUF O [3] I [2] a_ibuf[3] O LUT2_6 [3] s_axb_3 MUXCY_L s_s_3 MUXCY S OUF [3] I O s_obuf[3] [3] [] I O [2] I O [] [2] b_ibuf[] a_ibuf[2] [2] [2] s_axb_2 S [2] DI LO [3] DI CI O [4] OUF [2] I O [2] b[3:] [3:] [] I IUF b_ibuf[] O [] I [] IUF a_ibuf[] O [] [] [] LUT2_6 s_axb_ [] DI MUXCY_L S LO CI s_cry_2 s_cry_3 XORCY [2] s_obuf[2] OUF [] I O [] a[3:] [3:] [] I IUF a_ibuf[] O [] [] [] LUT2_6 s_axb_ [] [] S [] DI MUXCY_L LO CI s_cry_ s_s_2 XORCY [] s_obuf[] OUF [] I O [] CI s_s_ s_obuf[] s_cry_
RITMETIKI-LOGIKI EGYSÉGEK (LU) LU minden processzorban van, de önálló, diszkrét áramkörként is gyártják. z LU egy kombinációs hálózat - a bemeneteikre érkező két számmal ( és ) - S bemeneteken megadott logikai vagy aritmetikai műveletet végzik el - az eredményt az F kimeneteken jelenítik meg. - Összeadás és kivonás művelet elvégzésekor figyelembe veszik az előző helyérték átvitelét (Cn), és az előállított átvitelt továbbítják a következő helyértékre (C). Műveletek: bináris aritmetikai utasítások (összeadás, kivonás, stb.), logikai műveletek (ND, OR, stb.), regiszterműveletek (jobbra-balra léptetés, inkrementálás, dekrementálás),
4-bites LU - 74LS8 Két 4-bites operandus (, ) 4 bites eredmény (F) Átvitel: CarryIn/ Out S2: ritmetikai/ logikai mód választó(mux) S, S: művelet kiválasztó Jelzőbitek: carry-in, carry-outátviteleket, előjel bitet(sign), túlcsordulást(overflow), alulcsordulást(underflow).
ITES TELJES KIVONÓ
4-bites teljes kivonó -=+(-) +( ) - N = (2) N -=+ (2) N (2) =+ 3 2 3 2 3 2 3 2 4 ITES ÖSSZEDÓ C S3 S2 S S S 3 S 2 S S
biteslu (LU = arithmetic + logic unit) C in_i =C out_i- C in_ =F
Optimalizált bites LU C in_i i = C out_i- C in_ =F
Optimalizált 4 bites LU Összeadás: Mode = => b i i =b i Kivonás: Mode = => b i =b i
4 bites teljes összeadó