在上一篇中完成了半加器与全加器的构建,这一篇在全加器的基础上完成8位整数的运算;
八位加法器
实现的基本思路为:
设numA和numB分别为两个8bit的整数输入,iCarry为布尔类型,表示低位进位;
将numA与numB的各个位按从低位到高位分别取出,分别将对应的位送入到一个全加器中,全加器的进位输入为低位的进位输出;
将每一个全加器的位组成一个数组,并转换为一个8bit整数S_U8;最高位的进位为布尔值oCarry;
由于使用的是串行进位,故需要一定的时间进行进位传递,从numA、numB、iCarry输入到S_U8、oCarry输出需要一定的时间才能稳定;
八位加法器的Labview程序框图如下所示:
注:的FullAdd子函数即为上篇完成的全加器;
实验结果前面板:
分析:当输入的两个8位整数为200和200时,由于uint8的分为是0~255,故产生了进位,oCarry=1,S_U8=200+200-256=144;
另外需要说明的是,在计算机的加法运算中,不区分有符号数还是无符号数,有无符号的区分是在结果得到后进行结果解释时进行的;
例如:
uint8 a = 200;
uint8 b = 200;
int8 c = -56;
int8 d = -56;
uint8 e = a + b;
int8 f = c + d;
由于uint8的200和int8的-56对应的8位表示为0xC8,在送入ALU时,输入都为0xC8和0xC8;
在计算机的中有一个程序状态字寄存器PSW,PSW中的CF位代表进/借位标志,OF位代表溢出标志;
a+b、c+d的8位结果寄存器中存储的值都为0x90,CF=1,OF=0,由于CF=1,表示无符号加发生进位,e=144为部分和;由于OF=0,表示有符号加未发生溢出,0x90为f的补码,f=-112,结果正确;
32位加法器
32位加法器是在8位加法器的基础上构建而成的,结果与全加器构成8位加法器非常相似,也是使用串行进位方式;程序框图如下:
程序框图中的U8Add即为8位加法器;
用到Labview中的数组函数:先将uint32转为长度为32的布尔数组,通过数组截取函数截取的第1、2、3、4个字节,分别送入8位加法器中相加,并将每个8位加法器的结果合并为一个整数输出;
实验前面板如下图:
OK,加法器完成;
但是,该加法器的效率并不是最高的,因为构建方式是组内串行、组间串行;
下一篇将以组内并行的方式进行8位加法器的构建。