31条指令单周期cpu设计(Verilog)-(三)指令分析

  • 说在前面

开发环境:Vivado

语言:Verilog

cpu框架:Mips

控制器:组合逻辑

 鸽鸽鸽。。。

  • 指令分析流程
  1. 确定一条指令所需要的具体操作 
  2. 分析该条指令涉及的部件
  3. 确定各个部件的输入输出关系
  4. 画出数据通路图 

以ADD为例

首先我们需要根据PC从指令集合中取出这条指令然后将两个操作数相加 R[rd]→R[rs]+R[rt] ,最后将PC+4,指向下一条指令;

涉及部件:PC寄存器、指令存储器、寄存器、ALU

输入输出关系:

数据通路图:

 


  • 31条指令分析 

NPC:即PC+4,可以使用简单的加法实现                           PC:指令计数器

IMEM:指令存储器                                                               ADD8:加8操作

RegFiles:寄存器堆                                                             EXTn:将n位扩展

IR:指令寄存器                                                                     MUX:多路选择器

DMEM:数据存储器

下面东西太多了,我把总结放这里吧。 

在分析指令的时候一定要参考详细的指令说明,在上一篇中有,这样可以帮助理解指令过程;

这31条指令看似很多(其实真的很多),但是里面还是有很多是相似的,所以数据通路图几乎一样;

比较难的几条指令:lw、sw、jal、beq

建议自己分析一遍(很重要

下一篇将分析两张很大很大的表格,指令操作时间表以及整体数据输入输出关系表,这两张表对于整体的数据通路的设计以及控制器设计十分重要!!!

  • add

格式:add rd, rs, rt

描述:rd ← rs + rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  • addu

格式:addu rd, rs, rt

描述:rd ← rs + rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  • sub 

格式:sub rd, rs, rt

描述:rd ← rs - rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  • subu

格式:subu rd, rs, rt

描述:rd ← rs - rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  •  and

格式:and rd, rs, rt

描述:rd ← rs and rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  •  or

格式:or rd, rs, rt

描述:rd ← rs or rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

 

  •  xor

格式:xor rd, rs, rt

描述:rd ← rs xor rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

  •  nor

格式:nor rd, rs, rt

描述:rd ← rs nor rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU

 

  •  slt

格式:slt rd, rs, rt

描述:rd ← (rs < rt); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT1

  • sltu

格式:sltu rd, rs, rt

描述:rd ← (rs < rt); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT1 

  • sll

格式:sll rd, rt, sa

描述:rd ← rt << sa (logical); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、Ext5 

  •  srl

格式:srl rd, rt, sa

描述: rd ← rt >> sa (logical); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、Ext5

  •  sra

格式:sra rd, rt, sa

描述: rd ← rt >> sa (arithmetic); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、Ext5

  • sllv

格式:sllv rd, rt, rs

描述:rd ← rt << rs [4:0] (logical); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT5 

  •  srlv

格式:srlv rd, rt, rs

描述:rd ← rt >> rs [4:0] (logical); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT5

  •  srav

格式:srav rd, rt, rs

描述:rd ← rt >> rs [4:0] (arithmetic); PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT5

  • jr

格式:jr rs

描述:PC ← rs; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles 

  •  addi

格式:addi rt, rs, immediate

描述:rt ← rs + immediate; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  addiu

格式:addiu rt, rs, immediate

描述:rt ← rs + immediate; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  andi

格式:andi rt, rs, immediate

描述:rt ← rs and immediate; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  ori

格式:ori rt, rs, immediate

描述:rt ← rs or immediate; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  xori

格式:xori rt, rs, immediate

描述:rt ← rs xor immediate; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  lw

格式:lw rt, offset(base)

描述:rt ← memory[rs + Sign_ext_offset]; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16、DMEM

  •  sw

格式:sw rt, offset(base)

描述:memory[rs + Sign_ext_offset] ← rt; PC ← NPC (PC + 4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16、DMEM

  •  beq

格式:beq rs, rt, offset

描述:rs == rt, PC ← NPC + Sign_ext (offset||02);否则PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT18、ADD

  •  bne

格式:bne rs, rt, offset

描述:rs != rt, PC ← NPC + Sign_ext (offset||02);否则PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT18、ADD

  •  slti

格式:slti rt, rs, immediate

描述:rt ← (rs < immediate); PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16、EXT1

  •  sltiu

格式:sltiu rt, rs, immediate

描述:rt ← (rs < immediate); PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16、EXT1

  •  lui

格式:lui rt, immediate

描述:rt ← immediate || 016; PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、EXT16

  •  j

格式:j target

描述:PC ← PC31-28 || instr_index || 02; PC ← NPC(PC+4)

部件:PC、NPC、IMEN、ALU、II

  •  jal

格式:jal target

描述:GPR[31] ← PC + 8;PC ← PC31-28 || instr_index || 02;PC ← NPC(PC+4)

部件:PC、NPC、IMEN、RegFiles、ALU、II、ADD8


 

  • 31
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是一个简单的31指令单周期CPU设计的步骤: 1. 确定CPU指令集,包括指令的种类、操作数的类型和长度等。 2. 设计CPU的数据通路,包括寄存器、ALU、数据存储器等。 3. 设计控制逻辑,包括指令解码器、时序逻辑等。 4. 实现寄存器堆,包括寄存器的读写逻辑和寄存器的数量。 5. 实现ALU,包括加法、减法、位移等操作。 6. 实现数据存储器,包括访问逻辑和存储器容量。 7. 实现指令解码器,包括指令的解析和操作数的提取。 8. 实现时序逻辑,包括时钟控制和状态机等。 9. 实现总线接口,包括CPU与外部设备的通信接口。 10. 编写Verilog代码,对每个模块进行描述和仿真。 11. 进行综合,将Verilog代码转换成门级电路。 12. 进行布局布线,将门级电路进行布局和布线。 13. 进行时序分析,确认电路的时序问题。 14. 进行静态时序和动态时序的仿真,验证电路的正确性。 15. 进行后仿真,与实际硬件进行比较,确认电路的正确性。 16. 进行FPGA验证,将电路烧录到FPGA中进行验证。 17. 进行调试和优化,对电路进行优化和调试,提高性能和稳定性。 18. 编写汇编代码,对CPU进行测试。 19. 进行单步调试,对CPU进行单步调试,确认指令执行的正确性。 20. 进行多步调试,对CPU进行多步调试,确认程序的正确性。 21. 进行性能测试,测试CPU的性能和稳定性。 22. 进行功耗测试,测试CPU的功耗和温度。 23. 进行集成测试,将CPU与其他模块进行集成测试,确认整个系统的正确性。 24. 进行系统测试,对整个系统进行测试,确认系统的正确性和稳定性。 25. 进行安全测试,测试系统的安全性和可靠性。 26. 进行兼容性测试,测试系统的兼容性和互操作性。 27. 进行负载测试,测试系统的负载能力和性能。 28. 编写文档,记录CPU设计的过程和方法。 29. 进行维护和更新,对CPU进行维护和更新,修复漏洞和提高性能。 30. 进行生产,将CPU进行生产,制造出具有相同特性的芯片。 31. 进行销售,将CPU进行销售,向市场提供高性能和低成本的处理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值