计算机组成原理1
有关计算机组成原理
与门,或门,非门,异或门的电路组成方式
逻辑门的构造方法:
非门:往往与一个地线相连接
或门:往往是并联结构的电路
且门:往往是串联结构的电路
表示和储存数字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位的多路复用器来转换地址