




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机与信息学院系统硬件综合设计课程设计报告学生姓名:李学 号:1234567890专业班级:计算机2017年 07月01日I. pcf部分always (posedge Clk)begi nPCPIus4F_Reg = PCPIus4F;if (Bra nchM &ZeroM) PCF = PCBra nchM;else PCF = PCPlus4F;In structi on F_Reg = In structio nF;if (In structio nF31:26 = 6b000010)begi nPCF = 6h0,l nstructio nF25:0;PCF = PCF 2;end
2、Endassig n PCPlus4F = PCF + 4;assign ImemRdAddrF = PCF;每个时钟上升沿到来,根据上一个时钟的PCSrc M判断是否为分支指令,若是,则选择PCBra nchM作为这个时钟的指令地址,否则选PCF+4作为这个指令的指令地址,另外对于J类指令,我设计了一个特定的 OpCode=“000010,即为跳转指令,因为每个指令 以字节格式存储,占用,4个字节,故将后26位立即数进行位扩展后将其左移两位,效 果等同于乘4,再将其赋值给 PCF,这样下一跳的指令地址即为所要跳转的地址。对于 这个部分,我起先是准备将其设计成一个模块的,之后由于模块接口连接时
3、出现了无法解决的错误:输出 PCF要作为Instruction Memory的输入,又要作为自身模块下一跳的输入,导致三者关联一起变化,程序报错,后来我又想到将PCF的输出改成两个,PCFout 及PCFnext, PCFout作为Instruction Memory的输入,PCFnext作为自身模块下一跳的 输入,但是程序仍无法正常运行,最后我想到了在top模块中对PCF进行处理并得以实 现。2. Instruction Memory 模块in itialbegi n$readmemh(instruction, InstMem, 8hO);endalways (ImemRdAddr)begi
4、 nInstruction 2;end这个模块很简单,主要是通过in structi n文档来存储指令,以 PCF作为地址取出指令输出至 Control,SignExtend, Register 三个模块。3. Ctr模块always (OpCode)begi ncase(OpCode)/ R-I/ addiu6b001001:begi nRegDstD = 1;ALUSrcD = 1; MemtoRegD = 0;RegWriteD = 1; MemWriteD = 0;Bran chD = 0; ALUOp = 2b10;end/addiendcaseendalways (ALUOp or
5、 Fu net)begi ncasex(OpCode ,ALUOp, Funct)14b10001100xxxxxx: ALUControlD = 5b00010; / LW : add14b00010001xxxxxx: ALUControlD = 5b00110; / SW : substract beqendcaseenden dmoduleControl模块主要对来自Instruction Memory模块的指令进行分解,得到 OpCode指令 高六位),Funet (指令低六位),在通过分析 OpCode得到RegDstD, ALUSrcD , MemtoRegD RegWriteD
6、,BranchD,ALUOp这六个信号量,用于后面的运算, 再使用OpCodeALUOp, Funct三者的组合对指令的运算方法进行分析,得到相应的ALUControlD输出至ALU模块。4. R egister 模块in itialbegi n$readmemh(register, regFile, 32hO);end/ write on falli ng clock edgealways (posedge Clk)begi nif(RegWrite = 1b1) regFileRegWrAddr = 0)? regFileRegARdAddr:O;assig n RegBRdData =
7、(RegBRdAddr = 0)? regFileRegBRdAddr:O;通过信号量RegWrite来判断读写操作,RegWrite=1即为写操作,0为读操作,读写皆 操作于建立的register 文档中,另在top模块中有assign RegARdAddr = In structio nD25:21;assign RegBRdAddr = In structio nD20:16;对寄存器地址赋值,register 读出的两个数可供 ALU选择使用。跳转5. ALU模块assign Zero = (ALURes = 0)? 1:0;/ALURes 0 always (SrcA or SrcB
8、 or ALUCtr)begi nOverFlow = 0;TmpForSrcB = 0;HI = 0;LO = 0;A = 0;B = 0;case(ALUCtr)5b10011:begi nTmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) |(SrcA31= TmpForSrcB31 &ALURes31 = SrcA31)begi nOverFlow = 1bO;endelseif (SrcA31 = TmpForSrcB31
9、& ALURes31 != SrcA31)begi nOverFlow = 1b1;enddefault: ALURes = 32hO;endcaseendALU模块进行的是运算操作,本模块通过来自Control模块的ALUCtr判断所要执行的运 算,在通过Register模块读出的值或者从Instruction中得到的立即数进行运算,结果ALUResB据信号量 MemToRe来判断是否写入 DataMemory,这一块写在top中,另外 ALU还对Zero信号量进行了赋值,Zero信号量用于对分支指令的判断。6. Data Memory 模块in itialbegi n$readmemh(D
10、ata, DataMem, 1OhO);endalways (posedge Clk)begi nif(DmemWrite = 1b1)DataMemDmemAddr2 2:0;en dmodule本模块通过从Ctr模块得来的信号量 DmemWrite选择进行读写操作,读写皆操作于所建 立的Data文档,另外DmemAdd左移两位跟上述 PCF左移两位异曲同工。7. top模块这个模块相比前面的6个模块要复杂得多,也是我在实验时出现问题最多,所花时间最PCF长的模块。Top模块主要用于各个模块之间的数据连接,以及一些模块外的操作。的设计我是放在这个模块的,另外像二选一数据选择器我也是放在这里的
11、,本来是写了一个小模块来做这个工作,但是本次试验用到太多次二选一数据选择器了,为了防止数据传输紊乱,我决定在top中解决这个小操作。由于本模块代码太长,这里就不一一阐 述,仅以Ctr的例化和接口连接为例简要说明:Ctr Ctr(.OpCode(OpCode),.Fun ct(F un ct),.RegWriteD(RegWriteForCtrD),.MemtoRegD(MemtoRegD),.MemWriteD(MemWriteD),.Bra nchD(Bra nchD),.ALUCo ntrolD(ALUCo ntrolD),.ALUSrcD(ALUSrcD),.RegDstD(RegDst
12、D);assign OpCode = InstructionD31 : 26;assig n Funct = In struct ion D5 : 0;assign RegWrDataD = (MemtoRegW)? ReadDataW : ALUOutW;always (posedge Clk)begi nMemtoRegD_Reg = MemtoRegD;MemWriteD_Reg = MemWriteD;Bra nchD_Reg = Bran chD;ALUC on trolD_Reg = ALUC on trolD;ALUSrcD_Reg = ALUSrcD;RegDstD_Reg =
13、 RegDstD;end输入来源 OpCode来自于取指阶段Instruction 的高6位,Funet来自于取指阶段Instruction的低 6 位,RegWriteD 通过信号量 MemToRegW选择 ReadDataW 或ALUOutW输出信号量 MemtoRegD MemWriteD, BranchD,ALUControlD,ALUSrcD RegDstD作为 Reg模块的输入。二、指令设计本次试验实现了 3种34条指令,实验时原以为指令格式为固定的,查阅很多资料都没 得到想要的OpCode与指令操作对应的关系,问了指导实验的学长才知道,OpCode是自己设计的,后又参考自己动手写
14、cpu的指令设计技巧,才总结设计出指令。3种指令:;)即邛2(20M 戸n tV(1 斗onrtBfunc引 2521 ULb L50cpriTimmeduk5(-Z1汗0W丨addressJ26R类型:具体操作由 OpCode, Funet来控制,rs, rt为源寄存器,rd为目的寄存器,sa为移 位位数。I类型:具体操作由Opcode控制,低16位是立即数,经过位扩展作为另一个源操作数参与 用算。J类型:具体操作由 OpCode控制,一般是跳转指令,低26位经过位扩展作为目标地址。34条指令:32101011 00001 00100 000000000000010ALURes = SrcA
15、 - SrcB;Store指令,判断00001号寄存器的值是否等于00100号寄存器的值,若相等,则当前指令地址加00000000000000010,否则执行下一条指令;32000000 00001 00010 00011 00000 100000TmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2; ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) |(SrcA31= TmpForSrcB31 &ALURes31 = SrcA31)begi nOverFlow = 1b0;endel
16、seif (SrcA31 = TmpForSrcB31 & ALURes31 != SrcA31)begi nOverFlow = 1b1;endAdd指令,有符号加法指令,实现将00001号寄存器和00002号寄存器的值进行有符号加法, 结果放到00003号寄存器中;32000101 00001 00010 0000000000000010ALURes = (SrcA - SrcB);Bne指令,实现将00001号寄存器和00002号寄存器的值进行比较,若不相等,则当前指令地址加00000000000000010,否则执行下一条指令;32b000100 00001 00010 0000000
17、000000010ALURes = SrcA - SrcB;Beq指令,实现将00001号寄存器和00002号寄存器的值进行比较,若相等,则当前指令地 址加00000000000000010,否则执行下一条指令;32000001 00001 00000 0000000000000010ALURes = (SrcA = 0)?0:1;Bgez指令,实现 00001号寄存器的值与00000000000000010,否则执行下一条指令;32000111 00001 00000 0000000000000010ALURes = (SrcA 0)?0:1;Bgtz指令,实现 00001号寄存器的值与00
18、000000000000010,否则执行下一条指令;32000110 00001 00000 0000000000000010ALURes = (SrcA = 0)?0:1;Blez指令,实现 00001号寄存器的值与00000000000000010,否则执行下一条指令;32010001 00001 00000 0000000000000010ALURes = (SrcA 0)?0:1;Bltz指令,实现 00001号寄存器的值与00000000000000010,否则执行下一条指令;32100011 00001 00010 00011 00000 100001 ALURes = SrcA
19、+ SrcB;0比较,若大于等于0,则当前指令地址加0,则当前指令地址加0比较,右大于0比较,若小于等于0,则当前指令地址加0比较,若小于0,则当前指令地址加Addu指令,无符号加法指令,实现将 00001号寄存器和00002号寄存器的值进行无符号加 法,结果放到00003号寄存器中;32100011 00001 00010 00011 00000 100011 ALURes = SrcA - SrcB;subu指令,无符号减法指令,实现将 00001号寄存器和00002号寄存器的值进行无符号减 法,结果放到00003号寄存器中;32000000 00001 00010 00011 00000
20、 100100ALURes = SrcA & SrcB;And指令,与操作,实现将 00001号寄存器和00002号寄存器的值进行与操作,结果放到 00003号寄存器中; 32000000 00001 00010 00011 00000 100101ALURes = SrcA | SrcB;OR指令,或操作,实现将00001号寄存器和00002号寄存器的值进行或运算, 结果放到00003号寄存器中;32b000000 00001 00010 00011 00000 101010ALURes = SrcA SrcB ? 1:0;sit指令,有符号比较操作,实现将 00001号寄存器和00002号
21、寄存器的值进行有符号比较, 若SrcA SrcB,则置1,否则置0;32000000 00001 00010 00011 00000 101010 ALURes = SrcA SrcB ? 1:0;00002号寄存器的值进行无符号比较,situ指令,无符号比较操作,实现将00001号寄存器和 若SrcA SrcB,则置1,否则置0;32000000 00001 00010 00011 00000 011010ALURes = SrcA / SrcB;LO = SrcA / SrcB;HI = SrcA % SrcB;div指令,有符号除法指令,实现将00001号寄存器和00002号寄存器的值进
22、行有符号除法, 结果放到00003号寄存器中;32000000 00001 00010 00011 00000 011000A = SrcA31:31?32hffffffff, SrcA : 32h00000000, SrcA;B = SrcB31:31?32hffffffff, SrcB : 32h00000000, SrcB;Temp = A * B ;ALURes = Temp31:0;HI = Temp63:32; LO = Temp31:0;mui指令,有符号乘法指令,实现将00001号寄存器和00002号寄存器的值进行有符号乘法, 结果放到00003号寄存器中;32000000 0
23、0001 00010 00011 00000 000100ALURes = (SrcB SrcA);sriv指令,逻辑可变右移指令,实现将00001号寄存器的值右移 00002号寄存器的值位,结果放到00003号寄存器中;32000000 00001 00010 00011 00000 100110ALURes = (SrcB SrcA);xor指令,异或指令,实现将 00001号寄存器的值和 00002号寄存器进行异或,结果放到00003号寄存器中;32b000000 00001 00010 00011 00000 100110ALURes = (SrcA A SrcB);xor指令,异或指
24、令,实现将 00001号寄存器的值和00002号寄存器进行异或,结果放到00003号寄存器中;32001001 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addiu指令,无符号立即数加法指令,实现将00001号寄存器的值和立即数进行无符号加法, 结果放到00003号寄存器中;32001100 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addi指令,有符号立即数加法指令,实现将00001号寄存器的值和立即数进行有符号加法,结果放到00003号寄存器中;32001101 0000
25、1 00010 00011 00000 000000ALURes = SrcA | SrcB;ori指令,立即数或指令,实现将00001号寄存器的值和立即数进行或运算,结果放到00002号寄存器中;32001101 00001 00010 00011 00000 000000 ALURes = SrcA SrcB ? 1:0;slti指令,有符号立即数比较操作,实现将 00001号寄存器的值和立即数进行有符号比较,若SrcA SrcB,则置1,否则置0; 32001110 00001 00010 00011 00000 000000ALURes = (SrcA a SrcB);xori指令,立
26、即数异或指令,实现将 00001号寄存器的值和立即数进行异或运算,结果放 到00002号寄存器中;32001011 00001 00010 00011 00000 000000ALURes = SrcA SrcB ? 1:0;slti指令,无符号立即数比较操作,实现将 00001号寄存器的值和立即数进行无符号比较, 若SrcA SrcB,则置1,否则置0;32000000 00001 00010 00011 00001 000000ALURes = (SrcB SrcA);srl指令,逻辑右移指令,实现将00001号寄存器的值右移 sa位,结果存入00002号寄存器;32000000 0000
27、1 00010 00011 00001 000111j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;/*for(i = 0; i 1);srav指令,算术可变右移指令,实现将00001号寄存器的值算术右移 sa位,结果存入00002号寄存器;32000000 00001 00010 00011 00001 000011j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;TmpForSrcB = TmpForSrcBSrcA;if (j)begi nALURes = (TmpForSrcB31:31), TmpForSrcB30:0;endelsebegi nALURes = TmpForSrcB;endsra指令,算术右移指令,实现将00002号寄存器的值算术右移00001号寄存器的值位,结果存入00003号寄存器;32000000 00001 00010 00011 00000 100010ALURes = SrcA - SrcB;sub指令,有符号减法指令,实现将00001号寄存器和00002号寄存器的值进行有符号减法,结果放到00003号寄存器中;32001000 00001 000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲方活动需求采购合同协议
- 2025至2030年中国精密铁球数据监测研究报告
- 2025至2030年中国石膏抽真空机数据监测研究报告
- 2025至2030年中国皮制篮球数据监测研究报告
- 2025至2030年中国电流感应器数据监测研究报告
- 危险有害因素的辨识
- 2025至2030年中国珍珠贝数据监测研究报告
- 2025至2030年中国水性丙烯酸改性环氧树脂数据监测研究报告
- 2025至2030年中国树脂固化剂数据监测研究报告
- 2025至2030年中国枕头摇椅数据监测研究报告
- 基于单片机的车牌识别设计
- 合伙经营协议书三人范本
- 腹膜透析相关性腹膜炎的护理查房
- 制药企业确认与验证培训考试题
- 小学英语人教(精通)版三年级起点《Fun time 1 Recycle 1》优秀教学设计五年级下册-五年级英语教案
- 《竞争优势-透视企业护城河》读书笔记
- 07484社会保障学(完整版ppt)
- 小学的古诗80首(带拼音版)
- 世界现代史(上册) 马工程 02
- 第18章氢和稀有气体
- GB/T 23858-2009检查井盖
评论
0/150
提交评论