计算机组成与设计实验二:单周期CPU设计

此为中山大学17级计算机组成与设计实验课题。为不影响老师的教学,本文已经删去所有实现代码,完整含代码版本将在本学期结束时发布在我的个人博客https://wu-kan.cn/_posts/2018-11-23-单周期CPU设计/

实验目的

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

实验内容

设计一个单周期CPU,该CPU至少能实现以下指令功能操作,指令与格式如下。

算术运算指令

add rd rs rt

000000 rs(5位) rt(5位) rd(5位) reserved

功能:rd←rs + rt;reserved为预留部分,即未用,一般填“0”。

sub rd rs rt

000001 rs(5位) rt(5位) rd(5位) reserved

功能:rd←rs - rt。

addiu rt rs immediate

000010 rs(5位) rt(5位) immediate(16位)

功能:rt←rs + (sign-extend)immediate;immediate符号扩展再参加“加”运算。

逻辑运算指令

andi rt rs immediate

010000 rs(5位) rt(5位) immediate(16位)

功能:rt←rs & (zero-extend)immediate;immediate做“0”扩展再参加“与”运算。

and rd rs rt

010001 rs(5位) rt(5位) rd(5位) reserved

功能:rd←rs & rt;逻辑与运算。

ori rt rs immediate

010010 rs(5位) rt(5位) immediate(16位)

功能:rt←rs | (zero-extend)immediate;immediate做“0”扩展再参加“或”运算。

or rd rs rt

010011 rs(5位) rt(5位) rd(5位) reserved

功能:rd←rs | rt;逻辑或运算。

移位指令

sll rd rt sa

011000 未用 rt(5位) rd(5位) sa(5位) reserved

功能:rd<-rt<<(zero-extend)sa,左移sa位 ,(zero-extend)sa。

比较指令

slti rt rs immediate

011100 rs(5位) rt(5位) immediate(16位)

功能:if (rs< (sign-extend)immediate) rt =1 else rt=0, 带符号比较,详见ALU运算功能表。

存储器读/写指令

sw rt immediate(rs)

100110 rs(5位) rt(5位) immediate(16位)

功能:memory[rs+ (sign-extend)immediate]←rt;immediate符号扩展再相加。即将rt寄存器的内容保存到rs寄存器内容和立即数符号扩展后的数相加作为地址的内存单元中。

lw rt immediate(rs)

100111 rs(5位) rt(5位) immediate(16位)

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

分支指令

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位的,也就是以上说的“指令之间指令条数”。

bne rs rt immediate

110001 rs(5位) rt(5位) immediate(16位)

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

bltz rs immediate

110010 rs(5位) 00000 immediate(16位)

功能:if(rs<$zero) pc←pc + 4 + (sign-extend)immediate <<2 else pc ←pc + 4。

跳转指令

j addr

111000 addr[27:2]

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

停机指令

halt

111111 00000000000000000000000000(26位)

功能:停机;不改变PC的值,PC保持不变。

实验原理

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

CPU在处理指令的几个步骤

  • 26
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 单周期CPU是一种基本的计算机处理器结构,它的控制单元设计实验是为了验证控制单元能有效地控制各个硬件模块的工作。通过实验可以进一步加深对计算机体系结构和控制单元的理解。 单周期CPU的控制单元设计实验包括以下几个重要步骤: 1. 确定指令集:首先需要确定需要支持的指令集,例如R-type指令、I-type指令和J-type指令等。这样可以为后续的控制单元设计提供指令编码和解码的依据。 2. 设计状态机:根据指令集的特点,设计合适的状态机以控制指令的执行流程。状态机应包含各个指令的不同执行阶段,如取指、译码、执行和写回等。 3. 设计指令解码逻辑:根据指令集编码的规则,设计指令解码逻辑电路,将进制指令翻译成控制信号,以便对各个硬件模块进行控制。 4. 设计运算器:根据指令集的需求,设计合适的ALU(算术逻辑单元)以完成不同的运算操作,如加法、乘法、逻辑运算等。 5. 设计存储器接口:设计存储器接口,用于和内存单元进行数据的读取和写入。 6. 设计时钟和时序逻辑:设计时钟和时序逻辑,确保各个硬件模块的工作按照时序进行,保证指令的正确执行。 通过以上步骤的设计实验,可以较好地验证控制单元的正确性和可靠性。在实验过程中,可以使用硬件描述语言如Verilog或VHDL进行仿真和测试,确保控制单元的设计符合预期的功能和性能要求。 总之,单周期CPU控制单元的设计实验是一项重要的实践任务,能够帮助学习者深入理解计算机体系结构和控制单元的工作原理,提高其在计算机硬件设计领域的能力。 ### 回答2: 单周期CPU是一种基础的计算机系统,其关键组成部分是控制单元。在控制单元设计实验中,我们主要探讨了如何设计一个能够对CPU指令进行正确解码和执行的控制单元。 首先,我们需要了解指令的编码规则,即如何将不同的指令编码成进制形式。这样,我们才能根据指令的进制形式进行解码和执行。在实验中,我们使用了指令集体系结构(ISA)作为指令编码规则的参考。 其次,我们需要设计一个状态机,以控制指令的执行顺序。在单周期CPU中,每个指令的执行步骤是固定的,因此我们可以使用一个简单的状态机来控制指令的执行流程。这个状态机通常由几个状态和状态转移条件组成,每个状态对应着不同的指令执行步骤。 接下来,我们需要为每个指令设计一个解码电路。解码电路的作用是根据指令的进制编码确定指令的类型和需要执行的操作。我们可以使用多路选择器和逻辑门设计解码电路,通过将指令的进制编码作为输入,选择相应的控制信号来控制ALU、寄存器和存储器等组件的操作。 最后,我们需要将控制信号与组件连接起来,并设计一个指令执行的时钟信号来同步各个组件的操作。时钟信号可以确保每个指令的每个步骤在正确的时钟脉冲下进行,保证指令的顺序执行和正确性。 通过这个实验,我们可以更深入地了解计算机系统的基本原理和组成部分,掌握如何设计和实现一个简单的单周期CPU控制单元。这对于理解和研究更复杂的计算机体系结构和CPU设计具有重要意义。 ### 回答3: 单周期CPU控制单元的设计实验是通过仿真和测试的方式,来验证单周期CPU的控制单元的正确性和性能指标是否满足设计要求的实验。 在这个实验中,我们首先需要对单周期CPU的指令集和操作码进行定义和确认。然后,根据指令集的要求,设计出适当的控制信号和数据通路,使得CPU能够正确地执行指令。 接着,我们需要编写控制单元的Verilog代码,包括状态机的逻辑和控制信号的生成。在编写代码之前,需要仔细分析指令的执行流程和数据通路,确定各个状态之间的转移条件和信号的生成条件。 完成代码编写后,我们可以使用仿真工具进行验证。通过输入指令序列和初始化数据,观察CPU的各个寄存器、数据通路和指令执行的状态变化,来判断控制单元的功能是否正确。 在仿真过程中,我们还可以检查和修改代码,对可能存在的错误进行排查和修正。通过不断调试和测试,最终得到正确和可靠的控制单元。 最后,我们还可以通过性能评估来评估控制单元的性能指标。例如,可以计算每个指令的执行时间,指令的平均执行时间,以及各个指令在执行过程中所需的时钟周期数量等等。这些评估结果可以帮助我们检查CPU的性能和效率,是否满足设计要求。 通过这样的实验,我们可以验证单周期CPU控制单元的设计,确保其功能的正确性和性能的可靠性。同时,实验还能帮助我们深入理解CPU的工作原理和实现细节,提升我们的设计和调试能力。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值