下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、冬肥N至大至计算机与信息学院系统硬件综合设计课程设计报告学生姓名:至学号:1234567890专业班级:计算机2017年07月01日I.pcf部分always(posedgeClk)beginPCPlus4F_Reg=PCPlus4F;if(BranchM&ZeroM)PCF=PCBranchM;elsePCF=PCPlus4F;InstructionF_Reg=InstructionF;if(InstructionF31:26=6'b000010)beginPCF=6'h0,InstructionF25:0;PCF=PCF<<2;endEndassignP
2、CPlus4F=PCF+4;assignImemRdAddrF=PCF;每个时钟上升沿到来,根据上一个时钟的PCSrcM判断是否为分支指令,若是,则选择PCBranchM作为这个时钟的指令地址,否则选PCF+4作为这个指令的指令地址,另外对于J类指令,我设计了一个特定的OpCode="000010”,即为跳转指令,因为每个指令以字节格式存储,占用,4个字节,故将后26位立即数进行位扩展后将其左移两位,效果等同于乘4,再将其赋值给PCF这样下一跳的指令地址即为所要跳转的地址。对于这个部分,我起先是准备将其设计成一个模块的,之后由于模块接口连接时出现了无法解决的错误:输出PCF要作为In
3、structionMemory的输入,又要作为自身模块下一跳的输入,导致三者关联一起变化,程序报错,后来我又想到将PCFS输出改成两个,PCFout及PCFnext,PCFout作为InstructionMemory的输入,PCFnext作为自身模块下一跳的输入,但是程序仍无法正常运行,最后我想到了在top模块中对PCF进行处理并得以实现。2 .InstructionMemory模块initialbegin$readmemh("instruction",InstMem,8'h0);endalways(ImemRdAddr)beginInstruction<=I
4、nstMemImemRdAddr>>2;end这个模块很简单,主要是通过instructin文档来存储指令,以PCF作为地址取出指令输出至Control,SignExtend,Register三个模块。3 .Ctr模块always(OpCode)begincase(OpCode)/R-I/addiu6'b001001:beginRegDstD=1;ALUSrcD=1;MemtoRegD=0;RegWriteD=1;MemWriteD=0;BranchD=0;ALUOp=2'b10;end/addiendcaseendalways(ALUOporFunct)begin
5、casex(OpCode,ALUOp,Funct)14'b10001100xxxxxx:ALUControlD=5'b00010;/LW:add14'b00010001xxxxxx:ALUControlD=5'b00110;/SW:substractbeqendcaseendendmoduleControl模块主要对来自InstructionMemory模块的指令进行分解,得到OpCode侑令高六位),Funct(指令低六位),在通过分析OpCode导至URegDstD,ALUSrcD,MemtoRegDRegWriteD,BranchD,ALUO隧六个信号量,
6、用于后面的运算,再使用OpCode;ALUOp,Funct三者的组合对指令的运算方法进行分析,得到相应的ALUControlD输出至ALU模块。4 .Register模块initialbegin$readmemh("register",regFile,32'h0);end/writeonfallingclockedgealways(posedgeClk)beginif(RegWrite=1'b1)regFileRegWrAddr<=RegWrData;endassignRegARdData=(RegARdAddr>=0)?regFileRegAR
7、dAddr:0;assignRegBRdData=(RegBRdAddr>=0)?regFileRegBRdAddr:0;通过信号量RegWrite来判断读写操作,RegWrite=1即为写操作,0为读操作,读写皆操作于建立的register文档中,另在top模块中有assignRegARdAddr=InstructionD25:21;assignRegBRdAddr=InstructionD20:16;对寄存器地址赋值,register读出的两个数可供ALU选择使用。5 .ALU模块assignZero=(ALURes=0)?1:0;/ALURes0跳转always(SrcAorSrc
8、BorALUCtr)beginOverFlow=0;TmpForSrcB=0;HI=0;LO=0;A=0;B=0;case(ALUCtr)5'b10011:beginTmpForSrcB=SrcB;TmpForSrcB31=(TmpForSrcB31+1)%2;ALURes=SrcA+TmpForSrcB;if(SrcA31!=TmpForSrcB31)|(SrcA31=TmpForSrcB31&&ALURes31=SrcA31)beginOverFlow=1'b0;endelseif(SrcA31=TmpForSrcB31&&ALURes31!
9、=SrcA31)beginOverFlow=1'b1;enddefault:ALURes=32'h0;endcaseendALU模块进行的是运算操作,本模块通过来自Control模块的ALUCtr判断所要执行的运算,在通过Register模块读出的值或者从Instruction中得到的立即数进行运算,结果ALURest艮据信号量MemToRe本判断是否写入DataMemory,这一块写在top中,另外ALU还对Zero信号量进行了赋值,Zero信号量用于对分支指令的判断。6 .DataMemory模块initialbegin$readmemh("Data",
10、DataMem,10'h0);endalways(posedgeClk)beginif(DmemWrite=1'b1)DataMemDmemAddr>>2<=DmemWrData;endassignDmemRdData=(DmemWrite=1'b0)?DataMemDmemAddr>>2:0;endmodule本模块通过从Ctr模块得来白信号量DmemWrite选择进行读写操作,读写皆操作于所建立的Data文档,另外DmemAdd左移两位跟上述PCF左移两位异曲同工。7 .top模块这个模块相比前面的6个模块要复杂得多,也是我在实验时出现
11、问题最多,所花时间最长的模块。Top模块主要用于各个模块之间的数据连接,以及一些模块外的操作。PCF的设计我是放在这个模块的,另外像二选一数据选择器我也是放在这里的,本来是写了一个小模块来做这个工作,但是本次试验用到太多次二选一数据选择器了,为了防止数据传输紊乱,我决定在top中解决这个小操作。由于本模块代码太长,这里就不一一阐述,仅以Ctr的例化和接口连接为例简要说明:CtrCtr(.OpCode(OpCode),.Funct(Funct),.RegWriteD(RegWriteForCtrD),.MemtoRegD(MemtoRegD),.MemWriteD(MemWriteD),.Bra
12、nchD(BranchD),.ALUControlD(ALUControlD),.ALUSrcD(ALUSrcD),.RegDstD(RegDstD);assignOpCode=InstructionD31:26;assignFunct=InstructionD5:0;assignRegWrDataD=(MemtoRegW)?ReadDataW:ALUOutW;always(posedgeClk)beginMemtoRegD_Reg=MemtoRegD;MemWriteD_Reg=MemWriteD;BranchD_Reg=BranchD;ALUControlD_Reg=ALUControlD
13、;ALUSrcD_Reg=ALUSrcD;RegDstD_Reg=RegDstD;end输入来源OpCode来自于取指阶段Instruction的高6位,Funct来自于取指阶段Instruction的低6位,RegWriteD通过信号量MemToReg悚选择ReadDataW或ALUOutW输出信号量MemtoRegDMemWriteD,BranchD,ALUControlD,ALUSrcD,RegDstD作为Reg模块的输入。二、指令设计本次试验实现了3种34条指令,实验时原以为指令格式为固定的,查阅很多资料都没得到想要的OpCode与指令操作一一对应的关系,问了指导实验的学长才知道,Op
14、Code是自己设计的,后又参考自己动手写cpu»的指令设计技巧,才总结设计出指令。3种指令:2b1110中prsrtrdsnfunsR奘型6位&立f位St75便60:JI1625212016ISopnrt|1关期.用:£5位5/ItjR312b25UopaddreMJ交不&026kR类型:具体操作由OpCode,Funct来控制,rs,rt为源寄存器,rd为目的寄存器,sa为移位位数。I类型:具体操作由OpCode控制,低16位是立即数,经过位扩展作为另一个源操作数参与用算。J类型:具体操作由OpCode控制,一般是跳转指令,低26位经过位扩展作为目标地址。
15、34条指令:32'b1010110000100100000000000000010ALURes=SrcA-SrcB;Store指令,判断00001号寄存器的值是否等于00100号寄存器的值,若相等,则当前指令地址加00000000000000010,否则执行下一条指令;32'b00000000001000100001100000100000TmpForSrcB=SrcB;TmpForSrcB31=(TmpForSrcB31+1)%2;ALURes=SrcA+TmpForSrcB;if(SrcA31!=TmpForSrcB31)|(SrcA31=TmpForSrcB31&
16、&ALURes31=SrcA31)beginOverFlow=1'b0;endelseif(SrcA31=TmpForSrcB31&&ALURes31!=SrcA31)beginOverFlow=1'b1;endAdd指令,有符号加法指令,实现将00001号寄存器和00002号寄存器的值进行有符号加法,结果放到00003号寄存器中;32'b00010100001000100000000000000010ALURes=(SrcA-SrcB);Bne指令,实现将00001号寄存器和00002号寄存器的值进行比较,若不相等,则当前指令地址加000000
17、00000000010,否则执行下一条指令;32'b00010000001000100000000000000010ALURes=SrcA-SrcB;Beq指令,实现将00001号寄存器和00002号寄存器的值进行比较,若相等,则当前指令地址加00000000000000010,否则执行下一条指令;32'b00000100001000000000000000000010ALURes=(SrcA>=0)?0:1;0,则当前指令地址加Bgez指令,实现00001号寄存器的值与0比较,若大于等于00000000000000010,否则执行下一条指令;32'b000111
18、00001000000000000000000010ALURes=(SrcA>0)?0:1;0比较,若大于0,则当前指令地址加0比较,若小于等于0,则当前指令地址加0比较,若小于0,则当前指令地址加Bgtz指令,实现00001号寄存器的值与00000000000000010,否则执行下一条指令;32'b00011000001000000000000000000010ALURes=(SrcA<=0)?0:1;Blez指令,实现00001号寄存器的值与00000000000000010,否则执行下一条指令;32'b0100010000100000000000000000
19、0010ALURes=(SrcA<0)?0:1;Bltz指令,实现00001号寄存器的值与00000000000000010,否则执行下一条指令;32'b10001100001000100001100000100001ALURes=SrcA+SrcB;Addu指令,无符号加法指令,实现将00001号寄存器和00002号寄存器的值进行无符号加法,结果放到00003号寄存器中;32'b10001100001000100001100000100011ALURes=SrcA-SrcB;subu指令,无符号减法指令,实现将00001号寄存器和00002号寄存器的值进行无符号减法,结
20、果放到00003号寄存器中;32'b00000000001000100001100000100100ALURes=SrcA&SrcB;And指令,与操作,实现将00001号寄存器和00002号寄存器的值进行与操作,结果放到00003号寄存器中;32'b00000000001000100001100000100101ALURes=SrcA|SrcB;OR指令,或操作,实现将00001号寄存器和00002号寄存器的值进行或运算,结果放到00003号寄存器中;32'b00000000001000100001100000101010ALURes=SrcA<SrcB
21、?1:0;slt指令,有符号比较操作,实现将00001号寄存器和00002号寄存器的值进行有符号比较,若SrcA<SrcB,则置1,否则置0;32'b00000000001000100001100000101010ALURes=SrcA<SrcB?1:0;sltu指令,无符号比较操作,实现将00001号寄存器和00002号寄存器的值进行无符号比较,若SrcA<SrcB,则置1,否则置0;32'b00000000001000100001100000011010ALURes=SrcA/SrcB;LO=SrcA/SrcB;HI=SrcA%SrcB;div指令,有符号
22、除法指令,实现将00001号寄存器和00002号寄存器的值进行有符号除法,结果放到00003号寄存器中;32'b00000000001000100001100000011000A=SrcA31:31?32'hffffffff,SrcA:32'h00000000,SrcA;B=SrcB31:31?32'hffffffff,SrcB:32'h00000000,SrcB;Temp=A*B;ALURes=Temp31:0;HI=Temp63:32;LO=Temp31:0;mul指令,有符号乘法指令,实现将00001号寄存器和00002号寄存器的值进行有符号乘法,
23、结果放到00003号寄存器中;32'b00000000001000100001100000000100ALURes=(SrcB<<SrcA);sllv指令,逻辑可变左移指令,实现将00001号寄存器的值左移00002号寄存器的值位,结果放到00003号寄存器中;32'b00000000001000100001100000000100ALURes=(SrcB>>SrcA);srlv指令,逻辑可变右移指令,实现将00001号寄存器的值右移00002号寄存器的值位,结果放到00003号寄存器中;32'b0000000000100010000110000
24、0100110ALURes=(SrcB>>SrcA);xor指令,异或指令,实现将00001号寄存器的值和00002号寄存器进行异或,结果放到00003号寄存器中;32'b00000000001000100001100000100110ALURes=(SrcAASrcB);xor指令,异或指令,实现将00001号寄存器的值和00002号寄存器进行异或,结果放到00003号寄存器中;32'b00100100001000100001100000000000ALURes=SrcA+SrcB;addiu指令,无符号立即数加法指令,实现将00001号寄存器的值和立即数进行无符
25、号加法,结果放到00003号寄存器中;32'b00110000001000100001100000000000ALURes=SrcA+SrcB;addi指令,有符号立即数加法指令,实现将00001号寄存器的值和立即数进行有符号加法,结果放到00003号寄存器中;32'b00110100001000100001100000000000ALURes=SrcA|SrcB;ori指令,立即数或指令,实现将00001号寄存器的值和立即数进行或运算,结果放到00002号寄存器中;32'b00110100001000100001100000000000ALURes=SrcA<S
26、rcB?1:0;slti指令,有符号立即数比较操作,实现将00001号寄存器的值和立即数进行有符号比较,若SrcA<SrcB,则置1,否则置0;32'b00111000001000100001100000000000ALURes=(SrcAaSrcB);xori指令,立即数异或指令,实现将00001号寄存器的值和立即数进行异或运算,结果放到00002号寄存器中;32'b00101100001000100001100000000000ALURes=SrcA<SrcB?1:0;slti指令,无符号立即数比较操作,实现将00001号寄存器的值和立即数进行无符号比较,若Sr
27、cA<SrcB,则置1,否则置0;32'b00000000001000100001100001000000ALURes=(SrcB<<SrcA);sll指令,逻辑左移指令,实现将00001号寄存器的值左移sa位,结果存入00002号寄存器;32'b00000000001000100001100001000010ALURes=(SrcB>>SrcA);srl指令,逻辑右移指令,实现将00001号寄存器的值右移sa位,结果存入00002号寄存器;32'b00000000001000100001100001000111j=SrcB31:31;Tm
28、pForSrcB=SrcB;TmpForSrcA=SrcA;/*for(i=0;i<TmpForSrcA;i=i+1)beginALURes=j,31'h0|(ALURes>>1);srav指令,算术可变右移指令,实现将00001号寄存器的值算术右移sa位,结果存入00002号寄存器;32'b00000000001000100001100001000011j=SrcB31:31;TmpForSrcB=SrcB;TmpForSrcA=SrcA;TmpForSrcB=TmpForSrcB>>SrcA;if(j)beginALURes=(TmpForSr
29、cB31:31),TmpForSrcB30:0;endelsebeginALURes=TmpForSrcB;endsra指令,算术右移指令,实现将00002号寄存器的值算术右移00001号寄存器的值位,结果存入00003号寄存器;32'b00000000001000100001100000100010ALURes=SrcA-SrcB;sub指令,有符号减法指令,实现将00001号寄存器和00002号寄存器的值进行有符号减法,结果放到00003号寄存器中;32'b00100000001000100001100000000000ALURes=SrcA+SrcB;addi指令,立即数加法指令,实现将00001号寄存器和00立即数进行有符号加法,结果放到00003号寄存器中;32'b00000000001000100001100000011000ALURes=SrcA/SrcB;mulu指令,无符号乘法指令,实现将00001号寄存器和00002号寄存器的值进行无符号乘法,结果放到00003号寄存器中;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46639.2-2025铸造机械术语第2部分:造型、制芯机及其他非永久型铸造设备
- 2026年广东农工商职业技术学院单招职业技能测试题库含答案详解
- 2026年宁夏职业技术学院单招职业倾向性测试题库及参考答案详解一套
- 2026年黑龙江幼儿师范高等专科学校单招综合素质考试题库含答案详解
- 2026年天津工艺美术职业学院单招职业技能考试题库及参考答案详解
- 2026年重庆科技大学单招综合素质考试题库及答案详解1套
- 2026年福州职业技术学院单招职业技能考试题库及参考答案详解1套
- 2026年内江卫生与健康职业学院单招职业适应性考试题库及答案详解1套
- 2026年郑州汽车工程职业学院单招职业倾向性考试题库及参考答案详解1套
- 2026年青岛工程职业学院单招职业倾向性测试题库含答案详解
- 2025年葫芦岛市总工会面向社会公开招聘工会社会工作者5人备考题库及参考答案详解
- 2026班级马年元旦主题联欢晚会 教学课件
- 2025年沈阳华晨专用车有限公司公开招聘备考笔试题库及答案解析
- 2025年云南省人民检察院聘用制书记员招聘(22人)笔试考试参考试题及答案解析
- 2025天津市第二批次工会社会工作者招聘41人考试笔试备考试题及答案解析
- 2025年乐山市商业银行社会招聘笔试题库及答案解析(夺冠系列)
- 江西省三新协同体2025-2026年高一上12月地理试卷(含答案)
- 2025新疆维吾尔自治区哈密市法院、检察院系统招聘聘用制书记员(31人)笔试考试参考试题及答案解析
- 高层建筑消防安全教育培训课件(香港大埔区宏福苑1126火灾事故警示教育)
- 见证取样手册(燃气工程分部)
- 2025新疆和田和康县、和安县面向社会招聘事业单位工作人员108人(公共基础知识)测试题附答案解析
评论
0/150
提交评论