Logisim单周期cpu设计文档与思考题


设计文档

支持指令集

指令 格式 描述(RTL) 机器码 OPCODE/FUNCT
add add rd rs rt GPR[rd] <- GPR[rs]+GPR[rt] R型 0/100000
sub sub rd rs rt GPR[rd] <- GPR[rs]-GPR[rt] R型 0/100010
ori ori rt rs imme GPR[rt] <- GPR[rs] or imme I型 001101
lw lw rt offset(base) GPR[rt] <- memory[GPR[base]+offset] I型 100011
sw sw rt offset(base) memory[GPR[base]+offset] <- GPR[rt] I型 101011
beq beq rs rt offset if(GPR[rs]==GPR[rt]) PC <- PC+4+sign_extend(offset||00) I型 000100
lui lui rt imme GPR[rt] <- imme||0^16 I型 001111
jal jal target PC <- PC31..28||target||00 并且 GPR[31] <- PC + 4 J型 000011
jr jr rs PC <- GPR[rs] R型 0/001000
sll sll rd rt s GPR[rd] <- GPR[rt] << s R型 0/000000
jalr jalr rd rs PC <- GPR[rs] , GPR[rd] <- PC+4 R型 0/001001
lb lb rt offset(rs) GPR[rt] <- memory[GPR[rs]+offset] I型 100000
sb sb rt offset(rs) memory[GPR[rs]+offset] <- GPR[rt] I型 101000
slt slt rd rs rt GPR[rd] <- (GPR[rs] < GPR[rt]) R型 0/101010
nop null 不进行任何操作,空置一周期 null 0x00000000

注意

  • 其中sll指令为R型指令,这是因为我们最多移位31位,没必要用16位的立即数保存。故s为5位,是一种特殊的R型(只有两个寄存器参与操作)
  • nop虽然不需要进行任何操作,但是仍然需要进行PC <- PC + 4,所以在设计NPCop时不要忘了2'b00也应该能被nop激活。

mips指令集机器码补充

R型指令

opcode rs rt rd shamt funct
位长 6 5 5 5 5 6
占位 31-26 25-21 20-16 15-11 10-6 5-0

I型指令

opcode rs rt immediate
位长 6 5 5 16
占位 31-26 25-21 20-16 15-0

J型指令

opcode instr_index
位长 6 26
占位 31-26 25-0

数据通路形式建模

模块分析

  • IFU(Instruction Fetch Unit 取指令单元)

模块描述

  • 内部包括 PC(程序计数器)、IM(指令存储器)、NPC(进行指令的转移地址计算)。
  • PC 用寄存器实现,应具有异步复位功能,复位值为起始地址。
  • 起始地址:0x00003000。
  • 地址范围:0x00003000 ~ 0x00006FFF。
  • IM 用 ROM 实现,容量为 4096 × 32bit。
  • ROM 内部的起始地址是从 0 开始的,即 ROM 的 0 位置存储的是 PC 为 0x00003000 的指令,每条指令是一个 32bit 常数。
  • 经过以上分析,不难发现 ROM 实际地址宽度仅需 12 位,请使用恰当的方法将 PC 中储存的地址同 IM 联系起来。

模块功能及引脚定义

  • PC:当Reset=1时,异步复位至地址0x0000_3000
信号 方向 描述
CLK I 1 单周期的时钟信号
Reset I 1 异步复位
DI I 1 NPC传来的新的指令地址
DO O 1 当前指令地址
  • NPC:计算下一条指令的地址
信号 方向 描述
PC I 32 当前指令地址
imm16 I 16 beq时跳转到的地址
ZERO I 1 ALU减法结果是否为 0
NPCop I 2 决定NPC应该进行何种计算
NPC O 32 下一条指令的地址
  • IM:读取指令机器码并分解
信号 方向 描述
PC I 32 当前指令地址
OPCODE O 6 当前指令的OPCODE
rs O 5 rs编号
rt O 5 rt编号
rd O 5 rd编号
imm16 O 16 立即数
FUNCT O 6 当前指令的FUNCT
  • GRF(寄存器堆)

模块描述

  • 用具有写使能的寄存器实现,寄存器总数为 32 个,应具有异步复位功能。
  • 0 号寄存器的值始终保持为 0。其他寄存器初始值(复位后)均为 0,无需专门设置。
  • 0号寄存器采用接地设计,故实际上只有31个寄存器。

模块功能及引脚定义

  • GRF:寄存器堆用于存储寄存器中的数据
信号 方向 描述
CLK I 1 时钟信号
Reset I 1 异步复位信号
GRFWe I 1 写使能信号
A1 I 5 rs寄存器编号
A2 I 5 rt寄存器编号
A3 I 5 rd寄存器编号
WD I 32 写入rd的数据
RD1 O 32 rs寄存器读出值
RD2 O 32 rt寄存器读出值
  • ALU(算术逻辑单元)

模块描述

  • 提供 32 位加、减、或运算及大小比较功能。
  • 加减法按无符号处理(不考虑溢出)。

模块功能及引脚定义

信号 方向 描述
A I 32 GPR[rs]
B I 32 GPR[rt] 或 扩展后的立即数
ALUop I 2 执行何种运算
RD O 32 运算结果
ZERO O 1 执行减法时结果是否为 0
  • 注:规定ALUop的2'b00,2'b01,2'b10分别表示add、sub、ori操作
  • DM(数据存储器)

模块描述

  • 使用 RAM 实现,容量为 3072 × 32bit,应具有异步复位功能,复位值为 0x00000000。
  • 起始地址:0x00000000。
  • 地址范围:0x00000000 ~ 0x00002FFF。
  • RAM 应使用双端口模式,即设置 RAM 的 Data Interface 属性为 Separate load and store ports。

模块功能及引脚定义

信号 方向 描述
A I 32 数据存储器地址
DI I 32 写入的数据
We I 1 写使能
CLK I 1 时钟信号,异步复位
Reset I 1 复位信号
DO O 32 输出的数据
  • EXT(扩展单元)

模块描述

  • 使用 Logisim 内置的 Bit Extender。
  • 作用为将immediate16拓展为32bit。
  • 具有拓展选择信号EXTop。

控制器(Controller)建模

  • 模块描述
  • 使用与或门阵列构造控制信号。
  • 分析可知,决定控制信号的就是当前在执行哪种指令,我们便需要建立每种信号的布尔表达式
  • 与阵列中,我们将每种指令作为输出,布尔表达式建立方法如:beq的opcode为000100,则beq=!op[5]!op[4]!op[3]op[2]!op[1]*!op[0]
  • 或阵列中,只需要把使得控制信号为真的指令或起来即可。
  • 模块功能及引脚定义
信号 方向 描述 多位控制信号的具体描述
OPCODE I 6 指令的opcode
FUNCT I 6 指令的funct
NPCop O 2 决定NPC应该进行何种计算 2'b00 : +4
2'b01 : beq
2'b10 : jal
2'b11 : jr
WRSel O 2 GRF写入地址来源 2'b00 : rt
2'b01 : rd
2'b10 : ra(jal)
WDSel O 2 GRF写入数据来源 2'b00 : ALU的输出
2'b01 : DM的输出
2'b10 : 立即数
2'b11 : PC+4(jal)
EXTop O 2 如何扩展立即数 2'b00 : 无符号扩展
2'b01 : 有符号扩展
2'b10 : 在低位扩展16个0
GRFWe O 1 GRF写使能
ALUop O 2 进行何种运算 2'b00 : 加法
2'b01 : 减法
2'b10 : 或运算
2'b11 : 左移运算
BSel O 1 运算数是否为立即数
DMWe O 1 DM写使能

思考题

  1. 上面我们介绍了通过 FSM 理解单周期 CPU 的基本方法。请大家指出单周期 CPU 所用到的模块中,哪些发挥状态存储功能,哪些发挥状态转移功能。

    :单周期cpu涉及到的模块有:NPC、PC、IM、GRF、ALU、DM,可以将其划分为两个FSM:分别为NPC、PC、IM构成的Moore型FSM,称之为IFU 和 GRF、ALU、DM构成的下游mealy型FSM。在IFU中,PC发挥状态存储功能,NPC发挥状态转移功能;在下游FSM中,GRF发挥状态存储功能,整个IFU发挥状态转移功能。


  2. 现在我们的模块中 IM 使用 ROM, DM 使用 RAM, GRF 使用 Register,这种做法合理吗? 请给出分析,若有改进意见也请一并给出。

    :我认为合理。ROM是只读存储器,只能读取而无法写入,在程序运行的过程中,我们已经将mips翻译为机器码导入IM的ROM中,无须修改,故合理。DM是cpu的主存,会与ALU和GRF间交互数据,所以DM需要同时具有读与写的功能,使用RAM合理。GRF本来就是register file,临时的存储变量,符合寄存器的特性,合理。


  3. 在上述提示的模块之外,你是否在实际实现时设计了其他的模块?如果是的话,请给出介绍和设计的思路。

    :无。


  4. 事实上,实现 nop 空指令,我们并不需要将它加入控制信号真值表,为什么?

    :由于我们的controller是通过与或阵列实现的,nop的机器码为0x0000_0000,在不考虑nop时,controller的与阵列的所有已经设计好的指令输出都为低电平,即cpu不会有任何高电平写使能、NPC也按照正常方式计算一下条指令地址,此时电路表现为空置一周期,故不需要考虑nop指令的设计。


  5. 阅读 Pre 的 “MIPS 指令集及汇编语言” 一节中给出的测试样例,评价其强度(可从各个指令的覆盖情况,单一指令各种行为的覆盖情况等方面分析),并指出具体的不足之处。

    :我认为强度不够。在指令集覆盖方面缺少对sub指令的测试,同时在具体单种指令的测试上,ori的数据缺少边界情况的测试如立即数为0x0或0xffff;add指令缺少运算数包含0x0的情况;sw指令测试存在问题:lw的偏移量是负数的情况没有测试;lw与sw是同样的问题;beq指令的问题是缺少寄存器是负数的判断和跳转。

    附上成功自测出GRFbug的改进数据。
    # add sub ori lw sw beq lui nop
    ori $a0 $0 123#a0 = 123
    ori $a1 $a0 456#a1 = 507
    ori $a1 $a1 0#a1 = 507
    ori $a2 0xffff#a2 = 0xffff lui $a3 123#a3 = 0x007B_0000
    lui $t0 0xffff
    ori $t0 $t0 0xffff#t0 = 0xffffffff (-1) # wrong from here s0 is -1(wrong)
    add $s0 $a0 $a2#s0 = 65658
    add $s1 $a0 $t0#s1 = 122
    add $s2 $t0 $t0#s2 = -2
    add $s3 $0 $t0#s3 = -1 sub $s4 $a0 $a1#s4 = -384
    sub $s5 $a1 $a0#s5 = 384
    sub $s6 $t0 $t0#s6 = 0
    sub $s7 $a0 $t0#s7 = 124 ori $t1 0x0000#t1 = 0
    sw $a0 0($t1)#123
    sw $a2 4($t1)#0xffff
    sw $0 8($t1)#0
    sw $t0 12($t1)#-1
    ori $t2 20#t2 = 20
    sw $a1 -4($t2)#507 ori $t3 $0 4
    lw $t4 4($t3)#t4 = 0xffff
    lw $t5 8($t3)#t5 = 0
    lw $t6 12($t3)#t6 = -1
    lw $t7 -4($t3)#t7 = 507 beq $a0 $a1 loop1#unequal
    beq $s3 $t0 loop2#equal loop1:lw $t8 0($t1)
    loop2:lw $t8 4($t1)#t8 = 0xffff

Mips单周期CPU设计(logisim实现)的更多相关文章

  1. 单周期CPU设计的理论基础

    写在前面:本博客内容为本人老师原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法UR ...

  2. 单周期cpu设计代码解读

    目录 写在前面 单周期cpu设计代码讲解 概念回顾 Verilog代码讲解 写在前面 欢迎转载,转载请说明出处. 单周期cpu设计代码讲解 概念回顾 一.电子计算机的部件 分为:中央处理器(cpu). ...

  3. P4-verilog实现mips单周期CPU

    最近对学习的掌控可能出现了问题,左支右绌,p2挂了,p2.p3.p4.p5每周在计组花的连续时间少了很多,学习到的东西也少了很多,流水线都还没真正开始写,和别人比落后了一大截,随笔自然就荒废了,我得尽 ...

  4. 单周期CPU设计

    终于有点时间了,恰好多周期的设计也已经完成,其实只想写写多周期的,无奈单周期补上才好,哈哈哈~ —————+—————黄金分割线—————+————— 首先要理解什么叫单周期CPU(与后面多周期CPU ...

  5. Verilog HDL语言实现的单周期CPU设计(全部代码及其注释)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  6. 使用logisim搭建单周期CPU与添加指令

    使用logisim搭建单周期CPU与添加指令 搭建 总设计 借用高老板的图,我们只需要分别做出PC.NPC.IM.RF.EXT.ALU.DM.Controller模块即可,再按图连线,最后进行控制信号 ...

  7. 使用Verilog搭建一个单周期CPU

    使用Verilog搭建一个单周期CPU 搭建篇 总体结构 其实跟使用logisim搭建CPU基本一致,甚至更简单,因为完全可以照着logisim的电路图来写,各个模块和模块间的连接在logisim中非 ...

  8. 为什么现在使用多周期CPU,而单周期CPU被弃用?

    最初设计的CPU结构简单,内部不复杂.之所以制造它是为了让机器自动跑程序,算数. 早期CPU都是单周期的,人们没考虑那么多,性能啥的.就让CPU每个时钟周期跑一个指令,这些时钟周期等长.这样下来,有的 ...

  9. Vivado实战—单周期CPU指令分析

    引言   不知道你是否和我有过同样的感受,<计算机组成原理>这门学科学起来如此的艰难:一节课下来,教室黑板上留下了满满的 "足迹",看上去也挺简单的,不就是 0 和 1 ...

  10. 单周期CPU

    一个时钟周期执行一条指令的过程理解(单周期CPU): https://blog.csdn.net/a201577F0546/article/details/84726912 单周期CPU指的是一条指令 ...

随机推荐

  1. 结构开发笔记(三):solidworks软件(二):小试牛刀,绘制一个立方体

    前言   solidworks草图大师,基本的使用过程.  所有的零件基础都是从平面绘制开始,然后凸出来厚度.  本篇绘制一个简单的立方体,熟悉基本操作.   立方体绘制过程   选取一个平面绘制一个 ...

  2. 优秀架构设计与web文档

    架构风格与基于网络的软件架构设计 https://docs.huihoo.com/rest/REST_cn.pdf rfc https://tools.ietf.org/html/rfc2616

  3. manim 中的三维视角

    今天研究了一下 manim 中的 ThreeDAxes 和 set_camera_orientation 这里记录一下视角. manim 中的 3D 坐标系是笛卡尔的三维坐标系,属于右手坐标系,即右手 ...

  4. TCP/TP协议栈(逐渐更新版)

    TCP/IP协议栈 应用层 DNS协议 传输层 TCP协议 TCP协议报文结构 源端口 目的端口 序列号 确认号 头长度header length or data offset 保留字段reserve ...

  5. 导出 LaTeX 为 SVG

    LaTeX 本身并不直接支持导出 SVG 格式的文档或图片,但可以通过一些工具和插件实现将 LaTeX 文档或图形转换为 SVG 格式. 使用 dvisvgm 我们可以先将 LaTeX 文档编译为 D ...

  6. win10自动更新导致的任务栏假死,右键单击任务栏延迟菜单延迟出现

    系统是win10企业版,前天晚上回家之前,电脑还是好好的,然后前天早上跑过来以后,发现电脑自动重启了,我还以为是办公室停电了之类的(现在想了一下愚蠢,停电不会自动开机),没想到是自动更新 然后我发现, ...

  7. 学习笔记:robots.txt文件

    1.1 介绍 robots.txt文件是一种用于指导搜索引擎爬虫在网站上哪些页面可以被抓取,哪些页面不应该被抓取的文本文件.这个文件通常放置在网站的根目录下. 1.2 由来 robots.txt标准最 ...

  8. 机器学习--决策树算法(CART)

    CART分类树算法 特征选择 ​ 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择.在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题. ...

  9. OData – 大杂烩

    前言 本篇记入一些 OData 的小东西. Query string too long OData 使用 GET 请求,然后搭配 query string $filter, $select, $exp ...

  10. 二叉树的 Morris 中序遍历——O(1)空间复杂度

    回顾 问题陈述: 给定一棵二叉树,实现中序遍历并返回包含其中序序列的数组 例如给定下列二叉树: 我们按照左.根.右的顺序递归遍历二叉树,得到以下遍历: 最终中序遍历结果可以输出为: [3, 1, 9, ...