微机原理与应用第二次实验报告.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《微机原理与应用第二次实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理与应用第二次实验报告.docx(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、微机原理与应用第二次实验报告电92 雷云泽 一、实验目的1.了解计算机的组成与各部件的功能2.熟悉简单计算机的指令集,学习编写汇编语言程序和机器码程序3.熟悉各类型指令执行的数据通道4.设计一个8位单周期简单计算机系统二、实验任务包括练习编程、简单计算机系统A、B、C的设计1.编程练习先采用汇编语言格式编写程序,检查程序的思路、流程,在无误情况下,转换成机器码。程序一:完成将两个固定数据(如0x95,0x35E)进行加、减、与、或、比较运算,将结果顺序存放在地址分别为0x200x21、0x220x23、0x240x25、0x260x27、0x280x29的10个RAM单元中。程序二:完成将两个
2、固定数据(如0x95,0x35E)进行加、减运算,将运算结果顺序显示在数码管上,两个结果显示之间需加一定延时(软件延时),可以通过给一个寄存器赋初值,对这个寄存器进行减运算,直至结果为0)。程序三:从键盘输入一个表达式,如149-862=,通过执行ROM中的程序代码,将运算结果显示在数码管上。2.简单计算机系统设计A利用设计的ROM、ROM、ALU、控制器、PC程序指针计数器模块,构成简单计算机系统A,在ROM中存放编程练习中的程序1,并进行系统的仿真和调试,下载到实验板上进行测试、运行。注意在各模块的连接中,需根据各指令数据通路的要求增加多路选择器等部件,避免信号相连时的冲突。3.简单计算机
3、系统设计B在简单计算机系统A的基础上,增加I/O端口及其映射模块、数码管输出接口,将I/O端口及其映射模块中的IO07.0、IO17.0与数码管输出接口的datainL7.0、datainH7.0相连,构成简单计算机系统B。在ROM中存放编程练习中的程序2,并进行系统的仿真和调试,下载到实验板上进行测试、运行。4.简单计算机系统设计C在简单计算机系统B的基础上,增加44键盘输入接口模块,将I/O端口及其映射模块中IO37.0IO57.0分别与键盘输入接口模块的srcL7.0、srcH7.0、dstL7.0、ALUOP7.0相连,构成简单计算机系统C,在ROM中存放编程练习中的程序3,并进行系统
4、的仿真和调试,下载到实验板上进行测试、运行。三、任务实现1.编程练习编程的基本思路是,读取数值之前都要将待存放数据的寄存器清空,可用ANDI实现,对寄存器的操作都需要指定地址,指定地址时可能需要一个空的寄存器加上一个立即数来表示。程序一:ANDI R0,R0,0x00 #寄存器清零ADDI R0,R0,0x95 #赋值第一操作数低八位ANDI R1,R1,0x00 #寄存器清零ADDI R1,R1,0x5E #赋值第二操作数低八位ANDI R2,R2,0x00 #寄存器清零ADDI R2,R2,0x00 #赋值第一操作数高八位ANDI R3,R3,0x00 #寄存器清零ADDI R3,R3,0
5、x03 #赋值第二操作数高八位ADD R1,R0,R1 #低八位不带进位相加ADDC R3,R2,R3 #高八位带进位相加ANDI R0,R0,0x00 ANDI R2,R2,0x00SW R1,R0,0x00 #低八位结果写入0x00SW R3,R2,0x01 #高八位写入0x01ANDI R0,R0,0x00 #寄存器清零ADDI R0,R0,0x95 #以下运算均与加法运算类似ANDI R1,R1,0x00ADDI R1,R1,0x5EANDI R2,R2,0x00ADDI R2,R2,0x00ANDI R3,R3,0x00ADDI R3,R3,0x03SUB R1,R0,R1SUBC
6、R3,R2,R3ANDI R0,R0,0x00ANDI R2,R2,0x00SW R1,R0,0x00SW R3,R2,0x01ANDI R0,R0,0x00ADDI R0,R0,0x95ANDI R1,R1,0x00ADDI R1,R1,0x5EANDI R2,R2,0x00ADDI R2,R2,0x00ANDI R3,R3,0x00ADDI R3,R3,0x03AND R1,R0,R1AND R3,R2,R3ANDI R0,R0,0x00ANDI R2,R2,0x00SW R1,R0,0x00SW R3,R2,0x01ANDI R0,R0,0x00ADDI R0,R0,0x95ANDI R
7、1,R1,0x00ADDI R1,R1,0x5EANDI R2,R2,0x00ADDI R2,R2,0x00ANDI R3,R3,0x00ADDI R3,R3,0x03OR R1,R0,R1OR R3,R2,R3ANDI R0,R0,0x00ANDI R2,R2,0x00SW R1,R0,0x00SW R3,R2,0x01ANDI R0,R0,0x00ADDI R0,R0,0x00ANDI R1,R1,0x00ADDI R1,R1,0x03SLT R2,R0,R1ANDI R3,R3,0x00SW R2,R3,0x00需要注意的地方: 要写入数据的寄存器一定要先用ANDI语句清零 ANDI语句
8、不能用来往寄存器里存数据,应该在寄存器已用ANDI语句清零后再用ADDI语句将已知的操作数存入,不要误写作ANDI。 为了保证执行带进借位加/减法时,进借位信号能够发挥作用,最好将低八位运算和高八位运算写在一起,即ADD的下一行是ADDC,SUB的下一行是SUBC,因为ADDI指令也需要写进借位寄存器,如果在ADD后面有一个ADDI,然后再执行ADDC,则ADDC所接受的进位信号是由ADDI产生的,因而导致加法进位出错。程序二:ANDI R0,R0,0x00 #清空寄存器ADDI R0,R0,0x95 #读入第一操作数低八位ANDI R1,R1,0x00 #清空寄存器ADDI R1,R1,0x
9、5E #读入第二操作数低八位ANDI R2,R2,0x00 #清空寄存器ADDI R2,R2,0x00 #读入第一操作数高八位ANDI R3,R3,0x00 #清空寄存器ADDI R3,R3,0x03 #读入第二操作数高八位ADD R1,R0,R1 #低八位相加ADDC R3,R2,R3 #高八位带进位相加ANDI R0,R0,0x00ANDI R2,R2,0x00SW R1,R0,0x00 #低八位写IOSW R3,R2,0x01 #高八位写IOADDI R2,R2,0x40 #R2寄存器数据为64ADDI R0,R0,0x01 #R0寄存器加1BEQ R0,R2,0x01 #如果R0=R2
10、,则跳过下一行JMP 0x0F #跳到给R0+1那一行ANDI R0,R0,0x00 #以下为减法执行过程,和加法类似ADDI R0,R0,0x95ANDI R1,R1,0x00ADDI R1,R1,0x5EANDI R2,R2,0x00ADDI R2,R2,0x00ANDI R3,R3,0x00ADDI R3,R3,0x03SUB R1,R0,R1SUBC R3,R2,R3ANDI R0,R0,0x00ANDI R2,R2,0x00SW R1,R0,0x00SW R3,R2,0x01需要注意的地方:加减法执行过程都与程序1相似,不同之处是这个程序要求加减法结果能够延时先后出现,思路是首先给一
11、个寄存器赋值(本程序中为0x40,即十进制64),然后将另一个寄存器加1,并与64比较,如果不等于64,则跳回寄存器加1语句并再次比较,如果等于64,则跳过跳转语句,往下执行减法运算语句。在使用BEQ和JMP指令时,有一点必须注意,即ROM的延时问题。在ROM模块的仿真中可以发现,ROM的读取需要时钟上升沿的参与,即在ROM的输入端给出地址后,还必须等待时钟周期上升沿的来到,相应地址的数据才会出现在输出端口。因此当使用指令JMP时,并不会在下一个上升沿就跳转到JMP所指定的指令,而是继续执行JMP的下一行指令,之后才跳转到所希望跳转的指令。BEQ或BNE指令的执行过程也与此类似,并不会在BEQ
12、/BNE指令到来后,在下一个时钟周期就跳转到相应的指令,而是继续执行下一行指令,然后再发生跳转,也因此会跳转到预计指令的下一行,即实际上会跳到PC+imm+2这一行指令,而不是PC+imm+1。因此,在写汇编语言需要用到JMP/BEQ/BNE时,必须在它的下一行添加冗余指令0x0000,以免执行到不想执行的指令,同时,BEQ/BNE跳转的行数也必须算清楚,否则将不会跳转到所希望的那一行。冗余指令0000未在上文列出,需要在代码写好转换成16进制后,手工在相应的指令下添加。冗余指令0000未定义其功能,不会产生任何实际的操作。程序三:ANDI R0,R0,0x00 #寄存器全部清零ANDI R1
13、,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x06 #将IO6端口的ALUOP读入ADDI R1,R1,0x0A #加号对应的ALUOPBEQ R0,R1,0x10 #跳转到加法运算语句ANDI R1,R1,0x00ADDI R1,R1,0x0B #减号对应的ALUOPBEQ R0,R1,0x1C #跳转到减法运算语句ANDI R1,R1,0x00ADDI R1,R1,0x0C #and对应的ALUOPBEQ R0,R1,0x28 #跳转到与运算语句ANDI R1,R1,0x00ADDI R1,R1,0x0E #比较对应的ALUOPBEQ R
14、0,R1,0x34 #跳转到比较运算语句ANDI R1,R1,0x00ADDI R1,R1,0x0F #or对应的ALUOPBEQ R0,R1,0x3E #跳转到或运算语句ANDI R0,R0,0x00 #加法运算语句,寄存器清零ANDI R1,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x02 #被加数低八位,自IO2LW R1,R1,0x04 #加数低八位,自IO4LW R2,R2,0x03 #被加数高八位,自IO3LW R3,R3,0x05 #加数高八位,自IO5ADD R0,R0,R1 #低八位不带进位相加ADDC R2,R2,R3 #
15、高八位带进位相加ANDI R1,R1,0x00ANDI R3,R3,0x00SW R0,R1,0x00 #将低八位运算结果输出至IO0SW R2,R3,0x01 #将高八位运算结果输出至IO1JMP 0xFF #跳转至ROM末尾ANDI R0,R0,0x00 #减法运算语句,寄存器清零ANDI R1,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x02 #被减数低八位,自IO2LW R1,R1,0x04 #减数低八位,自IO4LW R2,R2,0x03 #被减数高八位,自IO3LW R3,R3,0x05 #减数高八位,自IO5SUB R0,R0,
16、R1 #低八位不带借位相减SUBC R2,R2,R3 #高八位带借位相减ANDI R1,R1,0x00ANDI R3,R3,0x00SW R0,R1,0x00 #将低八位运算结果输出至IO0SW R2,R3,0x01 #将高八位运算结果输出至IO1JMP 0xFF #跳转至ROM末尾ANDI R0,R0,0x00 #与运算语句,寄存器清零ANDI R1,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x02 #第一运算数低八位,自IO2LW R1,R1,0x04 #第二运算数低八位,自IO4LW R2,R2,0x03 #第一运算数高八位,自IO3L
17、W R3,R3,0x05 #第二运算数高八位,自IO5AND R0,R0,R1 #低八位相与AND R2,R2,R3 #高八位相与ANDI R1,R1,0x00ANDI R3,R3,0x00SW R0,R1,0x00 #将低八位运算结果输出至IO0SW R2,R3,0x01 #将高八位运算结果输出至IO1JMP 0xFF #跳转至ROM末尾ANDI R0,R0,0x00 #比较运算语句,寄存器清零ANDI R1,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x02 #第一运算数低八位,自IO2LW R1,R1,0x04 #第二运算数低八位,自IO
18、4LW R2,R2,0x03 #第一运算数高八位,自IO3LW R3,R3,0x05 #第二运算数高八位,自IO5SLT R2,R2,R3 #高八位执行比较运算ANDI R1,R1,0x00ANDI R3,R3,0x00SW R2,R3,0x00 #将比较结果输出至IO0JMP 0xFF #跳转至ROM末尾ANDI R0,R0,0x00 #或运算语句,寄存器清零ANDI R1,R1,0x00ANDI R2,R2,0x00ANDI R3,R3,0x00LW R0,R0,0x02 #第一运算数低八位,自IO2LW R1,R1,0x04 #第二运算数低八位,自IO4LW R2,R2,0x03 #第一
19、运算数高八位,自IO3LW R3,R3,0x05 #第二运算数高八位,自IO5OR R0,R0,R1 #低八位相或OR R2,R2,R3 #高八位相或ANDI R1,R1,0x00ANDI R3,R3,0x00SW R0,R1,0x00 #将低八位运算结果输出至IO0SW R2,R3,0x01 #将高八位运算结果输出至IO1JMP 0xFF #跳转至ROM末尾需要注意的地方:首先必须把从键盘模块传来的ALUOP,即运算符存入寄存器中,然后给另一个寄存器赋加、减、与、或、比较相应的运算符,将存有ALUOP的寄存器分别与这些寄存器中的值进行比较,若相等则跳转到相应的代码处,每种运算的代码都在结束处
20、有一条指令JMP 0xFF,跳转到ROM的末尾,以避免执行到别的代码。而程序计数器指针模块PC在设计的时候,令其在计数到达0xFF时就不再计数。因此ROM中的程序只会执行一次。无论执行哪一种运算,最后都在执行完以后跳转到ROM末尾并保持停止。另外,在使用JMP/BEQ/BNE指令时仍需注意延迟的问题,必须在它们的下一行添加冗余指令0000,同时跳转行数的计算也必须将冗余指令所在的行考虑在内。2.简单计算机系统设计A/B【模块连接】首先,必须将已经设计好的模块按其功能和数据流向组装起来。由于任务A和B所使用的模块相似,因此将这两个任务一起完成。待组装的模块有:PC程序指针计数器模块instrco
21、nunit:程序存放ROM模块rom_256_16:控制器模块ctrlunit:寄存器组模块reg4_8:运算器模块ALU:标志寄存器flag:IO端口映射模块IO_PORT:下面分别就每一个模块的连接情况进行描述 程序指针计数器模块instrconunit程序指针计数器模块必须接受时钟信号,和控制器模块所给出的跳转信号BRANCH,JUMP,以及立即数imm,此外由于PC模块计数到255后就停止不动,因此必须有一个复位信号,使得每次CPU执行新运算时,PC模块都要从0开始计数,因此PC模块有一个同步复位端RESET,在任务A/B中暂时用不上。跳转信号BRANCH和JUMP都由控制器模块根据指
22、令给出,因此连接到控制器模块相应的输出端口上,imm是立即数,在BRANCH=1时发挥作用,要接到程序存储模块rom256_16的输出端的低八位。它的输出端是一个八位二进制数,作为程序存储模块的地址输入,接到rom256_16的输入端。 程序存储模块rom256_16ROM中的数据是在编译时通过指定的hex文件写入的,在下载到实验板上形成系统后不可更改,因此需要在生成ROM模块时指定.hex文件,并将编好的程序放入其中。此外,ROM需要一个时钟信号输入,跟PC模块共用同一个时钟信号即可,事实上,在本系统中,CPU内部所有需要时钟的模块都使用同一个时钟信号,这样CPU内部模块都工作在同一个频率下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 应用 第二次 实验 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内