目录
1.电路的基本原理、加法器设计
1.1算数逻辑单元(ALU)的功能
①算数运算:加减乘除
②逻辑运算:与或非
③辅助功能:移位、求补
1.2.ALU的结构(抽象)
①A和B为输入信号:若进行加法操作,加数从A输入,被加数从B输入,输入的是电信号(高低电平)
②F为输出信号:输出A和B相加的结果
③K为控制信号:控制信号由CU发出
1.3.ALU的结构(实例)
①右侧S0 - S3和M:来自CU控制单元的控制信号。CU分析指令的操作是什么(加减乘除/逻辑运算),CU根据其分析结果发出控制信号(电信号,由二进制组成,例:01011,每个信号由高低电平组成)。
M表示的是该操作是逻辑运算还是算数运算:M = 1为逻辑运算,M = 0为算数运算
S0 - S3表示的是将要进行哪一种逻辑运算或者算术运算:有4个bit,可以表示16种不同的运算
②A0 - A3 和 B0 - B3:表示两个4bit的数据,分别从A0 - A3和B0 - B3输入
③F0 - F3:经过ALU运算后,得到4bit的数据,通过F0 - F3输出
④机器字长:ALU能够支持同时输入多少bit的信息
ALU计算完成后会放入某个寄存器,因此ALU为多少位,寄存器就为多少位
1.4.ALU逻辑运算
设高电平为5V,低电平为1V
1.与门:只有AB都输入高电平(5V),Y才输出高电平(5V);否则输出低电平(1V )
2.或门:只要AB一个输入高电平,Y就输出高电平(5V);否则输出低电平(1V)(电路里是判断输入信号是否大于等于1)
3.非门:A输入高电平,Y输出低电平;A输入低电平,Y输出高电平(电路的右边会有个小圈)
4.与的优先级高于或
1.5.实现异或门
1.6.实现偶校验
1.7.一位全加器
1.S值:当前位A、B 和C中有奇数个1,则S为1;有偶数个1,则S为0(异或实现)
2.发生进位:A和B中有两个1,则发生进位;A和B中有1个1,且C为1,则发生进位
1.8.串行加法器
1.一位一位加
2.每次的产生的进位保存到进位触发器中,作为下次加法的进位
3.只有一个全加器,数据逐位串行送入加法器运算
4.操作数n位,则进行n次加法(一次计算和输出一位)
1.9.并行加法器
1.将n个全加器串联起来
2.第 i 个全加器输出的进位会作为第 i + 1个全加器的进位输入
3.从低位到高位按顺序进行,只有前面的所有低位全加器运算完成后,才能进行该位的计算(需要得到上一位的进位,多米诺骨牌),因此被称为串行进位的并行累加器
2.并行进位加法器
串行进位的并行加法器是逐级传递C,但第 i 个加法器输出的C可以通过电路的方式直接送到第 n - (i + 1)个加法器,如此就可以在输出C的时候直接越级传给后面的加法器,而不需要一级一级传递
3.补码加减运算器
3.1.加法器原理
设AB为4bit
cin输入的进位:和AB的第1位(最低位)相加,生成结果的最低位
cout输出的进位:AB的第4位(最高位)和第三位的进位相加生成的进位,后输出到下一个加法器
3.2.补码加/减运算方法
3.3.补码加减运算器电路图
1.若进行的是X + Y,则X直接输入,Y经过多路选择器的0输入,sub的输入为0→cin为0
2.若进行的是X - Y,则X直接输入,Y经过多路选择器的1输入,此时,Y的数据需要经过非门(按位取反),sub的输入为1(末位+1)→cin为1
3.此电路也可以适用于无符号整数,但判断溢出的方式不同
4.标志位的生成
加法器在输出时,还会输出OF、SF、ZF和CF:设有n个bit
1.OF、SF仅对有符号数有意义,CF仅对无符号数有意义,ZF都有意义
2.有符号数溢出:OF = 1;无符号数溢出:CF = 1(发生借位/进位)
OF(Overflow)溢出:最高位(n + 1位)的进位和次高位(第n 位)的进位进行异或
SF(Sign)符号:输出结果的最高位(第n位) ,用途:判断正负
ZF(Zero)零:结果为0,则为1;结果非0,则为0
CF(Carry)进位/借位:最高位(n + 1位)的进位和sub(1为减法,0为加法)进行异或
5.定点数的移位运算
5.1.算术移位
1.算术移位可以等价实现乘法(左移)和除法(右移)
2.原码的算术移位:
①符号位保持不变,仅对数值位进行移位
②右移1位:高位补0,低位舍弃。若舍弃0,则等价于除以2;若舍弃1,则丢失精度
③左移1位:低位补0,高位丢弃。若丢弃0,则等价于乘以2;若舍弃1,则严重误差
3.反码的算术移位:
①若为正数:因为反码正数和原码相同,因此,算术移位操作相同
②若为负数(补0改为补1):
A.右移:高位补1,低位舍弃
B.左移:低位补1,高位舍弃
4.补码的算术移位:
①若为正数:因为反码正数和原码相同,因此,算术移位操作相同
②若为负数:从左往右数,第一个1的左边和反码相同,第一个1的和其右边和原码相同
A.右移:高位补1,低位舍弃(同反码)
B.左移:低位补0,高位舍弃(同原码)
5.小结:
5.2. 逻辑移位(补0)
1.逻辑移位将操作数视为无符号数
2.逻辑左移,高位丢弃,低位补0;逻辑右移,低位丢弃,高位补0
5.3.循环移位
6.原码的乘法运算
1.原理:符号位使用异或单独处理(不参与运算),数值位取绝对值进行乘法运算
2.操作过程:
①取乘数和被乘数符号位进行异或
②加法:若当前位为1,ACC加上被乘数;若当前位为0,ACC加0(通过ALU加法电路完成)
③逻辑右移:ALU的最低位成为MQ的最高位,MQ的最低位直接丢弃(错位)
③若n bit的乘法,则进行n - 1轮的加法和移位(重复n - 1轮②③),最终得到结果的绝对值
④替换符号位为①中异或的结果
3.初始化:通用寄存器X存放被乘数,MQ存放乘数,ACC归零
取符号位进行异或得到结果的符号位为1
①当前位为1,ACC加被乘数:(ACC)+(X)→ACC。00000 + 01101 = 01101
②进行错位:逻辑右移1位(高位补0),ACC的最低位移到MQ的最高位,MQ最低位丢弃
③当前位为1,ACC加被乘数:(ACC)+(X)→ACC。00110 + 01101 = 10011
④进行错位:逻辑右移1位(高位补0),ACC的最低位移到MQ的最高位,MQ最低位丢弃
⑤当前位为0,ACC加0:(ACC)+(X)→ACC。01001 + 00000 = 01001
⑥进行错位:逻辑右移1位(高位补0),ACC的最低位移到MQ的最高位,MQ最低位丢弃
⑦当前位为1,ACC加被乘数:(ACC)+(X)→ACC。00100 + 01101 = 10001
⑧进行错位:逻辑右移1位(高位补0),ACC的最低位移到MQ的最高位,MQ最低位丢弃
⑨数值为为4,需要进行4次加法和移位,现在进行完毕,也就完成了乘法运算;定点小数的小数点隐含在符号位后,因此,乘法的绝对值的结果为0.1000 1111,替换异或得到的符号位,得到最后的结果1.1000 1111
7.补码的乘法运算
1.进行n轮加法、移位(补码的算术右移),最后再多来一次加法
2.加法的可能值为+0、x的补码、-x的补码(根据MQ的最低位和辅助位确定)
①辅助位 - MQ最低位 = 1:(ACC)+(x的补码)
②辅助位 - MQ最低位 = 0:(ACC)+ 0
③辅助位 - MQ最低位 = -1:(ACC)+(-x的补码)
3.符号位参与运算
4.初始状态:
①ACC置为0,使用双符号位(与原码乘法相同)
②MQ存放乘数,补码的乘法实现中,MQ需要添加一位辅助位(存放在最低位),辅助位初始为0,辅助位加上符号位,因此,设数值位为n位,则实际上MQ需要有n + 2位,并且,ACC和ALU也需要有n + 2位(MQ添加在低位,而ACC和ALU添加在高位)(原码乘法中MQ为n + 1位,仅有符号位,没有辅助位)
③寄存器X存放被乘数,使用双符号位补码形式(原码中被乘数也存放在X)
5.手算:
最后一次加法:使得符号位参与运算
8.原码的除法运算
1.符号位不参与运算,单独使用异或得到结果后替换(同原码的乘法思想),数值位取绝对值
2.数值位取绝对值运算
3.计算机在计算的时候,默认当前位的商为1,然后判断ACC和X的大小,若X更大,则恢复余数
4.初始:ACC存放被除数,X存放除数,MQ置为0(存放商),其最后一位为当前将要确定的商
①MQ当前位默认商1,(ACC)+ (-|Y|)补→ACC,ACC负值,说明余数比除数更小,应该商0
②MQ修改当前位为0,(ACC)+ (|Y|)补→ACC,恢复余数
③逻辑左移(错位)
④MQ当前位默认商1,(ACC)+ (-|Y|)补→ACC,ACC负值,说明余数比除数更大,应该商1
⑤逻辑左移
⑥MQ当前位默认商1,(ACC)+ (-|Y|)补→ACC,ACC负值,说明余数比除数更大,应该商1
⑦逻辑左移
⑧MQ当前位默认商1,(ACC)+ (-|Y|)补→ACC,ACC负值,说明余数比除数更小,应该商0
⑨MQ修改当前位为0,(ACC)+ (|Y|)补→ACC,恢复余数
⑩逻辑左移
11. MQ当前位默认商1,(ACC)+ (-|Y|)补→ACC,ACC负值,说明余数比除数更大,应该商1
12.若最后MQ商的结果为负,则也需要恢复余数并商0
13.替换符号
5.小结
6.不恢复余数法:当余数为负时商0,先左移 ,再+除数(直接进行到下一位商的判断)
9.定点补码除法运算
10.C语言类型转换
1.C语言的整数用补码表示
2.无符号数和有符号数的相互转换不会改变数值的存储,但是会改变解释方式(符号位)
3.长整数变短整数:高位截断,保留低位
4.短整数变长整数:符号扩展
11.数据的存储和排列
1.大小端存储:
①大端方式:最高有效字节存在低地址,最低有效字节存在高地址(利于人类阅读)
②小段方式:最低有效字节存在低地址,最高有效字节存在高地址(方便机器处理)
2.按字节、半字、字寻址:设字长位32bit,半字为16bit
①按字节寻址:一个字节对应一个地址
②按半字寻址:一个半字对应两个字节,因此,每个半字对应两个地址。设寻找半字地址为3,则二进制为11,左移一位(一个半字对应两个字节),因此,首字节地址为110,即6
③按字寻址:一个字对应四个字节,因此,一个字对应四个地址。设寻找字地址为2,则二进制为10,左移两位(一个字对应四个字节),因此,首字节地址为1000,即8
3.边界对齐:每次访存只能读/写一个字
12.无符号整数乘法的基本电路结构
1.被乘数存放在被乘数寄存器X中,乘数存放在乘数寄存器Y中
2.乘积寄存器位P数和被乘数寄存器X、乘数寄存器Y相同,逻辑上乘积寄存器P、乘数寄存器Y和进位C是连在一起使用的(即逻辑右移时,原来的C作为现乘积寄存器的最高位,原乘积寄存器的最低位作为现乘数寄存器的最高位,原乘数寄存器的最低位舍弃)
3.ALU主要实现加法运算,C是两个数相加可能产生的进位:若当前乘数寄存器的最低位为0,则ALU左边输入乘积寄存器,右边输入0,计算结果输出到乘积寄存器中;若当前乘数寄存器的最低位为1,则ALU左边输入乘积寄存器,右边输入被乘数寄存器,计算结果输入到乘积寄存器中
4.ALU计算完成并输出数据后,进行逻辑右移
5.控制逻辑发出加、右移和写使能控制信号;设乘数和被乘数位n位,则计数器从n开始计数,进行n轮加法、右移,每进行一轮加法和右移后,计数器 - 1
6.两个n位数相乘,结果用2n位暂存,结果最终保留的是乘数寄存器中n bit,乘积寄存器舍弃。若乘积寄存器全0,则不发生溢出;只要有1,则发生溢出
7.初始状态:被乘数寄存器X存放被乘数1101,乘数寄存器Y存放乘数0111,乘积寄存器置为0,计数器 = 4
①第一轮加法:
A.控制逻辑检测乘数寄存器中当前最后一位为1,则乘积寄存器需要加上被乘数
B.控制逻辑发出发出加信号,乘积寄存器输入到ALU的左边,被乘数寄存器输入到ALU的右边,即进行0000 + 1101 = 1101,计算不产生进位,C为0
C.ALU计算完成后,ALU发出写使能信号,使得计算结果写入乘积寄存器中
第一轮右移:逻辑右移
A.进位C、乘积寄存器、乘数寄存器逻辑上是相连的
B.进行逻辑右移,右移后,则原来的C作为现乘积寄存器的最高位,原乘积寄存器的最低位作为现乘数寄存器的最高位,原乘数寄存器的最低位舍弃
此时,第一轮的加法和移位进行完毕,计数器 - 1 = 3
②第二轮加法:
A.控制逻辑检测乘数寄存器中当前最后一位为1,则乘积寄存器需要加上被乘数
B.控制逻辑发出发出加信号,乘积寄存器输入到ALU的左边,被乘数寄存器输入到ALU的右边,即进行0110 + 1101 = 1 0011,计算产生进位,C为1
C.ALU计算完成后,ALU发出写使能信号,使得计算结果写入乘积寄存器中
第二轮右移:逻辑右移
此时,第二轮的加法和移位进行完毕,计数器 - 1 = 2
③第三轮加法:
A.控制逻辑检测乘数寄存器中当前最后一位为1,则乘积寄存器需要加上被乘数
B.控制逻辑发出发出加信号,乘积寄存器输入到ALU的左边,被乘数寄存器输入到ALU的右边,即进行1001 + 1101 = 1 0110,计算产生进位,C为1
C.ALU计算完成后,ALU发出写使能信号,使得计算结果写入乘积寄存器中
第三轮右移:
此时,第三轮的加法和移位进行完毕,计数器 - 1 = 1
④第四轮加法:
A.控制逻辑检测乘数寄存器中当前最后一位为0,则乘积寄存器需要加上0
B.控制逻辑发出发出加信号,乘积寄存器输入到ALU的左边,0000输入到ALU的右边,即进行1011 + 0000 = 1011,计算不产生进位,C为0
C.ALU计算完成后,ALU发出写使能信号,使得计算结果写入乘积寄存器中
第四轮右移:
此时,第三轮的加法和移位进行完毕,计数器 - 1 = 0
⑤此时,乘法计算结束,4bit * 4bit = 8bit存储,得到最终结果0101 1011 = 91,若只保留乘数寄存器的n bit,则结果位11,发生溢出
13.有符号数乘法的基本电路结构
1.被乘数存放在被乘数寄存器X中,乘数存放在乘数寄存器Y中
2.乘积寄存器位P数和被乘数寄存器X、乘数寄存器Y相同,逻辑上乘积寄存器P、乘数寄存器Y和辅助位是连在一起使用的(即算数右移时,原乘积寄存器的最低位作为现乘数寄存器的最高位,原乘数寄存器的最低位作为现辅助位,辅助位舍弃)
3.ALU主要实现加法运算:根据辅助位和乘数寄存器的最低位进行加/减法
A.辅助位 - 乘数寄存器最低位 = 1,乘积寄存器 + X的补码
B.辅助位 - 乘数寄存器最低位 = 0,不做加法
C.辅助位 - 乘数寄存器最低位 = -1,乘积寄存器 + (-X)的补码(逻辑减法,实际加法)
4.ALU计算完成并输出数据后,进行算数右移(用符号位补空位)
5.控制逻辑发出加、右移和写使能控制信号;设乘数和被乘数位n位,则计数器从n开始计数,进行n轮加法、右移,每进行一轮加法和右移后,计数器 - 1
6.两个n位数相乘,结果用2n位暂存,结果最终保留的是乘数寄存器中的n bit,乘积寄存器舍弃。若高n + 1 bit为全0或全1,则不溢出;否则,溢出
7.初始状态:被乘数寄存器X为1101,乘数寄存器为1101,乘积寄存器和辅助位设为0,计数器设置为4,即进行4轮加法和算数右移
①.进行第一轮加法:
Ⅰ.辅助位 (0)- Y最低位(1)= -1,控制逻辑发出减法信号,则P输入到ALU左边,被乘数寄存器X的补码输入到ALU右边
Ⅱ.ALU计算结果输出到P中
进行第一轮算数右移:用符号位补空位
第一轮加法、右移完成后,计数器 - 1 = 3
②进行第二轮加法:辅助位 (1)- Y最低位(1)= 0,控制逻辑不发出加/减
进行第二轮右移:
第二轮加法、右移完成后,计数器 - 1 = 2
③进行第三轮加法:
进行第三轮加法:辅助位 (1)- Y最低位(1)= 0,控制逻辑不发出加/减
进行第三轮右移:
第三轮加法、右移完成后,计数器 - 1 = 1
④进行第四轮加法:
Ⅰ.辅助位 (1)- Y最低位(0)= 1,控制逻辑发出加信号,则P输入到ALU左边,被乘数寄存器X输入到ALU右边
Ⅱ.ALU计算结果输出到P中
进行第四轮右移:
第四轮加法、右移完成后,计数器 - 1 = 0
⑤此时,乘法计算结束,4bit * 4bit = 8bit存储(不计算辅助位),得到最终结果1110 1011 = -21,若只保留乘数寄存器内的n bit,则高n + 1位为1110 1,不为全0或者全1,则发生溢出
14.除法电路的基本电路
定点小数除法:
定点整数除法: