EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 alexwang 于 2020-6-16 17:39 编辑
( E4 o! a. S* W" H" p" ^# x
; d" w- J8 \% [; t# a一个被工程师们用 “V” 表示的器件符号究竟是啥?
7 Y3 \$ b8 S# }8 u" s9 d) _4 A5 tEDA365原创 作者: 巢影字幕组 " b. \# i8 r/ v
" Y/ l2 ? N( ` f
计算机用二进制存储数字的目的是为了计算,而计算的过程是由“算术逻辑单元”来完成的。 7 K, ]1 r y8 m7 M% U) j/ r, J
那什么是算术逻辑单元?
6 U: z; ?2 f9 L算术逻辑单元(Arithmetic and Logic Unit)简称ALU,就是负责实现计算机里的多组算术运算和逻辑运算的组合逻辑电路。 . l7 j$ H z- h- y8 U$ i
$ G+ S# A3 R/ n! o
3 L; _' C2 E5 h7 J9 q; K. M$ G6 ?. i, ` Q7 f4 A
看看上面这个实物,图片中是最著名的ALU——英特尔74181,1970年发布,当时它是第一个完全被封装在单个芯片里的完整ALU,对人们来说这是一个惊人的工程。
V! X7 y+ `4 j; q今天,让我们一起用布尔逻辑门来构建一个简单的与74181功能相同的ALU电路吧。 & D7 `, H3 z/ Y( K+ C
在构建ALU之前,我们要知道ALU电路包含2个单元,一个是算术单元和一个是逻辑单元。
# P1 G9 I5 t! a7 v% m6 R T我们先从算术单元开始,算术单元负责计算机中所有的数字操作,比如加减法,当然它还会做一些其他简单的事,比如给某个数字加1,这叫增量运算。 , i- Z7 e z+ H. k; O3 j7 c6 e
在算术单元中,我们会用到AND,OR,NOT和XOR逻辑门,最简单的加法电路,就是有2个二进制的输入:A和B,还有1个就是输出,即两个二进制数字的和。
# s O( D# i2 l9 N, a. k/ A假设A和B都是只有一个bit,即0或1,那A和B的运算就只有下列四种可能的组合: 8 Z j8 F# \, D, i
0+0=0 1+0=1 0+1=1 1+1=10 - A$ s5 J h" f4 l: n: L3 ^
提醒一下,在二进制里,1代表true,0代表false,所以这组输入和输出的前三种可能与XOR门的逻辑关系是一样。
9 M9 q& H8 ?% d* s* V9 R0 M2 B& C第四中输入组合,显然1+1≠2,因为在二进制里是没有2的,所以结果是0,将1进位到下一位,和为二进制的“10”,对于XOR门的输出,只对了一部分,即1加1,输出0,这个时候,我们只需要一根额外的线来代表进位,即只有当输入是1和1时,进位才是“true”。
8 m# T; D. D( V$ p& K/ c5 Z$ O' z& D; h3 }( d! \1 l
0 S8 D& _& Z7 A1 U4 N
+ w) d5 A% [! X1 E; s7 J针对上面出现的问题,我们可以把AND门加到电路中,即当两个输入都为“true”时,输出才为“true”,这样就组成了“半加器”电路。
6 ^' ]8 U P+ H3 ?6 F8 m4 B: S' I
) O8 p* j4 Y/ l" J! w
* e- s! V0 V, s* Y2 }9 b
如果你想处理大于1+1的情况,就需要“全加器”(full adder),全加器比半加器复杂点,它有3个bit的输入:A、B、C,所以最大可能输入为:1+1+1,总和1,进位1,因此需要两条输出线,即进位线与总和线。 \5 c' x' p b9 r/ k/ z
' s7 p1 ?. A3 B7 q
+ f3 N& K. |- d& A- c$ `
5 J( C4 \; S+ V6 T- k4 u, v其实,我们也可以用半加器来实现全加器的功能,先用半加器将A和B相加,然后把C输入到第二个半加器中,最后用一个OR门检查进位是不是true就可以了。
" A6 F! S7 |; O& C' K! |
, m* f! Q4 s+ t* J5 n S4 g( T! p6 m; i' D5 @4 r" u2 _
7 a$ q! t7 q1 ~* H1 b% M现在,我们可以做一个两个8 Bit进行相加的电路,这两个8 bit分别为A和B,看下图: 6 L0 L( b; b; N2 f0 V4 o" P8 J( \! W
9 S. R5 T+ E7 N4 Q- W. J2 X
& g4 Y3 U" K$ h; ~
; B2 O) W+ K2 W3 k9 H+ t
我们从A和B的第一位开始相加,第一位分别称为A0和B0,因为只有2个数,所以用一个半加器就可以,我们将它俩的和称为Sum0,考虑到A1和B1相加的时候可能会有A0和B0相加的进位,就会有3个数,所以从A1和B1相加开始就得用全加器,然后依次类推,搞定8个bit的相加,这叫 "8位脉动进位加法器"。
5 x- ]$ [% ?9 E( F9 ]4 A请注意:A7和B7的全加器有“进位”输出,如果它俩相加有输出进位,代表数字A和B相加,和超过了8位,这叫“溢出”(oveRFlow)。如果想避免溢出,就得加更多全加器,然后相加16或32位数字,这就会让溢出更难发生,但缺点是每次进位都要一点时间向前移动。
: O' R# ~7 T4 E K7 g简单的ALU没有专门的电路去处理乘法和除法,而是用多次加法实现乘法运算,比如:可以将12加5次来实现12乘以5。 1 U5 j9 E7 y' t; K3 ~' P0 P3 A
当然,不用去担心我们现在的笔记本和手机,因为他们有更好的处理器,可以专门做乘法的算术单元哦。 ; Z& E1 N9 b9 P3 u6 k
关于算术单元我们说的很多了,现在,我们来说一下ALU的另一半:逻辑单元。逻辑单元执行的是逻辑操作,像之前讨论过的AND,OR和NOT操作,当然也可以执行简单的数值测试,比如检查数字的正负。 & E7 D* Y, l. P. t5 x6 `
4 y: c. z; K2 p( h+ b/ Q7 V
8 ]) e! n9 B* |! [! [, A: }8 P3 y0 c
上图是检查ALU的输出是否为0的电路,用了一堆OR门来检查其中一位是否为1,哪怕只有一个Bit (位)是1,我们就可以肯定那个数字肯定不是0,然后用一个NOT门取反,所以只有输入的数字为0时,输出才为1。
3 ?. n+ x4 N- }- F7 w到此,我们已经对ALU进行了一个高层次的概括,甚至做了几个主要组件,比如脉动进位加法器,虽然只是巧妙的将一大堆逻辑门连在了一起。我们再回到开始时说的ALU,英特尔74181,它只有4位输入,而我们刚才介绍的是8位输入,是74181的两倍哦!
5 J$ \) e+ W+ s虽然我们没有做出ALU实物,但是我们应该已经对ALU有了整体的概念,它的诞生打开了通向更强大电脑的大门。
P2 v& A/ Y- l) T由于ALU在市面的应用越来越多,工程师们为了方便,就用了一个看起来很像大“V”的符号来代表它,看下图,是不是很像“V”啊? , R, K( A0 K' r* x0 b; Q
! ?+ h' d% R* ]; A
. q* C2 x5 v+ u7 h. g$ y3 x+ @3 }3 C4 P
+ g8 a8 }) d( N" |, v一个4位的ALU需要很多逻辑门,一个8位的ALU需要的逻辑门肯定更多,我们工程师肯定不想在这里浪费很多时间,那就出现了一种便于ALU执行所需要的操作代码,这个后面有机会再详细介绍给大家。
7 {6 q4 M* _( k+ f
0 k( p; `/ ?( z6 e- y( C3 q1 G" d( W% Y9 q- W% `9 \0 w) M
! G/ w# s: A$ c0 ~1 x5 OALU除了输出计算结果外,还会输出一系列标志(Flag),这个标志代表特定状态的1位(bit)输出,例如,如果我们相减两个数字,结果为0,我们的零测试电路就会将零标志设为True(1),这在确定两个数字是否相等时是非常有用的。 3 N) f9 F: G* `9 y) v5 ^" x9 \$ l
当然这个标志位也可以用来判断数字的大小和是否出现溢出等,如果使用的ALU越好,它的标志也会更多,但刚说的这3个标志是ALU普遍会用到的。 * r6 b {0 ?* a1 `! S1 i! H
关于算术逻辑就给大家介绍这么多,但是这个被工程师们用“V”表示的器件大家知道了吗?可以下方留言告诉我哦! ' g- ~4 O& t+ i* I
$ g* z; _: `6 b0 l5 @: \( a
9 w- D" A E$ T: |/ e; T& _3 E9 `8 j7 B' y2 C" j; S" g* ] Y7 ~/ V t% C' v c7 x6 N0 f8 ^* {: K# N: n! w' e7 Z4 P7 w, b+ `1 f) t
注:本文为EDA365电子论坛原创文章,未经允许,不得转载。 1 v/ o( ~; R" M. U5 R+ {- U; g
|