📄 ch02.6.htm
字号:
NA</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableLeft">
<A NAME="pgfId=162410">
</A>
Z = A;</P>
<P CLASS="TableLeft">
<A NAME="pgfId=162411">
</A>
SG(Z) = NOT(SG(A))</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableLeft">
<A NAME="pgfId=162413">
</A>
Z = NOT(A)</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableLeft">
<A NAME="pgfId=162415">
</A>
Z = NOT(A) + 1</P>
</TD>
</TR>
</TABLE>
</DIV>
<DIV>
<H3 CLASS="Heading2">
<A NAME="pgfId=162537">
</A>
2.6.2 Adders</H3>
<P CLASS="BodyAfterHead">
<A NAME="pgfId=194409">
</A>
We can view addition in terms of <SPAN CLASS="Definition">
generate</SPAN>
, G[<SPAN CLASS="EquationVariables">
i</SPAN>
], and <SPAN CLASS="Definition">
propagate</SPAN>
, P[<SPAN CLASS="EquationVariables">
i</SPAN>
], signals. </P>
<TABLE>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380769">
</A>
<SPAN CLASS="BodyText">
method 1</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380771">
</A>
<SPAN CLASS="BodyText">
method 2</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380773">
</A>
</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380775">
</A>
G[i] = A[i] · B[i]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380777">
</A>
G[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A[<SPAN CLASS="EquationVariables">
i</SPAN>
] · B[<SPAN CLASS="EquationVariables">
i</SPAN>
]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380779">
</A>
(2.42)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380781">
</A>
P[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A[<SPAN CLASS="EquationVariables">
i</SPAN>
] <SPAN CLASS="Symbol">
⊕ </SPAN>
B[<SPAN CLASS="EquationVariables">
i</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380783">
</A>
P[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A[<SPAN CLASS="EquationVariables">
i</SPAN>
] + B[<SPAN CLASS="EquationVariables">
i</SPAN>
]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380785">
</A>
(2.43)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380787">
</A>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
] = G[<SPAN CLASS="EquationVariables">
i</SPAN>
] + P[<SPAN CLASS="EquationVariables">
i</SPAN>
] · C[<SPAN CLASS="EquationVariables">
i</SPAN>
–1]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380789">
</A>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
] = G[<SPAN CLASS="EquationVariables">
i</SPAN>
] + P[<SPAN CLASS="EquationVariables">
i</SPAN>
] · C[<SPAN CLASS="EquationVariables">
i</SPAN>
–1]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380791">
</A>
(2.44)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380793">
</A>
S[<SPAN CLASS="EquationVariables">
i</SPAN>
] = P[<SPAN CLASS="EquationVariables">
i</SPAN>
] <SPAN CLASS="Symbol">
⊕ </SPAN>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
–1]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380795">
</A>
S[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A[<SPAN CLASS="EquationVariables">
i</SPAN>
] <SPAN CLASS="Symbol">
⊕ </SPAN>
B[<SPAN CLASS="EquationVariables">
i</SPAN>
] <SPAN CLASS="Symbol">
⊕ </SPAN>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
–1]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380797">
</A>
(2.45)</P>
</TD>
</TR>
</TABLE>
<P CLASS="BodyAfterHead">
<A NAME="pgfId=195387">
</A>
where C[<SPAN CLASS="EquationVariables">
i</SPAN>
] is the carry-out signal from stage <SPAN CLASS="EquationVariables">
i</SPAN>
, equal to the carry in of stage (<SPAN CLASS="EquationVariables">
i</SPAN>
+ 1). Thus, C[<SPAN CLASS="EquationVariables">
i</SPAN>
] = COUT[<SPAN CLASS="EquationVariables">
i</SPAN>
] = CIN[<SPAN CLASS="EquationVariables">
i</SPAN>
+ 1]. We need to be careful because C[0] might represent either the carry in or the carry out of the LSB stage. For an adder we set the carry in to the first stage (stage zero), C[–1] or CIN[0], to '0'. Some people use <SPAN CLASS="Definition">
delete</SPAN>
(D) or <SPAN CLASS="Definition">
kill</SPAN>
(K) in various ways for the complements of G[i] and P[i], but unfortunately others use C for COUT and D for CIN—so I avoid using any of these. Do not confuse the two different methods (both of which are used) in Eqs. 2.42–2.45 when forming the sum, since the propagate signal, P[<SPAN CLASS="EquationVariables">
i</SPAN>
] , is different for each method. </P>
<P CLASS="Body">
<A NAME="pgfId=194423">
</A>
Figure 2.22(a) shows a conventional RCA. The delay of an <SPAN CLASS="EmphasisPrefix">
n</SPAN>
-bit RCA is proportional to <SPAN CLASS="EquationVariables">
n</SPAN>
and is limited by the propagation of the carry signal through all of the stages. We can reduce delay by using pairs of “go-faster” bubbles to change AND and OR gates to fast two-input NAND gates as shown in Figure 2.22(a). Alternatively, we can write the equations for the carry signal in two different ways: </P>
<TABLE>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380815">
</A>
either</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380817">
</A>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A[<SPAN CLASS="EquationVariables">
i</SPAN>
] · B[<SPAN CLASS="EquationVariables">
i</SPAN>
] + P[<SPAN CLASS="EquationVariables">
i</SPAN>
] · C[<SPAN CLASS="EquationVariables">
i</SPAN>
– 1]</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380819">
</A>
(2.46)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380821">
</A>
or</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380823">
</A>
C[<SPAN CLASS="EquationVariables">
i</SPAN>
] = (A[<SPAN CLASS="EquationVariables">
i</SPAN>
] + B[<SPAN CLASS="EquationVariables">
i</SPAN>
] ) · (P[<SPAN CLASS="EquationVariables">
i</SPAN>
]' + C[<SPAN CLASS="EquationVariables">
i</SPAN>
– 1]),</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380825">
</A>
(2.47)</P>
</TD>
</TR>
</TABLE>
<P CLASS="BodyAfterHead">
<A NAME="pgfId=306711">
</A>
where P[<SPAN CLASS="EquationVariables">
i</SPAN>
]'= NOT(P[<SPAN CLASS="EquationVariables">
i</SPAN>
]). Equations 2.46 and 2.47 allow us to build the carry chain from two-input NAND gates, one per cell, using different logic in even and odd stages (Figure 2.22b): </P>
<TABLE>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380845">
</A>
<SPAN CLASS="BodyText">
even stages</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380847">
</A>
<SPAN CLASS="BodyText">
odd stages</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380849">
</A>
</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380851">
</A>
<SPAN CLASS="BodyText">
C1[i]' = P[i ] · C3[i – 1] · C4[i – 1]</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380853">
</A>
<SPAN CLASS="BodyText">
C3[i]' = P[i ] · C1[i – 1] · C2[i – 1]</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380855">
</A>
(2.48)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380857">
</A>
<SPAN CLASS="BodyText">
C2[i] = A[i ] + B[i ]</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380859">
</A>
<SPAN CLASS="BodyText">
C4[i]' = A[i ] · B[i ]</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380861">
</A>
(2.49)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380863">
</A>
<SPAN CLASS="BodyText">
C[i] = C1[i ] · C2[i ]</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380865">
</A>
<SPAN CLASS="BodyText">
C[i] = C3[i ] ' + C4[i ]'</SPAN>
</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=380867">
</A>
(2.50)</P>
</TD>
</TR>
</TABLE>
<P CLASS="BodyAfterHead">
<A NAME="pgfId=306839">
</A>
(the carry inputs to stage zero are C3[–1] = C4[–1] = '0'). We can use the RCA of Figure 2.22(b) in a datapath, with standard cells, or on a gate array. </P>
<P CLASS="Body">
<A NAME="pgfId=195091">
</A>
Instead of propagating the carries through each stage of an RCA, Figure 2.23 shows a different approach. A <SPAN CLASS="Definition">
carry-save adder</SPAN>
(<SPAN CLASS="Definition">
CSA</SPAN>
) cell CSA(A1[<SPAN CLASS="EquationVariables">
i</SPAN>
], A2[<SPAN CLASS="EquationVariables">
i</SPAN>
], A3[<SPAN CLASS="EquationVariables">
i</SPAN>
], CIN, S1[<SPAN CLASS="EquationVariables">
i</SPAN>
], S2[<SPAN CLASS="EquationVariables">
i</SPAN>
], COUT) has three outputs: </P>
<TABLE>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnLeft">
<A NAME="pgfId=380999">
</A>
S1[<SPAN CLASS="EquationVariables">
i</SPAN>
] = CIN ,</P>
</TD>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="TableEqnNumber">
<A NAME="pgfId=381001">
</A>
(2.51)</P>
</TD>
</TR>
<TR>
<TD ROWSPAN="1" COLSPAN="1">
<P CLASS="EquationAlign">
<A NAME="pgfId=381003">
</A>
S2[<SPAN CLASS="EquationVariables">
i</SPAN>
] = A1[<SPAN CLASS="EquationVariables">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -