系列文章目录 【北航计组】P3 单周期CPU
文章目录
- 系列文章目录
- 前置技能
- 一、CPU基本结构
-
- 1. 取指模块
-
- 1.1 指令
- 1.2 取指令
- 2. 控制器
- 3. 寄存器堆
- 4. 运算模块
- 5. 内存
- 二、CPU运行原理
-
- 对于运算类指令
- 对于分支指令
- 对于跳转指令
- 对于内存相关指令
- 三、电路图及详解
- 总结
前置技能
- 利用logisim绘制状态机
- 利用verilog编写状态机
- 利用MARS编写递归程序
上图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
三、电路图及详解 总结
推荐阅读
- 神经网络学习小记录|神经网络学习小记录62——Tensorflow2 利用efficientnet系列模型搭建yolov3目标检测平台
- 技术闲聊|emmet编辑a*5或 span*5,生成多个行内标签时,不会自动换行的解决方案
- vscode|windows操作系统下用vscode写C++
- 工具|我最终选择VS Code
- 解决VScode终端管理员运行问题
- java|2021亮点多多,2022继续改进,微软在Visual Studio Code上的Java有多努力
- VS|VS Code
- 如何用VSCode打开Visual Studio中建立的解决方案
- Arduino|VsCode Arduino生成[Error] Exit with code=1的解决方法