LOGIKI TERVEZÉS HRDVERLEÍRÓ NYELVEN Dr. Oniga István
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 B Komb. hál. fi <B fe =B fs >B B fi<b fe=b fs>b f e = B = B+ B= B+ B f i = B f s = B
Két bites komparátor III module compare_2_ algoritmikus (output reg _lt_b, _gt_b, _eq_b, input [:],B); always @ ( or B) // Esemény figyelő begin _lt_b = ; _gt_b = ; _eq_b = ; if (==B) _eq_b = ; else if (>B) _gt_b = ; else _lt_b = ; end endmodule
Komparátorok modellezése Verilogban // // Unsigned 8-bit Greater or Equal Comparator // module v_comparator_ (, B, CMP); input [7:] ; input [7:] B; output CMP; assign CMP = ( >= B)? 'b : 'b; endmodule
Paritásellenőrző áramkör Paritásellenőrző áramkör 4 bites szavak részére 2 3 Y Y2 Y3 2 3 P P2 Y Y2 P3 Y3 P Paritás típus beállító jel: Y3 P P Y P4 Y 2 3 P Y P = => Y = Y3 => páros paritás generáló P = => Y = Y3 => páratlan paritás generáló
Paritásellenőrző áramkör 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 end endmodule
Fél összeadok Nem veszik figyelembe az előző helyérték átvitelét Csak a legkisebb helyértéken használható S C = = B B + B = B
-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 B i C i- S i C i Teljes összeadó két félösszeadóból: i B i B ½Σ Σ Cout S' i C' i B S i C ½Σ Σ i Cout = i Bi Ci = i B i + C i i + i B i C i- S i C'' C i Σ B 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_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 M2 (.sum(sum_out),.b(w),.carry(w3),.a(carry_in)); or (carry_out, w2, w3);
Példa 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); assign {cout, s} = a + b + cin; endmodule
Cin B 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 B 4 3 B 3 2 B 2 B C B C in B C in B C in B C in C out Σ C out Σ C out Σ C out Σ C 4 C 3 S 4 C S 3 C 2 S 2 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ó, + IBUF IBUF [3] I b_ibuf[3] IBUF O [3] [3] [3] LUT2_6 XORCY [3] OBUF [4] I O s_obuf[4] [4] [4:] s[4:] IBUF [2] I O b_ibuf[2] IBUF [2] [3] I a_ibuf[3] O LUT2_6 [3] s_axb_3 MUXCY_L s_s_3 MUXCY S OBUF [3] I O s_obuf[3] [3] [] I O b_ibuf[] [] [2] I O a_ibuf[2] [2] [2] [2] s_axb_2 S [2] DI LO [3] DI CI O [4] OBUF [2] I O [2] b[3:] [3:] IBUF [] I O b_ibuf[] [] [] I IBUF a_ibuf[] O [] [] [] LUT2_6 s_axb_ [] DI MUXCY_L S LO CI s_cry_2 s_cry_3 XORCY [2] s_obuf[2] OBUF [] I O [] a[3:] [3:] IBUF [] I O a_ibuf[] [] [] [] LUT2_6 s_axb_ [] [] S [] DI MUXCY_L LO CI s_cry_ s_s_2 XORCY [] s_obuf[] OBUF [] 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 B) - 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 (, B) 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).
BITES TELJES KIVONÓ
4-bites teljes kivonó -B=+(-B) -B N = B N (2) -B=+ B N (2) B (2) =B+ 3 2 B 3 B 2 B B 3 2 B 3 B 2 B B 4 BITES ÖSSZEDÓ C S3 S2 S S S 3 S 2 S S
bites LU (LU = arithmetic + logic unit) C in_i = C out_i- C in_ =F
Optimalizált bites LU C in_i = C out_i- C in_ =F
Optimalizált 4 bites LU Összeadás: Kivonás: Mode = => b i =b i Mode = => b i =b i b 3 b 2 b b
Massachusetts Institute of Technology - 6. introductory digital systems laboratory
Massachusetts Institute of Technology - 6. introductory digital systems laboratory
Massachusetts Institute of Technology - 6. introductory digital systems laboratory