
ALU
此项目仍在支持中,此项目始于2019年
项目当前状态:V2版本已完成验证
ALU——计算器重要组成部分之一
它的基本组成基于全加器,补码运算器,乘除法运算。
首先是全加器部分,全加器是由半加器加入进位改造而来。半加器的任务非常简单,即为异或运算(1+1/0+0=0,1+0/0+1=1)在加入进位输出后,将符合1+1=0的信号再单独输出一个高电平的进位信号,传递给高一位的全加器。因此一个全加器需要进行两次异或计算,第一次用于2个输入数的计算,第二次用于第一次计算结果和进位信号的运算,最后输出一位数和进位信号。
接下来解决的是减法运算,我们知道,计算器计算减法本质上是加数与另一加数补码的和。补码的计算方式为按位取反再加1,如果不理解为什么这么做,这里我可以举一个例子:有两个宽度为4的全加器(最大输入1111),补码定义为,补码+原码=0。现在有一个数为15,它的补码你很快可以得到为-15,因为15+(-15)=0,将15转为二进制为1111(2),那么如何找到它的补码呢。前面提到这个全加器的最大宽度是4,也就是说我们只要保证它的这4位为0000即可,最高位会溢出被计算机舍弃(因为没有地方存储)。现在我们将1111(2)按位取反变为0000(2),1111+0000=1111,我们继续加1,1111+0000+1=10000,注意最高位(五位)已无法存储被舍弃,故我们已完成了1111+0000=(1)0000的操作,15的补码-15为0001,结束。
讲完补码运算规则现在来设计电路,我们用一排非门来完成按位取反,将取反后的数输入在最低位加1的全加器,此时这个全加器输出的即为这个数的补码,等待下一步指示。
接下来解决的是乘法运算。参考小学乘法列式计算,你会发现我们的操作方法是将数与另一乘数的每一位相乘最后再相加。对于计算器来说它也是这么计算乘法的,因为计算器使用的二进制,在我们使用乘数与另一乘数的每一位相乘时你会发现,当此位为0时本行都为0(0xAny=0),乘以1时本行都为原数(1xAny=Any),故我们在电路方面只需考虑在进行一位乘运算后,再将这个数向高一位平移一次,直到每一位都相乘过,如果这一位为0则仅输出上一位的结果而不做任何更改,如果为1则在上一位计算结果上加此位数并将相加结果输出。
除法运算器未在MAX=1024 V1版本中实装,这里不做过多介绍。在完成V2实装后进行介绍。