系列文章目录
【北航计组】P3 单周期CPU
文章目录
前置技能
- 利用logisim绘制状态机
- 利用verilog编写状态机
- 利用MARS编写递归程序
一、CPU基本结构
单周期CPU基本结构如下所示:
上图CPU分为:取指模块、控制器、寄存器堆、运算模块、内存五个部分。
1. 取指模块
1.1 指令
在32位机中,每一条指令都由一个32位二进制数表示,占用4个字节。
例如 add $2, $0, $1 这条指令,意思是将寄存器0和寄存器1的值相加,结果存入寄存器2中。MARS会将它翻译成:其中31-26位和5-0位分别是,表示这条指令是加法指令;25-21,20-16,15-11位分别表示要操作的寄存器编号;对于加法指令,10-6位是空缺的,填充0。
其他指令也会按照类似的规则转化成32位二进制码,存在指令寄存器中。
详见 【北航计组】P3 pre 指令详解
1.2 取指令
当程序执行时,由程序计数器记录当前运行到第几条指令,然后从指令寄存器中取出对应的指令(一个32位数),传递给其他模块。
2. 控制器
控制器的功能是识别指令,并对其他模块发出信号。控制器通常要读取OpCode、Function部分,有时也需要rs、rt、rd、shamat部分。当OpCode(和Function等其他部分)的组合符合某一条指令时,控制器识别到这条指令,并发出各个模块执行这条指令所需要的信号。
例如,当OpCode = ,Function = 时,控制器识别到加法指令,然后发出RegWrite(写寄存器信号)给寄存器堆,add(加法指令信号)给运算模块,同时还要给需要用到的选择器发送信号,例如选择写入寄存器地址的选择器。
3. 寄存器堆
存储32个寄存器的值,在MIPS-C寄存器中,0号寄存器永远是0,无法被写入;31号寄存器是跳转地址寄存器,在jal指令时,存入指令地址。
寄存器堆有两个数据输出端、一个数据输入端。A1、A2、A3分别对应这三个端口的寄存器编号。
详见【北航计组】P3 pre 寄存器堆
4. 运算模块
支持加、减、移位等运算。读入两个数据,根据控制器的信号,做出对应的运算就可以了。
5. 内存
存储数据,支持内存与寄存器堆之间的读写。
二、CPU运行原理
最初,程序计数器内值为0x3000,即从这一条指令开始执行。
对于运算类指令
- 读取对应指令
- 在控制器译码
- 从寄存器堆取出所需数据
- 将数据送入运算模块执行对应运算
- 将结果写入寄存器堆
- 程序计数器+4(下一条指令的位置),返回1
例如:
对于分支指令
- 读取对应指令
- 在控制器译码
- 从寄存器堆取出所需数据
- 将数据送入运算模块执行对应运算
- 判断分支条件是否成立,若成立,程序计数器跳转到指定位置,否则程序计数器+4(下一条指令的位置),返回1
例如:
对于跳转指令
- 读取对应指令
- 在控制器译码
- 从寄存器堆取出所需数据
- 如果有写寄存器操作,需要将对应地址写入寄存器堆。
- 程序计数器跳转到指定位置,返回1
例如:
对于内存相关指令
- 读取对应指令
- 在控制器译码
- 从寄存器堆取出所需数据
- 将数据送入运算模块执行对应运算
- 读取或写入内存对应位置。如果是读内存指令,需要将读取的结果写入寄存器
- 程序计数器+4(下一条指令的位置),返回1
例如: