LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN
Dr. Oniga István
Digitális komparátorok • •
Két szám között relációt jelzi, (egyenlő, kisebb, nagyobb). A három közül csak egy igaz Egy bites komparátor A B
Komb. hál.
fiA
A
B
fiA
feA=B
fs A>B
feA=B
0 0 1 1
0 1 0 1
0 1 0 0
1 0 0 1
0 0 1 0
fsA>B
fe = A ⊕ B = A • B + A • B = A • B + A • B
fi = A • B fs = A • B
Két bites komparátor III module compare_2_ algoritmikus (output reg A_lt_B, A_gt_B, A_eq_B, input [1:0] A,B); always @ (A or B) // Esemény figyelő begin A_lt_B = 0; A_gt_B = 0; A_eq_B = 0; if (A==B) A_eq_B = 1; else if (A>B) A_gt_B = 1; else A_lt_B = 1; end endmodule
Komparátorok modellezése Verilogban // // Unsigned 8-bit Greater or Equal Comparator // module v_comparator_1 (A, B, CMP); input [7:0] A; input [7:0] B; output CMP; assign CMP = (A >= B) ? 1'b1 : 1'b0; endmodule
Paritásellenőrző áramkör Paritásellenőrző áramkör 4 bites szavak részére A0 A1
P1
Y1 P3
A2 A3
P2
Y3
Y P4
Y2
A0 A1
Y
A2 A3
P P
P – Paritás típus beállító jel: Y3 0 1 0 1
P 0 0 1 1
Y 0 1 1 0
• P = 0 => Y = Y3 => páros paritás generáló •P = 0 => Y = Y3 => páratlan paritás generáló
A0 A1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1
A2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
A3 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
Y1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
Y2 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
Y3 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
Paritásellenőrző áramkör
module oddparity_for (output reg parity, input [7:0] data); integer k; always@(data) begin parity = 1; for (k = 0; k <= 7; k = k+1) begin if (data[k] == 1) 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ó
S0 = A 0 • B0 + A 0 • B0 = A ⊕ B C0 = A 0 • B0
1-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); endmodule
// exclusive OR // and
Teljes összeadok Figyelembe veszik az előző helyérték átvitelét Ai 0 0 1 1 0 0 1 1
Bi 0 1 0 1 0 1 0 1
Ci-1 0 0 0 0 1 1 1 1
Si 0 1 1 0 1 0 0 1
Ci 0 0 0 1 0 1 1 1
S i = Ai ⊕ Bi ⊕ C i −1
C i = A i B i + A i C i −1 + B i C i −1
Teljes összeadó két félösszeadóból:
½Σ Ai Bi
Ci-1
A B
Σ
½Σ S'i C'i
Cout
A
Σ
B Cout
Ai Bi Ci-1 Si C'' Ci
Σ Ci Si
Verilog nested structural model of a 1-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); wire w1, w2, w3; half_add M1 (w1, w2, a_in, b_in); half_add M2 (sum_out, w3, carry_in, w1); or (carry_out, w2, w3); endmodule
Verilog nested structural model of a 1-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); wire w1, w2, w3; half_add M1 (.a(a_in), .sum(w1), .b(b_in), .carry(w2)); half_add M2 (.sum(sum_out), .b(w1), .carry(w3), .a(carry_in)); or (carry_out, w2, w3); endmodule
Példa – 1 bites összeadó module add1_full (input a, b, cin, output cout, s); xor3_m xor(.i0(a), .i1(b), .i2(cin), .o(s)); wire a0, a1, a2; and2_m and0(.i0(a), .i1(b), .o(a0)); and2_m and1(.i0(a), .i1(cin), .o(a1)); and2_m and2(.i0(b), .i1(cin), .o(a2)); or3_m or(.i0(a0), .i1(a1), .i2(a2) , .o(cout)) endmodule module add1_full (input a, b, cin, output cout, s); assign s = a ^ b ^ cin; assign cout = (a & b) | (a & cin) | (b & cin); endmodule module add1_full (input a, b, cin, output cout, s); assign {cout, s} = a + b + cin; endmodule
Cin
A
B
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
Sum
Cout
Több bites összeadók I A több bites számokat teljes összeadókból építhetjük meg Soros átvitelű 4 bites összeadó (Ripple carry adder): 7483 A4 B4
A3 B3
A2 B2
A1 B1 C0
A B Cin
A B Cin
A B Cin
A B Cin
Cout
Cout
Cout
Cout
Σ
C4 S4
C3
Σ
S3
C2
Σ
S2
C1
Σ
S1
Lassú Si és Ci eredményt csak azután kapjuk meg amikor Ci-1 felvette végső értékét
Példa – 4 bites összeadó module add4 (input [3:0] a, b, output [4:0] s); wire [3:0] cout; add1_full add0(.a(a[0]), .b(b[0]), .cin(1'b0), .cout(cout[0]), .s(s[0])); add1_full add1(.a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .s(s[1])); add1_full add2(.a(a[2]), .b(b[2]), .cin(cout[1]), .cout(cout[2]), .s(s[2])); add1_full add3(.a(a[3]), .b(b[3]), .cin(cout[2]), .cout(s[4]), .s(s[3])); endmodule module add4 (input [3:0] a, b, output [4:0] s); assign s = a + b; endmodule
Példa – 4 bites összeadó, str.
Példa – 4 bites összeadó, +
Példa – 4 bites összeadó, + IBUF [3]
I
O [3]
OBUF b_ibuf[3] [4]
I
O
[4:0] [4]
LUT2_6 IBUF
XORCY
s_obuf[4]
[3]
IBUF
[3] [3]
[2]
I
O
[3]
I
O
[2]
s_axb_3
[3]
b_ibuf[2]
s_s_3
OBUF
a_ibuf[3] [3]
I
O [3]
MUXCY IBUF [1]
I
LUT2_6
IBUF O
[2]
I
[2] [2]
O
[1]
MUXCY_L S
[2] [3]
b_ibuf[1]
a_ibuf[2]
s_obuf[3]
S
s_axb_2
[2]
DI
OBUF
DI
O [4]
LO
[2]
IBUF b[3:0]
[0]
I
IBUF O
[3:0]
[1]
I
[1] [1]
O
[0]
s_obuf[2]
s_cry_3
MUXCY_L s_cry_2
S
[1]
b_ibuf[0]
a_ibuf[1]
OBUF
XORCY
s_axb_1
[1]
DI [1]
LO
[0]
I
[0] [0]
O
[3:0]
MUXCY_L [0]
S
[0]
DI
O [1]
s_obuf[1]
s_s_2 s_cry_1
[0]
[0]
XORCY a_ibuf[0]
I
[2]
CI
LUT2_6
IBUF a[3:0]
O [2]
CI
LUT2_6
I
CI
s_axb_0
OBUF [0]
LO 0
CI
s_s_1 s_cry_0
I
O
[1]
[0]
s_obuf[0]
s[4:0]
ARITMETIKAI-LOGIKAI EGYSÉGEK (ALU) ALU minden processzorban van, de önálló, diszkrét áramkörként is gyártják. Az ALU egy kombinációs hálózat - a bemeneteikre érkező két számmal (A é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 (AND, OR, stb.), • regiszterműveletek (jobbra-balra léptetés, inkrementálás, dekrementálás),
4-bites ALU - 74LS181 • • • • •
Két 4-bites operandus (A, B) 4 bites eredmény (F) Átvitel: CarryIn/ Out S2: Aritmetikai/ logikai mód választó(MUX) S0, S1: művelet kiválasztó
• • • •
Jelzőbitek: carry-in, carry-outátviteleket, előjel bitet(sign), túlcsordulást(overflow), alulcsordulást(underflow).
1 BITES TELJES KIVONÓ
4-bites teljes kivonó A-B=A+(-B) -BN= BN(2) A-B=A+ BN(2)
A1
B2 NOT Y
Y
A0 B3 B2 4 BITES ÖSSZEADÓ S3 S2 S1 S0
S3
S2
S1
S0
B1
B0
Y
A2
B3
NOT
A3
A0
Y
A1
NOT
A2
NOT
A3
B(2)=B+1
B1
B0
C0
„1”
1 bites ALU (ALU = arithmetic + logic unit)
Cin_i= Cout_i-1 Cin_0=F0
Optimalizált 1 bites ALU Cin_i= Cout_i-1 Cin_0=F0
Optimalizált 4 bites ALU Összeadás:
Mode = 0 => bi´ =bi
Kivonás:
Mode = 1 => bi´ =bi
b3’
b2’
b1’
b0’
Massachusetts Institute of Technology - 6.111 introductory digital systems laboratory
Massachusetts Institute of Technology - 6.111 introductory digital systems laboratory
Massachusetts Institute of Technology - 6.111 introductory digital systems laboratory