EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 alexwang 于 2020-4-24 18:15 编辑 2 E7 H1 J) b0 e& N+ Q
4 P6 R$ A% o7 B& `3 j
还记得“非”“与”“或”“异或”门的逻辑关系吗?
( y: o, A. O, L& [0 |9 q: ~EDA365原创 作者:巢影字幕组
* Z& ~% B' F4 @! T7 |3 |/ j/ C) ~! h& `: w! G
. N/ [- v9 O) j/ M+ Q) }
' F$ u, } S$ I/ J4 m4 L
之前探讨了关于计算机是怎样一步步被人类不断推进演变的过程,今天,我们将从抽象层面带大家感受一下计算机复杂的一面。
) I, b. `5 ?+ r, k) r6 m; g9 h% T从昨天讲的,我们可以发现不论是通过装置上的一个单位,还是通过晶体管控制开关,计算机给我们的状态只有“开”和“关”,虽然只有两个状态,但是我们仍然可以用这两种状态表达很多重要的信息,这就是所谓的“二进制”。 3 E9 K( V# a% x ]7 Y
- n# k6 C, V- }# S* L
' R2 S8 U: F' b( _
; b) z: B& E$ s O, i; s: U你是不是很疑惑:既然二进制只有两个状态,那它肯定不能完成很复杂的工作咯?
* Q* T* I% p! h$ @答案是:是的,但是它却可以准确的表示你需要的值:‘true’和‘false’。 , o+ S+ ]% \3 G7 h) {$ m0 R, D+ |
在计算机中,状态为“开”时,电流流过,用true表示;状态为“关”时,电流停止,用false表示。通常情况下,也会用0和1来表示二进制的状态。
6 M( S; U* k! X( F% [; p, ~上篇文章我们讲晶体管可以用来控制电流的开启和关闭,其实不然,晶体管还可以用来控制不同的电流水平。 , X2 {" q5 D. M
早期某些电子计算机是三进制或五进制,表示他们的状态有3种或5种,但问题是:像这种状态层级越多,状态之间的区分也就会越模糊。 ( Z: q/ r% A, n9 b& R1 l
7 P$ A) H. l5 m; P5 E! d6 }
$ }3 j3 D/ R5 K3 S% M6 l; M
% p) n; a# w8 H; M7 z$ H8 s晶体管每秒有数百万次的变化,那中间存在的问题也会变得更加糟糕。 : |: `0 Y3 O" B: j4 ]
因此,将两个信号放在尽可能远的地方,即只使用 "开" 和 "'关"的状态,这样就可以在很多干扰问题种区分最明显的信号问题。 : i5 s6 I# w4 Y
其实在计算机种使用二进制还有一个原因,那就是二进制在数学中有成熟的分支,它是专门用来处理‘true’和‘false’的问题,而且数学家们也已经研究出了操作二进制的所有必要的规则和方法,这个分支被称为“布尔代数”。 , J3 l* Z5 B n/ r: X; t
“布尔代数”来源于一位19世纪自学数学的英国数学家 'George Boole' ,他致力于研究亚里士多德的逻辑理论,亚里士多德逻辑法是以哲学为基础,Boole的方法则是使用逻辑方程式的方法去判断真假,这一方法在1847年他的第一本书《逻辑的数学分析》中提出。 , ^1 z* J H' R- b& O" S- n
通常我们学习到的都是常规代数,变量为数字,并对这些数字进行加减乘除等运算,但在布尔代数中,变量为‘true’和‘false’,并对这些变量进行逻辑处理。 1 o9 H& g; g% n0 S- ^3 s h
布尔代数中的三个基本操作:“非”、“与”、“或”,这些操作都有他们自己独特的作用。 $ x" K" g+ u1 `
0 R. k; [2 k8 h3 a
3 R; b/ W: L" P, }
( ?1 Y+ R8 @1 k; }9 c) j" P* f! N“非(NOT)”作用于单个布尔值,无论其是true或false,都会将其反转,即true转换为false,false转换为true。 7 {( a# F" D* _! T4 E7 m4 ~
在布尔值中,当输入为true时,输出为true;当输入false时,输出false,它并没有进行任何操作。
- S7 |2 Z$ B5 W. s" P* x3 k如果我们对其稍作修改,例如创建一个“非”电路,如果输入true,则输出为false;如果输入false时,输出将会是true,我们将刚刚创建的“非”电路称为“非”门。 1 o! t* ]' G$ ^1 q
' k# l( {3 S$ [4 e/ N8 E
) w5 J5 |/ ^) L9 A
9 g: \6 q- q: Q6 F& ]7 V“与(AND)”作用于最少两个输入,但是只有一个输出。只有当所有输入都为true时,输出true,但如果输入有一个false,那输出就是false。
! E4 s0 C7 u6 Z; C: E' t( Y" b% Q6 L
* u) n5 K7 @3 V3 u+ u# ]/ g+ j
! z; E% _0 P* E3 S% W( z; k1 E- b
6 I7 k" P3 b$ |+ F' o' m6 r; {# S最后一个布尔运算为“或(OR)”:只要有一个输入为true,那么输出为true,如果输入都为false,那输出就是false。 : S, X4 V& q8 c. r* o1 h
上面我们对非、与、或门有了一定的了解,现在我们看看这三种门的表示符号吧! 1 H6 H3 L8 F$ B+ t+ B- }
标准工程师们使用三角形加小圆点表示非:
1 `7 I, E: r, X, L: ^, F7 N3 x& H7 C
5 _ E+ e, b) u1 j! p# w# x- d7 z' C6 X/ D7 K% C
一个D形状的图标表示与: * A' w! ^; h9 x* q+ \9 [2 C. e( h
$ p1 \% `& U* f$ \ g8 K
1 c1 j5 v% e' s# z; z. x) `- e9 W/ c/ r- a5 F
一个像宇宙飞船一样的图标表示或: % k; ^$ r6 K2 r0 A: f
8 K) U$ T$ V: R2 C" d. A' p; G$ ?
0 T3 I8 `+ r9 n: h$ u v
3 E6 y+ R6 D0 i! T2 k+ M7 i
这些图标和思想可以在我们构建更大组件的同时,去控制好整体的相对复杂度,但是那些晶体管和电路的复杂依然存在。 % S; {: F, f2 U: |( |
举个例子:在其他有用的布尔运算中有个被称之为“异或(XOR)”的方法。
9 C( h/ }" D8 B" j
' p' S( ~& l, A" V+ `3 s
d. t( {7 p" @2 T1 {! ?( K* M+ h/ z$ A
异或和或很像,只是如果输入都为false,那输出就是false。只有一种情况下异或会输出true,就是当一个输入为true,另一个输入为false时。
8 F# Q- k- ^, m+ B' |; u异或门在实际应用中是很必要的,因此工程师们也给了它一个单独的标志:一个带着笑脸的或门:
2 p* S# ?( Q5 u$ y; m8 ? y. r" _( y; i v4 d( z! J" p) g, T
% Q3 k0 A4 j8 o# G7 g8 ?" P
4 g+ x9 B1 e# W; R k' r( B最重要的是,我们不需要太过于操心其中各个逻辑门的构成,以及这些门该如何用晶体管去搭建,又或者如何让这些电子在半导体中流通。 + c+ e Q% Q8 j; W+ ~' j
因为当计算机工程师在设计处理器时,很少会考虑晶体管层面是如何工作的,他们通常使用的是更大的区块,例如逻辑门,或者由逻辑门组成的更大的组件。 + F/ Y4 F) _ m- f6 a
/ f/ \5 Q; G- C' C/ p0 t8 N' L
! _ x) ?: W5 M; c/ A
8 d4 `5 `$ Z& F$ r
即便你是专业的程序员,也很少去思考如何直接在物理层面用这些极小的组件去实现你的程序逻辑。
% R' m+ [/ F( f8 ]当然,我们也将思考的重心从原始的电子流动,转移到了用数据表示来替代:如true和false,这让我们的思维方式又一次接近了计算机本身。
4 K2 `% ~. [: U* Q& _& L今天就先聊到这里了,下期见,欢迎下方留言讨论哦。 - Q: O" I9 S/ A2 z0 q" e
6 c9 J B1 P. b! A( D- E, a% q; J9 w- D" A E$ T: |/ e; T& _3 E9 `8 j7 B' y2 C" j; S" g* ] Y7 ~1 n: @& ]! @! u+ }2 Q* z/ Y
注:本文为EDA365电子论坛原创文章,未经允许,不得转载 . J- e6 F/ S5 p% Z+ q
|