基于mips的31条指令集和ise软件的单周期cpu设计与实现内容摘要:

1) I 型指令,指令类型只是 op 决定 2) (rs), immediate 为源操作数, immediate 需要拓展成 32 位 3) rt 为目的寄存器地址, ALU 或移位器将结果写入 D. 所需器件: 7 1) 取指部分 PC寄存器、加法器(产生下一条 PC)、 ROM(存放指令) 2)执行部分 寄存器堆、拓展器(拓展 immediate)、控制器(产生控制信号)、移位器、选择器 E. 所需信号: RegWr:写寄存器堆信号 REGDst:选择 rt 或 rd 写入 EXTOp:是否拓展 immediate ALUSrc: ALU 是否进行立即数运算信号 ALUCtr(3:0): ALU 操作类型控制信号 LUI:是否为 lui指令 luibit(31:0): lui的移位数据,固定 16 Arith:是否算术移位控制信号 Right:是否右移 ,信号 ISSHIFT:是否有移位信号 cmpless 是否为比较产生小于 F. 操作步骤 1) PC→ ROM:将 PC 送入 ROM 2) ROM→控制器:将指令的 op 送入控制器 控制器:产生 RegWr, REGDst, EXTOp, ALUSrc, ALUCtr(3:0), LUI, luibit(31:0), Arith, Right, ISSHIFT, IsShamt, cmpless ROM→寄存器堆: rs 送入寄存器堆读地址端口 Ra(4:0) rt 送入寄存器堆写地址端口 Rw(4:0) ROM→拓展器: immediate 送入 1632 位拓展器 PC→加法器:改写 PC 3) 寄存器堆→移位器:寄存器堆输出 (rs)到移位器数据端 寄存器堆→ ALU: (rs)送入到 ALU 输入端 拓展器→ ALU:拓展后的立即数送到 ALU 输入端 ALU:根据控制信号 ALUCtr(3:0)计算结果 luibit(31:0)→移位器:移位位数 16 送入移位器位数端 移位器:根据控制信号 Arith 和 Right 移位 4) 移位器→选择器:将计算结果送到选择器 ALU→选择器:将计算结果送到选择器 选择器→寄存器堆:根据 ISSHIFT 控制信号选择回写数据 G. 完善设计图 为了判断最后写入 rt 还是 rd,加入 REGDst 控制信号 为了判断 ALU 另一个数据来源,加入 ALUSrc 控制信号 为了判断写回是否是比较的标志数,加入 cmpless 控制信号 为了判断是否为固定左移位数为 16 位,加入 LUI 控制信号 8 利用 存储器操作类 A. 包含指令: sw, lw B. 指令格式: 3126 2521 2016 150 op( 000000) rs rt offset C. 指令特点: 1) I 型指令,指令类型只是 op 决定 2) (rs), offset 为 ALU 源操作数, offset 需要拓展成 32 位 3) ALU 计算结果作为存储器 (RAM)的入口地址 D. 所需器件: 1) 取指部分 PC寄存器、加法器(产生下一条 PC)、 ROM(存放指令) 2)执行部分 寄存器堆、拓展器(拓展 offset)、控制器(产生控制信号)、选择器 E. 所需信号: RegWr:写寄存器堆信号 REGDst:选择 rt 或 rd 写入 EXTOp:是否拓展 offset ALUSrc: ALU 是否进行立即数运算信号 ALUCtr(3:0): ALU 操作类型控制信号 MEMtoREG:是否是 RAM 来的数据写入寄存器堆 MEMWr:是否写 RAM F. 操作步骤 lw: 1) PC→ ROM:将 PC 送入 ROM 2) ROM→控制器:将指令的 op 送入控制器 控制器:产生 RegWr, REGDst, EXTOp, ALUSrc, ALUCtr(3:0) , MEMtoREG, MEMWr ROM→寄存器堆: rs 送入寄存器堆读地址端口 Ra(4:0) rt 送入寄存器堆写地址端口 Rw(4:0) ROM→拓展器: offset 送入 1632 位拓展器 PC→加法器:改写 PC 3) 寄存器堆→ ALU:寄存器堆输出 (rs)到 ALU 输入端 拓展器→ ALU:拓展器输出由拓展的 32 位 offset 到 ALU 输入端 ALU:根据控制信号 ALUCtr(3:0)计算结果 4) ALU→ RAM: ALU 计算结果输入到 RAM 地址段 5) RAM→寄存器堆: RAM 将对应地址内数据送到寄存器堆写数据端口 WriteD(31:0) 9 sw: 1) PC→ ROM:将 PC 送入 ROM 2) ROM→控制器:将指令的 op 送入控制器 控制器:产生 REGDst, EXTOp, ALUSrc, ALUCtr(3:0), MEMWr ROM→寄存器堆: rs 送入寄存器堆读地址端口 Ra(4:0) rt 送入寄存器堆读地址端口 Rb(4:0) ROM→拓展器: offset 送入 1632 位拓展器 PC→加法器:改写 PC 3) 寄存器堆→ ALU:寄存器堆输出 (rs)到 ALU 输入端 拓展器→ ALU:拓展器输出由拓展的 32 位 offset 到 ALU 输入端 ALU : 根 据 控 制 信 号 ALUCtr(3:0) 计 算 结 果 寄存器堆→ RAM:寄存器堆输出 (rt)到 RAM 数据端 4) ALU→ RAM: ALU 计算结果输入到 RAM 地址段 G. 完善设计图 为了控制写 MEM(RAM),加入 MEMWr 控制信号 为了判断是原数据还是 MEM回写寄存器堆,加入回写寄存器堆选择信号 MEMtoREG 跳转指令类 A. 包含指令: jr, j, jal, bne, beq B. 指令格式: jr: j: jal: beq/bne: 3126 2521 206 50 op( 000000) rs((11111)) 000...000 func(001000) 3126 250 op( 000010) address 3126 250 op( 000011) address 3126 2521 2016 150 op rs rt offset 10 C. 指令特点: 1) 多种类型指令,指令类型是 op 决定 2) 可能导致 PC值改变较大的量 3) 需要跳转控制 D. 所需器件: 2) 取指部分 PC 寄存器、加法器(产生下一条 PC)、 ROM(存放指令)、选择器、拓展器、移位器 2)执行部分 寄存器堆、 ALU(计算)、控制器(产生控制信号)、选择器 E. 所需信号: ALUCtr(3:0): ALU 操作类型控制信号 jr 是否为 jr 指令 returnaddress 是否为 jal指令 BNE 是否为 BNE 指令 Branch 是否有分支 Jump 是否跳转 F. 操作步骤 1) PC→ ROM:将 PC 送入 ROM 2) ROM→控制器:将指令的 op, func 送入控制器 控制器:产生控制信号 ROM→寄存器堆: rs, rt 送入寄存器堆两个读地址端口 Ra(4:0)、 Rb(4:0) 3) 寄存器堆→ ALU :寄存器堆输出 (rs) 、 (rt) 送到 ALU 两输入端 ALU:根据控制信号 ALUCtr(3:0)计算结果 4) 取指部分 :根据控制信号回写对应 PC G. 设计图 1) 取指部分: 11 2) 执行部分 12 13 3. 各部件的设计与特色 控制器 设计思路: 我们通过模块化设计的方法,将指令之间的关联取消,避免了繁杂和易出错的化简操作,同时又保持了较好的可扩展性,可以改动极少地根据需要增加指令。 电路图: 详细电路图见“ ” 所用部件: buf 改名器 inv 反相器 and 或门 or 与门 总览: 14 15 详细说明: 送入控制器的有指令前 6 位和后 6 位,根据指令的 op 和 function 来决定各部件的 控制信号。 在控制器内我们将各位分别取反,得到各位的非信号,然后我们将每条指令根据指令类型( R/I/J)表示出来: 如 I 型指令 SLTI 的 op 为 001010,则用与门将进行与运算,这样输入 op 为 001010 时与门输出为 1,其他时候都是 0。 其他 I、 J 型指令用类似方式编码。 对于 R 型指令,我们用另一种方式处理: 16 首先,由于 R 型指令具有统一的特点: op 为全 0,所以可以用一个与门表示所输入的指令为 R 型指令: 在 OP 输入全 0 时,这个与门输出为 1,即判定指令为 R 型指令; 然后,由于 R 型指令依靠 function 区分,所以使用和区分 I/J 型指令一样的模块化设计思路,将 R 型指令的 function 对应位置进行与运算: 以 ADD 指令为例: 因此,在输入 op 为 000000, function 为 100000 时,这个与门的输出 ADD 为 1。 对所有指令进行这样的表示后,我们会得到 31 个输出,分别代表 31 条指令。 我们已经将指令之间的关联去除,也不需要进行化简操作,可以根据输入的 op 和function 判断是 31 条指令中的哪一条生效。 控制器真值表见附件“真值表 .htm”; 17 ALU 控制器真值表见附件“ ALU 控制器真值表 .htm”; 我们以真值表中的 extop 信号生成过程为例说明我们的设计思路: 由真值表可知, extop 信号在 ADDI、 ANDI、 LW、 SW、 SLTI 指令时为 1,其他指令时为 0,因此,我们利用前面模块化设计取出的 31条指令,将可以使 extop 为 1 的信号输入或门,从而得到 extop 信号的输出; 这样做可以 避免化简 ,同时 可维护性非常好 ,如果有新的部件加入,需要新的控制信号,只需要在得到新的真值表后将对应为 1 的指令信号项取出来,输入或门,就能得出控制信号,免去了对整个控制器重新化简、调整的步骤,从而使这个控制器对 MIPS指 令集 有良好的可扩展性 ,将我们现在做的 31 条指令扩展到 57 条是触手可及的。 遇到的问题: 模块化设计思路其实不是一开始就想到的。 一开始是想偷个懒,化简出每个信号的表达式,然后根据化简后的结果直接连接原始 op 信号、 function 信号到输出脚上。 实际操作时发现对每个信号都要做大量重复性质很强的的化简操作,一旦出错还非常不容易检查,需要从化简开始从头检查。 在从老师给的 14 条指令向 31 条指令拓展的时候,我们发现需要增加新的控制线来对新增部件进行控制的同时需要调整现有控制线由化简得出的连接状态。 解决方法: 我们原创性地设想了模块化的设计思路:分别将每条指令由 OP 输入和 FUNTION 输入表示,当输入的 op 和 function 在 31 条指令的指令集中有效时,对应名字的指令引脚会为 1,其他指令引脚为 0;然后由真值表得出每个控制信号在哪些指令时为 1,将对应的指令信号通过或门连接得到输出; 进行上述修改后,再进行真值表扩展时,我们只需要关注扩展出的部分在输入哪些指令时,各信号的真值为 1,只需要将对应为 1 的指令信号通过或门生成新的信号。 ALU 设计思路 : ALU 的职能是执行算术运算和逻辑运算,因此需要有两个操作数输入,一个操作数输 18 出,一组控制信号输入,一组状态信号输出; 核心运算器件是两个 adsu16 串联组成的 adsu32 32 位加减法器。 控制信号输入即为由控制器译码得到的 ALUCtr(3:0), ALU 内置 ALU 控制器,接收ALUCtr,对 ALU 的输出进行选择。 状态信号由输出结果和 adsu 产生,包括溢出判断、小于判断、零判断。 我们设计的 ALU 能完成的功能只有 10 种,包括加减运算,逻辑运算,比较运算,没有将移位运算放入 ALU 中。 这也导致了在数据通路中需要单独为 移位器设计,增加了数据通路的复杂性。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。