ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:182.45KB ,
资源ID:6347006      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6347006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(COP实现补码Booth乘法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

COP实现补码Booth乘法.docx

1、COP实现补码Booth乘法课程设计名称:计算机组成原理课程设计课程设计题目:COP2000实现补码Booth乘法第1章 总体设计方案1.1 设计原理 课程设计内容:利用COP2000的指令集编程实现两个7bit(含1bit符号位)补码相乘的功能,要求被乘数,乘数是7bit补码,乘积是13位补码。 实现任务的基本原理是Booth算法。1.2 设计思路Booth补码一位乘的设计主要包括五个功能模块。初始化:完成部分积,附加位,循环次数的初始化。求和:根据YnYn+1的值选择部分积和X补、-X补或是0相加。右移:完成部分积和乘数部分整体右移一位,其中部分积是算术右移。判断循环次数:完成一次求和和右

2、移操作后循环次数减一,最后一次只求 和不进行右移操作。结果输出:将部分积和乘数部分分别保存到内存中。1.3 设计环境本次课程设计的环境是COP2000实验平台自带的集成开发环境,允许用户进行程序的编写、模拟运行、观察数据通路等操作。COP2000实验平台对应的模型机为8位机,数据总线和地址总线均为8位。它包括了一个标准CPU所具备的所有部件,这些部件包括:运算器ALU、累加器A、工作寄存器W、左移门L、直通门D、右移门R、寄存器组R0R3、程序计数器PC、地址寄存器MAR、堆栈寄存器ST、中断向量寄存器IA、输入端口IN、输出端口寄存器OUT、程序存储器EM、指令寄存器IR、微程序计数器uPC

3、、微程序存储器uM等。此次课设是使用COP2000的指令集编程,所使用的部分指令如下:ADD A, R?; 将寄存器R?中的值送到累加器A中ADD A,MM; 将存储器MM地址中的值送到累加器A中ADD A,#II ; 将立即数II加到累加器中SUB A,#II ; 从累加器A中减去立即数II加入累加器A中AND A,#II ; 累加器A“与”立即数IIOR A,#II ; 累加器A“或”立即数IIMOV A,R?; 将寄存器R?的值送到累加器A中MOV A,MM; 将存储器MM地址中的值送到累加器A中MOV A,#II ; 将立即数II送到累加器A中MOV MM, A ; 将累加器A中的值送

4、到存储器MM地址中MOV R?,#II; 将立即数II送到寄存器R?中JZ MM ; 若零标志位置1,跳转到MM地址JMP MM ; 跳转到MM地址IN ; 从输入端口读入数据到累加器A中OUT ; 将累加器A中的数据输出到输出端口RR A ; 累加器A右移CPL A ; 累加器A取反,再存入累加器A中 第2章 详细设计方案2.1 各功能模块详细设计方案2.1.1总体设计方案 由于Booth补码一位乘里包含部分积,乘数的补码Y补,附加位Yn+1,被乘数的补码X补,被乘数的相反数的补码-X补,还有循环次数n。用寄存器R0保存部分积,R1保存循环的次数,R2保存输入的被乘数,R3保存输入的乘数,存

5、储器0F0H地址空间内中保存的是被乘数的补码X补,0F1H中保存的是被乘数相反数的补码-X补,0F2H中保存乘数的补码,0F3H中保存附加位Yn+1,最后的结果部分积保存在0E0H中,乘数部分保存在0E1H中。由于被乘数和乘数都是包含符号位在内的7位补码,乘积是包含符号位在内的13位补码,其中前7位来自部分积的低7位,后6位来自乘数部分的前6位。 2.1.2初始化模块设计方案 初始化部分应该完成部分积和附加位Yn+1的初始化,即R0初始化为0,0F3H初始化为0,并且循环次数初始化为6,即R1被初始化为6(因为乘数和被乘数都是包含符号位在内的7位补码,因此循环次数为6)。之后还应该完成被乘数和

6、乘数的输入,分别将被乘数和乘数的补码存放到R2和R3中。接着判断被乘数的正负,将被乘数的补码及其相反数的补码以双符号位的形式存放到0F0H和0F1H中(正数的双符号位是00,负数的双符号位是11,运算过程中采用双符号位是为了防止假溢出,其最高位才是真正的符号位),最后将乘数的补码存到0F2H中。2.1.3 求和模块设计方案 根据乘数部分的最低位Yn和附加位Yn+1的值来确定部分积和哪个数相加,当YnYn+1是00时,部分积加0;YnYn+1是01,部分积加X补;YnYn+1是10时,部分积加-X补;YnYn+1是11,部分积加0。判断YnYn+1的值的过程如下,先判断Yn的值,接着再判断附加位

7、Yn+1,若部分积加0,则直接进入下一模块,即右移模块,否则,部分积加上X补或-X补再进入下一模块。在求和过程中使用双符号位补码。2.1.4 右移模块设计方案 右移过程需将部分积和乘数部分整体右移一位,部分积的右移是算术右移,即要保留符号位,部分积的最低位应移到乘数部分的最高位,乘数部分的最低位应移到附加位部分,由于部分积、乘数、附加位是分开存放的,如果直接移位会导致最低位丢失数据。因此应该先将乘数的最低位保存到附加位,再将乘数右移一位,之后将部分积最低位保存到乘数的最高位,再将部分积右移。但由于部分积采用双符号位运算,部分积在移位之后要判断次高位是0还是1,若是0,说明原来的部分积是正数,应

8、将部分积的最高位写成0,否则,说明部分积原来是负数,应将最高位写成1。右移完之后接循环模块。2.1.5 判断循环次数模块设计方案 当求和和右移运行完成后,就完成了一次循环,这时循环次数应该减一,接着判断是否是最后一次循环,若不是最后一次循环,转去执行求和模块,再执行右移模块,若是最后一次循环,则只执行求和模块而不再右移,接着转输出模块。2.1.6 结果输出模块设计方案 要求结果是包含符号位在内的13位补码,对于部分积,先将后六位数保留再判断部分积的最高位的符号,若是1,将部分积的次高位写为1,若是0,将部分积的次高位写为0,这样就将部分积的后7位保留。然后再将乘数部分的前六位保留,将部分积和乘

9、数部分分别存到0E0H和0E1H中,并将结束输出。2.2 总体和各功能模块的流程图2.2.1 总控流程图 总控流程包括初始化、求和、右移、判断循环次数、输出五个模块。总控流程如图2.1所示。 图2.1 总控流程图2.2.2 初始化模块流程图 初始化部分包括部分积、附加位和循环次数的初始化并且要输入被乘数的补码和乘数的补码。初始化流程图如图2.2所示。 图2.2 初始化模块流程图 说明:部分积,附加位和循环次数分别保存在R0、内存中的0F3H单元、R1中,X补存放在R2和0F0H(以双符号位的形式)中,-X补存放在0F1H(以双符号位的形式)中,Y补存放在R3和0F2H中。X代表被乘数,Y代表乘

10、数。#00H-R0表示将立即数00H存放到R0中,M(0F3H)表示内存中的0F3H单元,#06H-R1表示将立即数06H存到R1中。2.2.3 求和模块流程图求和模块要根据YnYn+1的值选择部分积和X补或-X补还是0相加。具体求和模块流程图如图2.3所示。 图2.3 求和模块流程图 说明:Yn指的是乘数部分的最后一位,Yn+1指的是附加位,X代表被乘数。2.2.4 右移模块流程图 右移模块包括部分积和乘数部分的右移,在右移之前应先把乘数部分的最后一位移到附加位上,再将乘数部分右移,然后将部分积的最后一位存到乘数部分的最高位,再将部分积右移。部分积右移完之后,判断部分积的次高位是0还1,再把

11、部分积的最高位写成相应的数,这样,部分积保存的就是双符号数,避免运算的时候出现假溢出。右移模块流程图如图2.4所示。图2.4 右移模块流程图2.2.5 判断循环次数模块流程图 当右移过程执行完后,进入判断循环次数模块,若循环次数不为0,则进入求和和右移模块,否则,进入求和模块,即最后一次不进行右移操作。判断循环次数流程图如图2.5所示。图2.5 判断循环次数模块流程图2.2.6 输出模块流程图 输出模块输出最后13位补码的16进制表示。部分积的后7位保存在0E0H中的后7位,乘数部分的前6位保存在0E1H中的后6位。输出模块流程图如图2.6所示 图2.6 输出模块流程图 说明:因为在运算过程中

12、部分积使用的是双符号位,而运算结果是单符号位,部分积最高位保存的是运算结果的真实符号,所以在得出运算结果后应该判断部分积最高位的值,然后将部分积的次高位置成相应的值,再保存部分积后7位的值从而得出单符号位的结果。第3章 程序调试过程与结果分析3.1 程序调试过程 1、 在求和过程中,一开始使用的是单符号位运算,但在调试过程中发现,有时候会出现假溢出的现象导致结果出错,之后将部分积改为双符号位运算之后,结果不再出错,且部分积最高位才是结果真正的符号位。 2、在右移过程中,刚开始设计的时候想的不周到,直接将乘数部分右移一位,但这时会将乘数部分最后一位丢失,从而不知道右移之后附加位变成什么值。之后将

13、整个循环过程改为:先判断乘数部分最后一位的值,将部分积改为相应的值,接着将乘数部分移位,再判断部分积最后一位的值,将乘数最高位改为相应的值,最后判断部分积次高位的值并将部分积最高位置成相应的值。 3、在输出结果时,疏忽题目的要求是生成13位补码,直接将部分积包括双符号位在内的8位补码存到0E0H中,解决方法是:判断部分积最高位的值,将部分积次高位置成和最高位一样的值,然后将最高位置成0,这样部分积的有效部分只有7位存到0E0H中的后7位,乘数部分前6位保存到0E1H的后6位。3.2 结果分析 设X补=1010101 ,Y补=0010111; 1、初始化过程 R0初始化为00H,R1初始化为06

14、H,R2里存的是X补(55H),R3里存的是Y补(17H)。X补(双符号且值是D5H)存放到0F0H中,-X补(双符号且值是2BH)存放到0F1H中,Y补存放到0F2H中,附加位存放到0F3H中,0F3H初始化为0。初始化结果如图3.1和3.2所示。 图3.1 初始化结果图3.2 初始化结果2、求和过程以第一次求和过程为例,先判断YnYn+1=10,取出-X补(双符号且值为2BH)到A中,准备进行求和操作,结果如图3.3所示。图3.3 取出-X补到A-X补和部分积相加结果为2BH,将新的部分积存入R0。如图3.4所示。图3.4 部分积+-X补3、右移过程完成一次整体右移之后,部分积是15H,乘

15、数是4BH,附加位为01H。即R0是15H,0F2H为4BH,0F3H为01H如图3.5和3.6所示。图3.5 第一次右移之后的部分积结果图3.6 第一次右移之后乘数和附加位的结果4、循环次数减一 R1由6变为5,结果如图3.7所示。 图3.7 循环次数由6变为55、最后结果输出 部分积结果为70H,保存在0E0H中,乘积结果为23H,保存在0E1H中,结果如图3.8所示。图3.8 结果输出参考资料1 唐朔飞. 计算机组成原理(第2版)M.北京:高等教育出版社,2008 2 COP2000 实验指导附录MOV R0,#00000000B;部分积R0初始化为0MOV A,#00000000BMO

16、V 0F3H,A;附加位初始化为0MOV R1,#00000110B;循环次数R1初始化为6MOV A,#1010101B;输入被乘数X补的补码形式MOV R2,A;被乘数补码存到R2中AND A,#1000000B;判断被乘数是正还是负数JZ M1;若被乘数是正数转M1MOV A,R2;被乘数是负数ADD A,#10000000B;将被乘数的补码写成双符号位补码MOV 0F0H,A;将被乘数的补码存到0F0HCPL AADD A,#00000001BMOV 0F1H,A;求出被乘数的相反数的补码-X补存到0F1HJMP M2M1: MOV A,R2ADD A,#00000000B;将被乘数的

17、补码写成双符号位补码MOV 0F0H,A;被乘数的补码存到0F0HCPL AADD A,#00000001BMOV 0F1H,A;求出被乘数相反数的补码存到0F1HJMP M2M2:MOV A,#0010111B;输入乘数的补码形式并保存在R3中MOV R3,AMOV 0F2H,A;将乘数的补码存放到0F2HS0:MOV A,0F2H;将乘数的补码送到A中AND A,#0000001B;判断Yn是0还是1JZ S1;如果Yn=0转S1MOV A,0F3H;如果Yn=1则接着判断附加位是0还是1AND A,#0000001BJZ S3;附加位是0转S3S4:MOV A,0F2H;将乘数的补码送到

18、A中AND A,#0000001B;判断乘数最后一位是0还是1JZ S5;若是0转S5MOV A,0F3H;若是1则将附加位变为1OR A,#0000001BMOV 0F3H,A;将新的附加位存到0F3HJMP LOOPS3:MOV A,0F1H;取出-X补送到A中ADD A,R0;-X补+部分积MOV R0,A;将新的部分积存到R0中JMP S4S5:MOV A,0F3HAND A,#0000000B;将附加位置成0MOV 0F3H,AJMP LOOP;无条件跳转到LOOPS1:MOV A,0F3HAND A,#0000001B;判断附加位是0还是1JZ S2;若附加位是0,转S2MOV A

19、,0F0HADD A,R0;若附加位是1,部分积+X补MOV R0,AJMP S4S2:JMP S4;直接跳转到S4LOOP:MOV A,0F2HRR AMOV 0F2H,A;将乘数的补码右移一位存到0F2HMOV A,R0AND A,#00000001B;取出部分积并判断部分积的最低位是0还是1JZ S6;若部分积的最低位是0转S6MOV A,0F2H;若部分积最低位是1OR A,#1000000B;将乘数的最高位置1MOV 0F2H,AJMP LOOP1S6:MOV A,0F2HAND A,#0111111BMOV 0F2H,A;将乘数补码的最高位变成0存到0F2HJMP LOOP1LOO

20、P1:MOV A,R0RR AMOV R0,A; 将部分积右移一位存到R0中AND A,#01000000B;判断部分积次高位的符号JZ S7;若部分积次高位是0转S7MOV A,R0;若部分积次高位是1OR A,#10000000B;将部分积最高位写为1并存到R0MOV R0,AJMP S8S7:MOV A,R0AND A,#01111111B;将部分积最高位写为0MOV R0,AJMP S8S8:MOV A,R1SUB A,#0000001B;将循环次数减一MOV R1,AOR A,#0000000B;判断是否是最后一次循环JZ S9;若是最后一次循环转S9JMP S0;否则转S0S9:M

21、OV A,0F2HAND A,#0000001B;判断Yn的符号JZ S10;Yn=0转S10MOV A,0F3H;若Yn=1AND A,#0000001B;判断附加位的符号JZ S11;若附加位=0转S11JMP S12S10:MOV A,0F3HAND A,#0000001B;判断附加位最低位的符号JZ S12;若为0转S12MOV A,0F0HADD A,R0;X补+部分积MOV R0,AJMP S12S11:MOV A,0F1HADD A,R0 ;-X补+部分积MOV R0,AJMP S12S12:MOV A,R0AND A,#10000000B;判断部分积的最高位的符号JZ M3;若部分积的最高位是0转M3MOV A,R0AND A,#00111111BADD A,#1000000B;保留部分积的后7位且最高位为1JMP M4M3:MOV A,R0AND A,#00111111BADD A,#0000000B;保留部分积的后7位且最高位为0JMP M4M4:MOV 0E0H,A;将最后的部分积的后7位存到0E0HOUTMOV A,0F2HRR AMOV 0F2H,AMOV 0E1H,A;将最终的乘数部分前6位存到0E1H中,最终得到了13位补码OUTOVER:JMP OVER

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1