




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江苏大学 计算机组成原理课程设计报告 专业名称: 软件工程班级学号:软件1001 学生姓名: 张建彬指导教师: 杨旭东 设计时间: 2012年6月 11 日 2012年6月20日第一天 取操作数微程序的设计和调试1、 设计目标 设计并调试取操作数的微程序 二、取操作数微流程三、测试程序、数据及运行结果1、测试内容:立即寻址,直接寻址运行数据:内存地址(h)机器码(h)汇编指令0000077a 5678 0010mov #5678h,0010h运行结果及分析:从微地址可以看出,先是取指令001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-01b01f-024-025-026-007,是直接寻址方式,最后是执行阶段,007-044-047-072-000,将结果mov到内存里。2、测试内容:立即寻址,寄存器运行数据:内存地址(h)机器码(h)汇编指令00000761 5678 mov #5678h,r1运行结果及分析:从微地址可以看出,先是取指令001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-044-046-000,将结果mov到寄存器里。由grs可以看出最终结果由0000变成了5678。4、 设计中遇到的问题及解决办法 才开始的时候,对软件的应用不是很熟悉,遇到一些麻烦,在同学的帮助下,解决了软件应用问题。第二天 运算指令的微程序设计与调试1、 设计目标 设计并调试运算指令的微程序。二、运算指令微程序入口地址指令助记符指 令 编 码入口地址(h)fedcba9876543210movsrc, dst000001源地址码目的地址码044addsrc, dst000010源地址码目的地址码048addcsrc, dst000011源地址码目的地址码04csub src, dst000100源地址码目的地址码050subbsrc, dst000101源地址码目的地址码054cmpsrc, dst000110源地址码目的地址码058andsrc, dst000111源地址码目的地址码05cor src, dst001000源地址码目的地址码060xor src, dst001001源地址码目的地址码064testsrc, dst001010源地址码目的地址码068inc dst00000010001目的地址码0a4dec dst00000010010目的地址码0a8not dst00000010011目的地址码0ac三、运算类指令微程序微地址(h)微指令(h)微命令bmna注释00700000800op4xxx指令执行入口0489870006ftroe, add, sce, pswce006fadd04c98b0006ftroe,addc,sv,pswce006faddc05098f0006ftroe,sub,sv,pswce006fsub06f00000e707070存结果07068000000soe,grsce0000alu运算,结果送寄存器07160030072soe,drce0072结果送存储器07200052000droe,aroe,wr0000四、测试程序、数据及运行结果1、测试内容:add运算运行数据:内存地址(h)机器码(h)汇编指令000000020761 56780b61 f000mov #5678h,r1add #f000, r1运行结果及分析: 从微地址可以看出,第一阶段先是取第一条指令(mov #5678h,r1)001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-044-046-000,将结果mov到寄存器里。在grs可以看出由0000变成了5678。第二阶段先是取第二条指令(add #f000, r1)001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-048-04f-070-000,是add运算,结果存放在寄存器grs中,可以看出结果为4678,并且产生进位,szoc=0001,正确。五、设计中遇到的问题及解决办法 指令的入口地址开始时没看懂,在同学的点拨下明白了。再是写微程序阶段,完成微程序的输入后,输入时由于不太仔细有一些错误,经过调试发现并改正了错误。经过对每条运算的测试,一些结果不对,在自己的一步一步的查找中,通过和同学的微程序的对照,一一弄懂并改正了。第三天 cpu硬件的初级设计与验证一、设计目标 在运算器实验的基础上对硬件进行扩充,建立初级cpu的数据通路,构造一个只支持运算指令的初级cpu。二、硬件设计1、pc模块设计(加上适当注释)module pc(d,q,n_reset,clk,ce,pcinc); input 15:0 d; input n_reset,clk,ce; input pcinc; output 15:0 q; reg 15:0 data;always (posedge clk or negedge n_reset) begin if (!n_reset)data = 0; else if (ce)data = d;else if(pcinc)data = data+1; endassign q = data;endmodule2、ir模块设计module ir #(parameter datawidth=16)(input wire datawidth-1:0 d, input wire clk, input wire ce, input n_reset, output reg datawidth-1:0 q);always(posedge clk or negedge n_reset) begin if (!n_reset)q = 0; else if (ce)q = d;enddr:module dr #(parameter datawidth=16)(input wire datawidth-1:0 data_ib, input wire datawidth-1:0 data_db, input wire clk, input wire drce_ib, input wire drce_db, input n_reset, output reg datawidth-1:0 q);always(posedge clk or negedge n_reset) begin if(!n_reset)q=0;else if(drce_ib)q=data_ib;else if(drce_db)q=data_db; endendmodule3、顶层模块设计(自己增加的设计部分)/tr/tr寄存器的实例化r #(datawidth) tr(.q(tr_out),.d(ib),.clk(clock),.ce(trce),.n_reset(n_reset);buffer #(datawidth) reg_buffer(.q(ib), .d(tr_out), .oe(troe);/ ar/ar寄存器的实例化r #(datawidth) ar(.q(ar_out),.d(ib),.clk(clock),.ce(arce),.n_reset(n_reset);buffer #(addrwidth) ar_ab(.q(ab), .d(ar_out), .oe(aroe_ab);buffer #(addrwidth) ar_ib(.q(ib), .d(ar_out), .oe(aroe_ib);/ir/ir寄存器的实例化r #(datawidth) ir(.q(ir_out),.d(ib),.clk(clock),.ce(irce),.n_reset(n_reset);/pcpc pc(.d(ib), .q(pc_out), .n_reset(n_reset), .clk(clock), .ce(pcce), .pcinc(pcinc);buffer #(datawidth) pc_buffer(.q(ib), .d(pc_out), .oe(pcoe);/drdr #(datawidth) dr(.q(dr_out), .data_ib(ib), .data_db(db), .clk(clock), .drce_ib(drce_ib), .drce_db(drce_db), .n_reset(n_reset);buffer #(datawidth) dr_db(.q(db), .d(dr_out), .oe(droe_db);buffer #(datawidth) dr_ib(.q(ib), .d(dr_out), .oe(droe_ib);三、验证1、测试内容:add运算运行数据:内存地址(h)机器码(h)汇编指令000000020761 56780b61 f000mov #5678h,r1add #f000, r1结果和第二天的一样,说明硬件扩充正确。四、设计中遇到的问题及解决办法 在写tr,ar,ir的实例化代码时,没注意是用寄存器模块r实例化得到的,经过报错和仔细看书后,发现了问题,成功改正过来了。完成程序运行出了问题,经过查找发现是dr模块出了问题,if(!n_reset)q=0;else if(drce_ib)q=data_ib;else if(drce_db)q=data_db;这一句被我写成了if(!n_reset)q=0;else if(drce_ib)q=data_ib;else q=data_db。第四天 为cpu扩充转移指令一、设计要求 在初级cpu的基础上进行功能扩充,使其支持转移类指令二、硬件uag模块设计(自己修改的设计部分,加上适当注释)3d3:uagout = na8:1,bm3_uar0; /3,根据条件转移指令操作码psw的zf,of,sf,cf状态标志决定微地址/第四天always(szoc, ir) begin case(ir7:6)/ 条件转移类指令 2b00: flag_mux=szoc0; 2b01: flag_mux=szoc1; 2b10: flag_mux=szoc2; 2b11: flag_mux=szoc3; default:flag_mux002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-044-046-000,将结果mov到寄存器里。在grs可以看出由0000变成了5678。第二阶段先是取第二条指令(add #f000, r1)001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-048-04f-070-000,是add运算,结果存放在寄存器grs中,可以看出结果为4678,并且产生进位,szoc=0001,正确。第三阶段,进入jc指令,因为c=1,有进位,所以条件满足,执行的是075-077-000,正确。五、设计中遇到的问题及解决办法 程序中误将赋值符号=写成了=, 被同学发现,及时修改,并成功得到解决。第五天 为cpu扩充移位指令一、设计目标 在前面的cpu的基础上扩充硬件,使其支持移位指令。二、硬件设计1、shifter模块设计(加上适当注释)wire data_lsb; wire data_hsb; /*/ */ 第五天要修改的代码 */assign data_lsb = 1b0 ; /assign data_hsb = 1b0 ; mux#(1) mux_1(.d1(0),.d2(0),.d3(d15),.d4(cf),.q(data_lsb),.addr(ir76); mux#(1) mux_2(.d1(d15),.d2(0),.d3(d0),.d4(cf),.q(data_hsb),.addr(ir76);/ 根据不同的移位指令,实例化两个四选一多路器,重新形成data_lsb和data_lsb */ 多路器mux在工程文件中已提供 */ */*2、cf模块设计timescale 1ns / 1psmodule cf(d15, d0, cout, q, sl, sr);input d15, d0, cout;input sl, sr;output q;reg q;always (*)begincase (sl, sr)3b01: q = d0;3b10: q = d15;default:q = cout;endcaseendendmodule3、ir_decode模块设计(自己增加修改的设计部分)2b00:bm4_ua002-003再是取目的操作数,006-01b-01f-024-025-026-007,是直接寻址方式,最后是执行阶段,007-092-06f-070,执行sar指令。由下一条指令可以看出结果变成了03b0,为右移后的结果,正确。四、设计中遇到的问题及解决办法 在实例化两个四选一多路器时,给data_lsb,data_hsb初始化了,导致运行结果出错,经过老师的指导,改正正确。第六天 为cpu扩充堆栈类指令一、设计目标 在前面的cpu的基础上增加堆栈,使其支持与堆栈有关的push、pop、call、ret指令二、硬件设计1、sp模块设计(加上适当注释)timescale 1ns / 1psmodule sp(q,d,clk,ce,n_reset); parameter datawidth=16; output datawidth-1:0 q; input datawidth-1:0 d; input clk,ce,n_reset; reg datawidth-1:0 q;always (posedge clk or negedge n_reset)beginif (!n_reset) q =16 h003f; /当复位信号有效时,sp的输出为03felse if (ce) /当使能信号有效时,输出就是输入的内容q = d; endendmodule2、顶层模块设计(自己增加修改的设计部分)sp #(datawidth) sp(.d(ib), .q(sp_out), .clk(clock), .ce(spce), .n_reset(n_reset);buffer #(datawidth) sp_ib(.q(ib),.d(sp_out),.oe(spoe);三、push、pop、call、ret指令微程序的设计push(堆栈指令)微地址(h)微指令(h)微命令bmna注释0c0f43000c1spoe,ace,sv00c1取sp0c162b300c2soe,dec,sv,drce00c2sp-10c27c0800c3soe, spce, arce00c3sp-1后的地址0c300052000droe, aroe, wr0000将内容写入sp-1所指向的内存中pop(压栈指令)微地址(h)微指令(h)微命令bmna注释0c8b00000c9aroe, trce00c9将目标地址先存放在暂存器中0c9f40800caspoe, arce, ace00ca取sp 0ca027610cbrd, aroe, drce, inc,sv00cb读出sp所指向的内容,sp-10cb800800cctroe, arce00cc取目标地址0cc7c052000aroe,droe,wr,soe,spce0000将sp中的内容写入目标地址call(子程序调用指令)微地址(h)微指令(h)微命令bmna注释0d0f40000d1spoe, ace00d1栈顶单元减一,并保存原pc内容0d1b2b000d2dec,sv, aroe, trce00d20d27c0800d3soe,arce,spce00d3将sp-1送入sp和ar中0d3200300d4pcoe,drce00d4将pc内容放入dr0d484052000aroe,droe,wr,troe,pcce0000写入栈顶单元ret(返回指令)微地址(h)微指令(h)微命令bmna注释03cf408003dspoe, arce, ace003d03d0276103frd, aroe, drce, inc,sv003f03fc4000040droe, pcce00400407c000000soe, spce0000四、测试程序、数据及运行结果1、测试内容:push(堆栈指令)运行数据:内存地址(h)机器码(h)汇编指令0000031a 0004push 0004h运行结果及分析:从微地址可以看出,第一阶段先是取指令001-002-003再是取目的操作数,006-01b-01f-024-025-026-007,是直接寻址方式,最后是执行阶段,0c0-0c1-0c2-0c3-000,执行push指令。dr中为0004h里的内容5ee2。同时可以看出sp始终为3f。push指令正确。2、测试内容:pop(压栈指令) 运行数据:内存地址(h)机器码(h)汇编指令0002033a 0008hpop 0004h运行结果及分析:从微地址可以看出,第一阶段先是取指令001-002-003再是取目的操作数,006-01b-01f-024-025-026-007,是直接寻址方式,最后是执行阶段,0c8-0c9-0ca-0cb-0cc-000,执行pop指令。sp减一变为3e。在内存中可以看出,0008h中的内容变成了0004h中的内容5ee2。pop指令执行正确。3、测试内容:call(子程序调用指令) 运行数据:内存地址(h)机器码(h)汇编指令00000010035a 00100760 5555call 0010hmov #5555,r0运行结果及分析:从微地址可以看出,第一阶段是取第一条指令(call 0010h),001-002-003,再是取目的操作数,006-01b-01f-024-025-026-007,最后是执行阶段,007-0d0-0d1-0d2-0d3-0d4-000,sp减一变为3e,pc转到0010h;第二阶段先是取第二条指令(mov #5555h,r0)001-002-003-004,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-044-046-000,将结果mov到寄存器里。在grs可以看出由0000变成了5555。4、测试内容:ret(返回指令)运行数据:内存地址(h)机器码(h)汇编指令000200120761 56780002mov #5678,r1ret运行结果及分析: call执行完后,pc跳转到0012h,所以第一阶段先是取第二条指令(ret)001-002-003,然后执行ret,007-03c-03d-03f-040-000,sp加一变为3f,跳转回到原pc,0002h处,进入第二阶段,先是取第一条指令(mov #5678,r1),001-002-003,再是取源操作数,004-00b-00f-016-006,是立即数寻址方式,再是取目的操作数,006-018-007,是寄存器寻址方式,最后是执行阶段,007-044-046-000,将结果mov到寄存器里。在grs可以看出由0000变成了5678。 四、设计中遇到的问题及解决办法 写微指令时遇到许多问题,刚开始没弄明白各条指令的意思,然后经过同学的讲解,弄懂了各个指令的意思,通过参考书籍,成功的写出了各个指令的微程序。第七天 为cpu扩充中断系统一、设计目标 在前面cpu的基础上增加中断系统,使其支持键盘中断。二、硬件设计1、if(可只写自己增加修改部分。并加上适当注释)if(!n_reset or cli)if=0;else if(sti)if=1;2、intcif(kr)va_out=h0020;else if(pr)va_out=h0021;3、顶层模块设计(自己增加修改的设计部分)/第七天:if、intc的实例化 *if if(.clk(clock), .n_reset(n_reset), .sti(sti), .cli(cli), .if(if_out);intc intc(.kr(kr), .pr(pr), .intr(intr), .va_out(va_out);buffer #(datawidth) va_b(.q(db), .d(va_out), .oe(inta);三、微程序设计1中断响应隐指令的微程序设计微地址(h)微指令(h)微指令字段(h)微命令f0f1f2f3f4f5f6f7f8f9081f40050827500
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品法规科普知识培训课件
- 人防工程建筑物防护等级评定
- 老旧小区智能监控安防系统
- 柳州期考九年级数学试卷
- 人防设备配置与智能监控系统方案
- 去年初一数学试卷
- 司机知识技能培训内容课件
- 机床安全知识培训课件
- 辽宁省9月联考数学试卷
- 南宁市一模文科数学试卷
- 燃烧器控制器LMG说明书
- HSE宣传与警示管理规定
- 游泳初级教员资格考试题库(含答案)
- 云课堂题库考试答案免费
- 公安机关业务技术用房建设标准
- GB/T 16919-1997食用螺旋藻粉
- GB/T 1682-2014硫化橡胶低温脆性的测定单试样法
- GB/T 15700-2008聚四氟乙烯波纹补偿器
- GB/T 12234-2019石油、天然气工业用螺柱连接阀盖的钢制闸阀
- flex报警及处理课件
- 普通话水平测试培训(标准版)课件
评论
0/150
提交评论