有关计算机组成原理
与门,或门,非门,异或门的电路组成方式
逻辑门的构造方法:
非门:往往与一个地线相连接
或门:往往是并联结构的电路
且门:往往是串联结构的电路
表示和储存数字1是计算机的重要功能,但是真正的目标是计算,有意义的处理数字,比如把两个数字相加。
这些操作由’计算机的算术逻辑单元‘ALU处理…
理解了ALU就理解了现代计算机的基石。基本计算机其他所有的部件都使用到了它。
ALU由算术单元和逻辑单元组成。
可以用逻辑门来做出ALU,下面是用C模拟得到的用二进制的全加器构成的加法器:

#include<cstdio>
using namespace std;
int main(){
	bool carrier = 0,sum[8],input1[8],input2[8];
	int n1,n2;
	printf("欢迎来到8位全加器,请输入两行8位2进制:\n") ;
	scanf("%d%d",&n1,&n2);
	for(int i = 0; i <= 7; i++){
		input1[i] = n1%10;
		n1/=10; 
		input2[i] = n2%10;
		n2/=10; 
	}
	if (input1[0]&&input2[0]){
			sum[0] = 0;
			carrier = 1;
	}
	else if(input1[0]||input2[0])
		sum[0] = 1;
		else sum[0] = 0;
		
	for(int i = 1; i <= 7; i++){
		if(input1[i]&&input2[i]){
			if(carrier == 1) sum[i] = 1;
			if(carrier == 0){
				carrier = 1;
				sum[i] = 0;
			}
		}
		else if(input1[i]||input2[i]){
			if(carrier == 1){
				carrier = 1;
				sum[i] = 0;
			}
			if(carrier == 0) sum[i] = 1;
		}
		else {
			sum[i] = carrier;
			carrier = 0;
		}
	}
	if(carrier == 1) printf("数据溢出");
	else {
		printf("全加器的结果为:");
		for(int i = 7; i >= 0; i--)
			printf("%d",sum[i]);
	}
	return 0;
} 

以上是“八位行波进位加法器”,如果想要避免溢出,我们可以加更多的全加器,可以操作16或32位数字,让溢出更加难以发生,但是代价是更多逻辑门,以上算法的缺点是:每次进位都需要一点时间。
现代计算机一般使用“超前进位加法器”,它更加的快。
ALU的算术单元,也能做一些其他数学运算:
加法,带进位的加法,减法,带错位的减法,negate相反,增量+1,减量-1,数字无改变通过…(注意里面没有乘除法,因为简单的ALU没有专门的电路来处理,而是把乘法用多次加法来实现)

ALU的逻辑单元,可以使用逻辑电路实现各种布尔运算,它也可以做简单的数值测试。

ALU有两个输入点INPUTA,INPUTB
实现各种操作,需要向ALU输入operation code操作码。
ALU除了输出数字结果,它也会输出flag标志(overflow,zero(0测试电路),negative…),标志是1位的,代表特定状态。

有关寄存器与内存:
我们在前面使用的单向点路(八位行波进位加法器),但是我们也可以通过逻辑门做出回向电路。(参考第六集1:38,此处为逻辑电路忽略了晶体管的供电)
可以用这种思路利用一个or门或and门做出最简单的储存0或1的锁存器.

可以组成起来做出一个and-or锁存器:关键是两条输入线,一条是数据输入线,一条是允许写入线。
但是一个锁存器只能存一位数字,如果要存储多位就需要多个锁存器的组合,存储的数字的位数叫做位宽,一般这样的组合叫做寄存器。
成线性结构的寄存器线路开销大,一般是采用矩阵结构的寄存器存储高位数字,利用行线和列线与一个and门模拟成坐标系。
为了将地址转成行和列,我们需要“多路复用器”来模拟行和列,256位数字用两个4位的多路复用器来转换地址