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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

系统硬件综合设计.docx

1、系统硬件综合设计计算机与信息学院系统硬件综合设计课程设计报告学生姓名: 李学 号: 1234567890专业班级: 计算机2017 年 07 月 01 日1.pcf 部分always (posedge Clk)beginPCPlus4F_Reg = PCPlus4F;if (BranchM&ZeroM) PCF = PCBranchM;else PCF = PCPlus4F;InstructionF_Reg = InstructionF;if (InstructionF31:26 = 6b000010)beginPCF = 6h0,InstructionF25:0;PCF = PCF 2;en

2、dEndassign PCPlus4F = PCF + 4;assign ImemRdAddrF = PCF;每个时钟上升沿到来,根据上一个时钟的 PCSrcM判断是否为分支指令,若是,则选择PCBranchM作为这个时钟的指令地址,否则选 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 模块initial begin$readmemh(instruction, InstMem, 8h

4、0);endalways (ImemRdAddr) beginInstruction 2;end这个模块很简单,主要是通过 instructin 文档来存储指令,以 PCF作为地址取出指令 输出至 Control , SignExtend , Register 三个模块。3.Ctr 模块always (OpCode) begin case(OpCode) / R-I / addiu 6b001001:beginRegDstD = 1;ALUSrcD = 1;MemtoRegD = 0;RegWriteD = 1;MemWriteD = 0;BranchD = 0;ALUOp = 2b10; e

5、nd /addiendcaseendalways (ALUOp or Funct)begin casex(OpCode ,ALUOp, Funct)14b10001100xxxxxx: ALUControlD = 5b00010; / LW : add14b00010001xxxxxx: ALUControlD = 5b00110; / SW : substract beqendcase end endmoduleControl 模块主要对来自 Instruction Memory模块的指令进行分解,得到 OpCode(指令 高六位 ) ,Funct(指令低六位) ,在通过分析 OpCode得

6、到 RegDstD,ALUSrcD ,MemtoRegD, RegWriteD ,BranchD ,ALUOp这六个信号量, 用于后面的运算, 再使用 OpCode, ALUOp, Funct 三者的组合对指令的运算方法进行分析,得到相应的 ALUControlD 输出至 ALU模块。4.Register模块initialbegin$readmemh(register, regFile, 32h0);end/ write on falling clock edgealways (posedge Clk)beginif(RegWrite = 1b1)regFileRegWrAddr = 0)?

7、regFileRegARdAddr:0;assign RegBRdData = (RegBRdAddr = 0)? regFileRegBRdAddr:0;通过信号量 RegWrite 来判断读写操作, RegWrite=1 即为写操作, 0 为读操作,读写皆 操作于建立的 register 文档中,另在 top 模块中有assign RegARdAddr = InstructionD25:21;assign RegBRdAddr = InstructionD20:16; 对寄存器地址赋值, register 读出的两个数可供 ALU选择使用。5.ALU 模块assign Zero = (AL

8、URes = 0)? 1:0;/ALURes 0 跳转always (SrcA or SrcB or ALUCtr)beginOverFlow = 0;TmpForSrcB = 0;HI = 0;LO = 0;A = 0;B = 0;case(ALUCtr)5b10011:beginTmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB31 &ALURes31 = SrcA31)beginOv

9、erFlow = 1b0; endelseif (SrcA31 = TmpForSrcB31 & ALURes31 != SrcA31) beginOverFlow = 1b1;enddefault: ALURes = 32h0;endcaseendALU模块进行的是运算操作, 本模块通过来自 Control 模块的 ALUCtr 判断所要执行的运 算,在通过 Register 模块读出的值或者从 Instruction 中得到的立即数进行运算,结 果 ALURes根据信号量 MemToReg来判断是否写入 DataMemory,这一块写在 top 中,另外 ALU还对 Zero 信号量进行了

10、赋值, Zero 信号量用于对分支指令的判断。6.Data Memory 模块initialbegin$readmemh(Data, DataMem, 10h0);endalways (posedge Clk)beginif(DmemWrite = 1b1)DataMemDmemAddr2 2:0;endmodule本模块通过从 Ctr 模块得来的信号量 DmemWrite选择进行读写操作, 读写皆操作于所建 立的 Data 文档,另外 DmemAdd左r 移两位跟上述 PCF左移两位异曲同工。7.top 模块这个模块相比前面的 6 个模块要复杂得多,也是我在实验时出现问题最多, 所花时间最

11、长的模块。 Top 模块主要用于各个模块之间的数据连接,以及一些模块外的操作。 PCF 的设计我是放在这个模块的, 另外像二选一数据选择器我也是放在这里的, 本来是写了 一个小模块来做这个工作, 但是本次试验用到太多次二选一数据选择器了, 为了防止数 据传输紊乱,我决定在 top 中解决这个小操作。由于本模块代码太长,这里就不一一阐述,仅以 Ctr 的例化和接口连接为例简要说明:Ctr Ctr(.OpCode(OpCode),.Funct(Funct),.RegWriteD(RegWriteForCtrD),.MemtoRegD(MemtoRegD),.MemWriteD(MemWriteD)

12、,.BranchD(BranchD),.ALUControlD(ALUControlD),.ALUSrcD(ALUSrcD),.RegDstD(RegDstD);assign OpCode = InstructionD31 : 26;assign Funct = InstructionD5 : 0;assign RegWrDataD = (MemtoRegW)? ReadDataW : ALUOutW;always (posedge Clk)beginMemtoRegD_Reg = MemtoRegD;MemWriteD_Reg = MemWriteD;BranchD_Reg = Branch

13、D;ALUControlD_Reg = ALUControlD;ALUSrcD_Reg = ALUSrcD;RegDstD_Reg = RegDstD;end输入来源 OpCode来自于取指阶段 Instruction 的高 6 位, Funct 来自于取指阶段 Instruction 的低 6 位, RegWriteD 通过信号量 MemToRegW来选择 ReadDataW 或 ALUOutW,输出信号量 MemtoRegD,MemWriteD,BranchD,ALUControlD ,ALUSrcD, RegDstD作为 Reg模块的输入。二、指令设计本次试验实现了 3 种 34 条指令

14、,实验时原以为指令格式为固定的,查阅很多资料都没 得到想要的 OpCode与指令操作一一对应的关系,问了指导实验的学长才知道, OpCode是自己设计的,后又参考自己动手写 cpu的指令设计技巧,才总结设计出指令。3 种指令:R 类型:具体操作由 OpCode,Funct 来控制, rs,rt 为源寄存器, rd 为目的寄存器, sa 为移 位位数。I 类型: 具体操作由 OpCode 控制, 低 16 位是立即数, 经过位扩展作为另一个源操作数参与 用算。J 类型:具体操作由 OpCode 控制,一般是跳转指令,低 26 位经过位扩展作为目标地址。 34条指令:32b101011 00001

15、 00100 000000000000010ALURes = SrcA - SrcB;Store 指令,判断 00001 号寄存器的值是否等于 00100 号寄存器的值,若相等,则当前指令 地址加 00000000000000010 ,否则执行下一条指令; 32b000000 00001 00010 00011 00000 100000 TmpForSrcB = SrcB;TmpForSrcB31 = (TmpForSrcB31+1)%2;ALURes = SrcA + TmpForSrcB;if (SrcA31 != TmpForSrcB31) | (SrcA31 = TmpForSrcB3

16、1 &ALURes31 = SrcA31)beginOverFlow = 1b0;endelseif (SrcA31 = TmpForSrcB31 & ALURes31 != SrcA31) beginOverFlow = 1b1;endAdd 指令,有符号加法指令, 实现将 00001 号寄存器和 00002 号寄存器的值进行有符号加法, 结果放到 00003 号寄存器中;32b000100 00001 00010 0000000000000010ALURes = SrcA - SrcB;Beq 指令,实现将 00001 号寄存器和 00002 号寄存器的值进行比较,若相等,则当前指令地 址

17、加 00000000000000010 ,否则执行下一条指令;Addu 指令,无符号加法指令,实现将 00001 号寄存器和 00002 号寄存器的值进行无符号加 法,结果放到 00003 号寄存器中; 32b100011 00001 00010 00011 00000 100011 ALURes = SrcA - SrcB;subu 指令,无符号减法指令,实现将 00001 号寄存器和 00002 号寄存器的值进行无符号减 法,结果放到 00003 号寄存器中; 32b000000 00001 00010 00011 00000 100100ALURes = SrcA & SrcB;And

18、指令,与操作,实现将 00001 号寄存器和 00002 号寄存器的值进行与操作,结果放到 00003 号寄存器中; 32b000000 00001 00010 00011 00000 100101ALURes = SrcA | SrcB;OR 指令,或操作,实现将 00001 号寄存器和 00002 号寄存器的值进行或运算, 结果放到 00003号寄存器中; 32b000000 00001 00010 00011 00000 101010ALURes = SrcA SrcB ? 1:0;slt 指令,有符号比较操作,实现将 00001号寄存器和 00002号寄存器的值进行有符号比较, 若 S

19、rcA SrcB ,则置 1 ,否则置 0; 32b000000 00001 00010 00011 00000 101010 ALURes = SrcA SrcB ? 1:0;00002 号寄存器的值进行无符号比较,sltu 指令,无符号比较操作, 实现将 00001 号寄存器和 若 SrcA SrcB ,则置 1 ,否则置 0; 32b000000 00001 00010 00011 00000 011010ALURes = SrcA / SrcB;LO = SrcA / SrcB;HI = SrcA % SrcB;div 指令,有符号除法指令, 实现将 00001 号寄存器和 00002

20、 号寄存器的值进行有符号除法, 结果放到 00003 号寄存器中; 32b000000 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;mul 指令,有符号乘法指令, 实现将 00001 号寄存器和 00002 号寄存器的值进行有符号乘法, 结果放到 000

21、03 号寄存器中; 32b000000 00001 00010 00011 00000 000100ALURes = (SrcB SrcA);srlv 指令,逻辑可变右移指令,实现将 00001 号寄存器的值右移 00002 号寄存器的值位, 结果放到 00003 号寄存器中;32b000000 00001 00010 00011 00000 100110ALURes = (SrcA SrcB);xor 指令,异或指令,实现将 00001 号寄存器的值和 00002 号寄存器进行异或,结果放到 00003 号寄存器中;32b001001 00001 00010 00011 00000 0000

22、00ALURes = SrcA + SrcB;addiu 指令,无符号立即数加法指令, 实现将 00001 号寄存器的值和立即数进行无符号加法, 结果放到 00003 号寄存器中; 32b001100 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addi 指令,有符号立即数加法指令, 实现将 00001 号寄存器的值和立即数进行有符号加法, 结果放到 00003 号寄存器中; 32b001101 00001 00010 00011 00000 000000ALURes = SrcA | SrcB;ori 指令,立即数或指令, 实现将 0

23、0001 号寄存器的值和立即数进行或运算, 结果放到 00002 号寄存器中; 32b001101 00001 00010 00011 00000 000000 ALURes = SrcA SrcB ? 1:0;slti 指令,有符号立即数比较操作,实现将 00001 号寄存器的值和立即数进行有符号比较, 若 SrcA SrcB ,则置 1 ,否则置 0; 32b001110 00001 00010 00011 00000 000000ALURes = (SrcA SrcB);xori 指令,立即数异或指令,实现将 00001 号寄存器的值和立即数进行异或运算,结果放 到 00002 号寄存器

24、中; 32b001011 00001 00010 00011 00000 000000ALURes = SrcA SrcB ? 1:0;slti 指令,无符号立即数比较操作,实现将 00001 号寄存器的值和立即数进行无符号比较, 若 SrcA SrcB ,则置 1 ,否则置 0; 32b000000 00001 00010 00011 00001 000000 ALURes = (SrcB SrcA);sll 指令,逻辑左移指令, 实现将 00001 号寄存器的值左移 sa位,结果存入 00002 号寄存器;j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA

25、 = SrcA;/*for(i = 0; i 1);srav指令,算术可变右移指令, 实现将 00001 号寄存器的值算术右移 sa位,结果存入 00002 号寄存器;32b000000 00001 00010 00011 00001 000011j = SrcB31:31;TmpForSrcB = SrcB;TmpForSrcA = SrcA;TmpForSrcB = TmpForSrcBSrcA;if (j)beginALURes = (TmpForSrcB31:31), TmpForSrcB30:0;endelsebeginALURes = TmpForSrcB;endsra指令,算术右

26、移指令,实现将 00002 号寄存器的值算术右移 00001 号寄存器的值位,结 果存入 00003 号寄存器;32b000000 00001 00010 00011 00000 100010ALURes = SrcA - SrcB;sub指令,有符号减法指令, 实现将 00001 号寄存器和 00002 号寄存器的值进行有符号减法, 结果放到 00003 号寄存器中;32b001000 00001 00010 00011 00000 000000ALURes = SrcA + SrcB;addi 指令,立即数加法指令,实现将 00001号寄存器和 00 立即数进行有符号加法,结果放 到 00

27、003 号寄存器中;32b000000 00001 00010 00011 00000 011000ALURes = SrcA / SrcB;mulu 指令,无符号乘法指令,实现将 00001 号寄存器和 00002 号寄存器的值进行无符号乘 法,结果放到 00003 号寄存器中;32b000000 00001 00010 00011 00000 011000ALURes = SrcA / SrcB;divu 指令,无符号除法指令, 实现将 00001 号寄存器和 00002 号寄存器的值进行无符号除法,结果放到 00003 号寄存器中; 32b000010 00000000000000000

28、000000003PCF = 6h0,InstructionF25:0;PCF = PCF 2;Jump 指令,跳转指令,实现跳转到立即数的指令地址,执行程序。三、实验结果截图及分析如图所示进行了三条指令,我仅以此三条指令的结果进行分析:1. 32h00221820OpCode=000000,Funct=100000, 为有符号加法运算,从 00001 号寄存器取出第一个操作数 00000002 ,第二个寄存器取出第二个数 00000003,相加得到 ALUResE=00000005 ; 2.32h08000003OpCode=000010, 为 跳 转 指 令 , 立 即 数 为 00000

29、003 , 故 跳 转 到 第 三 条 指 令 执 行 , PCF=0000000c ;3.32hac240001OpCode=101011, 为分支指令,立即数为 0001,故 PCF=PCF+4;四、实验感想本次试验,我经历了历时 13 天的 cpu 设计,从刚开始的一无所知,只是拿到了五个基础实 验和自己动手写 cpu,到最后做出来,过程之艰辛无法言说,记忆深刻的地方是在写模 块连接时, 我按照书上的连接方法写模块连接,总是会报错, 卡了将近一天时间, 后来问老 师,老师给我们讲了模块连接的部分, 才解决了这个问题。 写 cpu 的过程中用到了很多知识, 计算机组成原理的有符号乘法, 算术移位, 计算机体系结构的五级流水等等, 通过本次实验 不仅学会了怎样做 cpu,还将学过的课程复习了一遍,觉得受益良多。最后以一句自己动手写 cpu 上的话来结尾一个人的旅行

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

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