单周期CPU设计实验

小火龙每年都会改一下实验内容,以下内容仅17年的实验。
代码下载
一. 实验目的
(1) 掌握单周期CPU数据通路图的构成、原理及其设计方法;
(2) 掌握单周期CPU的实现方法,代码实现方法;
(3) 认识和掌握指令与CPU的关系;
(4) 掌握测试单周期CPU的方法;
(5) 掌握单周期CPU的实现方法。

二. 实验内容
设计一个单周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下:
==> 算术运算指令
(1)add rd , rs, rt (说明:以助记符表示,是汇编指令;以代码表示,是机器指令)
000000 rs(5位) rt(5位) rd(5位) reserved
功能:rd←rs + rt。reserved为预留部分,即未用,一般填“0”。

(2)addi rt , rs ,immediate
000001 rs(5位) rt(5位) immediate(16位)
功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。
(3)sub rd , rs , rt
000010 rs(5位) rt(5位) rd(5位) reserved
功能:rd←rs - rt

==> 逻辑运算指令
(4)ori rt , rs ,immediate
010000 rs(5位) rt(5位) immediate(16位)
功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。
(5)and rd , rs , rt
010001 rs(5位) rt(5位) rd(5位) reserved
功能:rd←rs & rt;逻辑与运算。
(6)or rd , rs , rt
010010 rs(5位) rt(5位) rd(5位) reserved
功能:rd←rs | rt;逻辑或运算。

==>移位指令
(7)sll rd, rt,sa
011000 未用 rt(5位) rd(5位) sa reserved
功能:rd<-rt<<(zero-extend)sa,左移sa位 ,(zero-extend)sa

==>比较指令
(8) slt rd, rs, rt 带符号数
011100 rs(5位) rt(5位) rd(5位) reserved
功能:if (rs < rt) rd =1 else rd=0, 具体请看表2 ALU运算功能表,带符号

==> 存储器读/写指令
(9)sw rt ,immediate(rs) 写存储器
100110 rs(5位) rt(5位) immediate(16位)
功能:memory[rs+ (sign-extend)immediate]←rt;immediate符号扩展再相加。即将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。

(10) lw rt , immediate(rs) 读存储器
100111 rs(5位) rt(5位) immediate(16位)
功能:rt ← memory[rs + (sign-extend)immediate];immediate符号扩展再相加。
即读取rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中的数,然后保存到rt寄存器中。

==> 分支指令
(11)beq rs,rt,immediate
110000 rs(5位) rt(5位) immediate(16位)
功能:if(rs=rt) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
特别说明:immediate是从PC+4地址开始和转移到的指令之间指令条数。immediate符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。

(12)bne rs,rt,immediate
110001 rs(5位) rt(5位) immediate
功能:if(rs!=rt) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4
特别说明:与beq不同点是,不等时转移,相等时顺序执行。

(13)bgtz rs,immediate
110010 rs(5位) 00000 immediate
功能:if(rs>0) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4

==>跳转指令
(14)j addr
111000 addr[27…2]
功能:pc <-{(pc+4)[31…28],addr[27…2],0,0},无条件跳转。
说明:由于MIPS32的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!这样,除了最高6位操作码外,还有26位可用于存放地址,事实上,可存放28位地址了,剩下最高4位由pc+4最高4位拼接上。

==> 停机指令
(15)halt
111111 00000000000000000000000000(26位)
功能:停机;不改变PC的值,PC保持不变。

三. 实验原理
单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。时钟周期一般也称振荡周期。
CPU在处理指令时,一般需要经过以下几个步骤:
(1) 取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。
(2) 指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。
(3) 指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。
(4) 存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。
(5) 结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。
单周期CPU,是在一个时钟周期内完成这五个阶段的处理。
这里写图片描述
图1 单周期CPU指令处理过程
MIPS指令的三种格式:
这里写图片描述
其中,
op:为操作码;
rs:只读。为第1个源操作数寄存器,寄存器地址(编号)是0000011111,001F;
rt:可读可写。为第2个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上);
rd:只写。为目的操作数寄存器,寄存器地址(同上);
sa:为位移量(shift amt),移位指令用于指定移多少位;
funct:为功能码,在寄存器类型指令中(R类型)用来指定指令的功能与操作码配合使用;
immediate:为16位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据加载(Load)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数器(PC)的有符号偏移量;
address:为地址。
这里写图片描述
图2 单周期CPU数据通路和控制线路图

图2是一个简单的基本上能够在单周期CPU上完成所要求设计的指令功能的数据通路和必要的控制线路图。其中指令和数据各存储在不同存储器中,即有指令存储器和数据存储器。访问存储器时,先给出内存地址,然后由读或写信号控制操作。对于寄存器组,先给出寄存器地址,读操作时,输出端就直接输出相应数据;而在写操作时,在 WE使能信号为1时,在时钟边沿触发将数据写入寄存器。图中控制信号作用如表1所示,表2是ALU运算功能表。
表1 控制信号的作用
这里写图片描述
这里写图片描述

相关部件及引脚说明:
Instruction Memory:指令存储器,
Iaddr,指令存储器地址输入端口
IDataIn,指令存储器数据输入端口(指令代码输入端口)
IDataOut,指令存储器数据输出端口(指令代码输出端口)
RW,指令存储器读写控制信号,为0写,为1读
Data Memory:数据存储器,
Daddr,数据存储器地址输入端口
DataIn,数据存储器数据输入端口
DataOut,数据存储器数据输出端口
/RD,数据存储器读控制信号,为0读
/WR,数据存储器写控制信号,为0写
Register File:寄存器组
Read Reg1,rs寄存器地址输入端口
Read Reg2,rt寄存器地址输入端口
Write Reg,将数据写入的寄存器端口,其地址来源rt或rd字段
Write Data,写入寄存器的数据输入端口
Read Data1,rs寄存器数据输出端口
Read Data2,rt寄存器数据输出端口
WE,写使能信号,为1时,在时钟边沿触发写入
ALU: 算术逻辑单元
result,ALU运算结果
zero,运算结果标志,结果为0,则zero=1;否则zero=0
sign,运算结果标志,结果最高位为0,则sign=0,正数;否则,sign=1,负数

表2 ALU运算功能表
这里写图片描述
表3 控制信号与指令的关系表
这里写图片描述
这里写图片描述
附:z为zero,s为sign

表4 测试程序代码
这里写图片描述

表5 寄存器组值的变化
这里写图片描述
这里写图片描述
表6 Basy3板显示内容

附:一个格子有两个数据,上面的为按下按键时钟上升沿后的显示,下面的为松开按键时钟下降沿的显示,上升沿和下降沿数据的改变说明寄存器的写入是下降沿触发的,而读数不需要时钟,所以到下降沿后数据会改变。

四. 实验器材
电脑一台,Xilinx Vivado 软件一套,Basys3板一块。

五. 实验过程与结果
1.实验过程
单周期CPU的思想就是一个周期之内完成一条指令,在时钟上升沿完成PC的改变,下降沿完成寄存器组和RAM的数据保存。每条指令有它自己的数据通路。根据数据通路图的情况,可以对每一个控制端口列出对应的情况,于是便有上面的表3。
这里写图片描述
addi、ori的数据通路图
这里写图片描述
add、sub、and、or、slt的数据通路图
这里写图片描述
sw、lw数据通路图
这里写图片描述
sll的数据通路图
这里写图片描述
j的数据通路图
这里写图片描述
beq、bne、bgtz的数据通路图
这里写图片描述
上图是我对单周期CPU写的模块,对应数据通路图每个部分都有实现。二选择器,三选择器没有并入ALU和PC,也是分别模块化。
这里写图片描述
数据通路图的作用,可以在写ControlUnit时体现出来,使用case会写出200多行,既不美观,也不容易找出当中的错误,通过控制信号表可以节省代码量,更容易找出设计当中的错误。
这里写图片描述
上图是消抖模块,设置SAMPLE_TIME为20ns,每一纳秒记录一次电平,只有超过20ns不变,才认为这是一次完整的输入。
这里写图片描述
这是指令分割模块,方便后续的操作,不用每次都要手动分割。在数据通路上sa是5位数,然而传进去是32位,因此我在数据分割的时候,顺便把sa的位数扩展了,方便sll的操作。

这里写图片描述
这是位数扩展模块,若ExtSel为0,则对立即数进行补0扩展,否则对立即数进行符号扩展。
这里写图片描述
这是寄存器组模块,这是最重要的模块之一,读取数据不需要时钟,写数据需要时钟下降沿。但老师给的代码有个问题,就是reset后,PC为0时没有时钟下降沿保存$1,再按按键PC就是0x04了,因此reset后需要自己补充写寄存器,不然$1没保存,后面全错。
这里写图片描述
这个是ROM代码的一部分,老师给的代码是0的时候读,但表1是1的时候读,这部分要把读信号初始化为1。在这个实验中,PC,ROM是两个初始化的部分,没有初始化,PC不会改变,而且ROM也没有读取读取数据,造成后面数据出现X和Z的现象。

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、 设计目标 设计目的: 设计一个含有36条指令的MIPS单周期处理器,并能将指令准确的执行并烧写到试验箱上来验证 设计初衷 1、理解MIPS指令结构,理解MIPS指令集中常用指令的功能和编码,学会对这些指令进行归纳分类。 2、了解熟悉MIPS体系中的处理器结构 3、熟悉并掌握单周期处理器CPU的原理和设计 4、进一步加强Verilog语言进行电路设计的能力 二、实验设备 1、装有xilinx ISE的计算机一台 2、LS-CPU-EXB-002教学系统实验箱一台 三、实验任务 1.、学习 MIPS 指令集,深入理解常用指令的功能和编码,并进行归纳确定处理器各部件的控制码,比如使用何种 ALU 运算,是否写寄存器堆等。 2、单周期 CPU 是指一条指令的所有操作在一个时钟周期内执行完。设计中所有寄存器和存储器都是异步读同步写的,即读出数据不需要时钟控制,但写入数据需时钟控制。 故单周期 CPU 的运作即:在一个时钟周期内,根据 PC 值从指令 ROM 中读出相应的指令,将指令译码后从寄存器堆中读出需要的操作数,送往 ALU 模块,ALU 模块运算得到结果。 如果是 store 指令,则 ALU 运算结果为数据存储的地址,就向数据 RAM 发出写请求,在下一个时钟上升沿真正写入到数据存储器。 如果是 load 指令,则 ALU 运算结果为数据存储的地址,根据该值从数据存 RAM 中读出数据,送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果非 load/store 操作,若有写寄存器堆的操作,则直接将 ALU 运算结果送往寄存器堆根据目的寄存器发出写请求,在下一个时钟上升沿真正写入到寄存器堆中。 如果是分支跳转指令,则是需要将结果写入到 pc 寄存器中的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值