我的大学之计算机组成原理系列NO.9

课题:单周期CPU设计

一、实验目的
1.掌握单周期CPU数据通路图的构成、原理及其设计方法。
2.掌握单周期CPU的实现方法,代码实现方法。
3.认识和掌握指令与CPU的关系。
4.掌握测试单周期CPU的方法。

二、实验设备
1.装有ISE Design Suite 14.7的计算机一台。

三、实验任务
设计一个单周期CPU,该CPU至少能实现以下指令功能操作。需设计的指令与格式如下(reserved为预留部分即未用,一般填充“0”):
1)算术运算指令
(1)
指令:add rd,rs,rt
功能:rd←rs+rt
格式:
在这里插入图片描述
(2)
指令:addi rt,rs,immediate
功能:rt←rs+[sign-extend]immediate immediate符号位扩展再“加”运算
格式:
在这里插入图片描述
(3)
指令:sub rd,rs,rt
功能:rd←rs-rt
格式:
在这里插入图片描述
2)逻辑运算指令
(1)
指令:ori rt,rs,immediate
功能:rt←rs|{zero-extend}immediate immediate零扩展后参与“或”运算
格式:
在这里插入图片描述
(2)
指令:and rd,rs,rt
功能:rd←rs&rt 逻辑与运算
格式:
在这里插入图片描述
(3)
指令:or rd,rs,rt
功能:rd←rs|rt 逻辑或运算
格式:
在这里插入图片描述
3)移位指令
(1)
指令:sll rd,rt,sa
功能:rd←rt<<{zero-extend}sa 左移sa位,{zeros-extend}sa
格式:
在这里插入图片描述
4)存储器读写指令
(1)
指令:sw rt,immediate{rs}
功能:memory[rs+{sign-extend}immediate]←rt ;rt存储到目标地址,immediate符号扩展后再相加
格式:
在这里插入图片描述
(2)
指令:lw rt,immediate{rs}
功能:rt←memory[rs+{sign-extend}immediate] ;读取目标地址数据到rt,immediate符号扩展后再相加
格式:
在这里插入图片描述
5)分支指令

指令:beq rs,rt,immediate
功能:if(rs==rt) pc←pc+4+{signa-extend}immediate<<2 else pc←pc+4
格式:
在这里插入图片描述
6)停机指令

指令:halt
功能:停机,不改变PC的值
格式:
在这里插入图片描述
特别说明: immediate是从PC+4地址开始和转移到的指令之间指令条数。immediate符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。
补充:
1、PC、寄存器组和存储器写状态使用时钟触发。
2、指令存储器和数据存储器存储单元宽度一律使用8位,即一个字节的存储单位。不能使用32位作为存储器存储单元宽度。
3、控制器部分要学会用控制信号真值表方法分析问题并写出逻辑表达式;或者用case语句方法逐个产生各指令控制信号。
4、必须写一段测试用的汇编程序,而且必须包含所要求的所有指令,beq指令必须检查两种情况:“等”和“不等”。

四、实验步骤
1.设计Control Unit
由数据通路图可知:
输入信号为:opCode、zero
输出信号为: PCWre, ALUSrcA, ALUSrcB,DBDataSrc,RegWre,InsMemRW, RD,WR, ExtSel,RegDst,PCSrc,ALUOp
设计control unit,必须列出控制信号与指令的关系表
在这里插入图片描述

然后根据该表assign对应的值。
2.设计ALU
由数据通路图可知,
输入信号为: ReadData1, ReadData2,inExt,insa,ALUSrcA,ALUSrcB,ALUOp
输出信号为: zero, result
然后根据表2 ALU运算功能表对result与zero赋值
3.设计PC
由数据通路图可知,
输入信号为: clk, Reset, PCWre, PCSrc, immediate,
输出信号为: Address
判断是否有Reset信号,如果有,将PC置为0;
判断是否有PCSrc信号,如果有,将immediate作为偏移值加上PC中原有值存在pc中;
否则pc自增。
4.设计signZeroExtend
由数据通路图可知,
输入信号为: immediate, ExtSel
输出信号为: out
符号扩展很简单,根据立即数的最高位进行补位:
如果立即数最高位为1,则前面全补1;
如果立即数最高位为0,则前面全补0.
5.设计DataMemory
由数据通路图可知,
输入信号为: Daddr, DataIn,RD,WR
输出信号为: DataOut
根据WR,RD判断数据的读写,然后执行相应的读写操作。
6.设计instructionMemory
由数据通路图可知,
instructionMemory
输入信号为: pc
输出信号为: op, rs, rt, rd, immediate,sa
每4行构成一个32位的指令,对照指令表便可写出来。
7.设计Regfile
由数据通路图可知,
输入信号为: clk, RegWre, RegOut, opCode, rs, rt, rd, im, ALUM2Reg,
dataFromALU, dataFromRW
输出信号为: Data1,Data2
下面列出测试指令列表:
在这里插入图片描述

8.编写顶层模块
定义各个模块的input与output,然后调用各个模块。
9.编写测试代码
由于输入只有clk与reset信号,所以测试文件中只需要输入这两个值即可。为了显示更多结果,我在测试文件中也添加了相应代码以方便模拟。

五、实验结果
1.仿真一个不少于4条指令的程序并解释结果
指令修改:
在这里插入图片描述

2.实验原理分析:
单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。时钟周期一般也称振荡周期(如果晶振的输出没有经过分频就直接作为CPU的工作时钟,则时钟周期就等于振荡周期。若振荡周期经二分频后形成时钟脉冲信号作为CPU的工作时钟,这样,时钟周期就是振荡周期的两倍。)

Addi:00000100 00000001 00000000 00000000
格式:
在这里插入图片描述

immediate符号位扩展再“加”运算 ,立即数扩展后加上rs地址上的值,若rs无赋值的话,则将立即数赋值给rt地址。

Add:00000000 00100010 00011000 00000000
格式:(0100)b + (1000)b 的结果 Result 存入地址为 00011 的寄存器
在这里插入图片描述

4+8=12
在这里插入图片描述

Sub:00001000 01000001 00100000 00000000
格式:将(1100)b-(0000)b 的结果 Result 存入地址为 00100 的寄存器
在这里插入图片描述

12-0=12
在这里插入图片描述

And:01000100 00100010 00101000 00000000
格式:将(0000)b and (1100)b 的结果 Result 存入地址为 00101 的寄存器
在这里插入图片描述

0与12得0
在这里插入图片描述

Or:01001000 00100010 00110000 00000000
格式:将(0000)b or (1100)b 的结果 Result 存入地址为 00110 的寄存器
在这里插入图片描述

0或12得12
在这里插入图片描述

六、问题思考
1.分析仿真结果的合理性与正确性。
利用了时钟周期,先设定指令的顺序,之后进行仿真:将数据写入寄存器之后进行
操作再送回到目的寄存器。一个时钟周期过后,上沿的时候取出新的指令再将操
作数送入之后进行新的指令的操作。

2.评价单周期指令对于设计与实现过程的优缺点。
优点:在一个周期内完成一系列操作,即执行多个指令;
缺点:若根据实际需要修改指令,必须需改复杂的指令代码,无法实现复杂的功能,顺序执行效率低缺乏灵活性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值