目录
单周期CPU的设计
- 本实例所设计CPU的指令格式的拟定;
- 基本功能部件的设计与实现;
- CPU各主要功能部件的设计与实现;
- CPU的封装;
- 对各个单元组合而成的CPU进行指令测试,配合使用模拟仿真,了解指令和数据在各个单元中的传输过程及方向。
至少支持add、sub、and、or、addi、andi、ori、lw、sw、beq、bne和j十二条指令。
- 操作系统:Win 10;
- 开发平台:Vivado 2019.2;
- 编程语言:VerilogHDL硬件描述语言
单周期(Single Cycle)CPU是指CPU从取出1条指令到执行完该指令只需1个时钟周期。电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。时钟周期一般也称振荡周期(如果晶振的输出没有经过分频就直接作为CPU的工作时钟,则时钟周期就等于振荡周期。若振荡周期经二分频后形成时钟脉冲信号作为CPU的工作时钟,这样,时钟周期就是振荡周期的两倍。)
-
- MIPS指令格式
MIPS指令系统结构有MIPS-32和MIPS-64两种。本实验的MIPS指令选用MIPS-32。以下所说的MIPS指令均指MIPS-32。MIPS的指令格式为32位,以下为MIPS指的3种格式。
R型指令的op均为0,具体操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。移位指令中使用sa指定移位位数。
I型指令的低16位是立即数,计算时需扩展到32位,依指令的不同需进行零扩展和符号扩展。
J型指令的低26位是地址,是用于产生跳转的目标地址。
本实验中共需要完成12条指令,其中R指令4条,I指令7条,J指令1条,他们的指令结构如下图所示:
R型指令 |
|||||||
指令 |
[31:26] |
[25:21] |
[20:16] |
[15:11] |
[10: 6] |
[5:0] |
功能 |
Add |
000000 |
rs |
rt |
rd |
000000 |
100000 |
寄存器加 |
Sub |
000000 |
rs |
rt |
rd |
000000 |
100010 |
寄存器减 |
And |
000000 |
rs |
rt |
rd |
000000 |
100100 |
寄存器与 |
Or |
000000 |
rs |
rt |
rd |
000000 |
100101 |
寄存器或 |
I型指令 |
|||||||
Addi |
001000 |
rs |
rt |
immediate |
立即数加 |
||
Andi |
001100 |
rs |
rt |
immediate |
立即数与 |
||
Ori |
001101 |
rs |
rt |
immediate |
立即数或 |
||
Lw |
100011 |
rs |
rt |
offset |
取数据 |
||
Sw |
101011 |
rs |
rt |
offset |
存数据 |
||
Beq |
000100 |
rs |
rt |
offset |
相等转移 |
||
Bne |
000101 |
rs |
rt |
offset |
不等转移 |
||
J型指令 |
|||||||
J |
000010 |
address |
跳转 |
单周期CPU指从取出一条指令到执行该条指令只需要一个时钟周期。整个过程可以分为:取指、译码、执行、访问、写回,这五个阶段(并不是所有指令都会完全执行这五个阶段)
- 取指令(IF):根据程序计数器PC中的指令地址,从指令存储器中取出一条指令,同时PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。
- 指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,由指令的[15-12]位产生相应的操作控制信号,用于驱动执行状态中的各种操作。
- 指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。
- 存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。
- 结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。
CPU的电路包括数据路径(Data path)和控制部件(Control Unit)两大部分。下面先给出单周期CPU的总体设计图,再分别介绍每个路径和控制部件的设计。
-
- PC寄存器
存储下一条要执行指令的地址。对于单周期CPU存储的是当前执行指令的地址。
为实现稳定输出,在时钟信号的上升沿更新,而且需要一个控制信号,在控制信号为0的时候初始化PC寄存器,即全部置零。
Clk:时钟周期,输入信号
Reset:控制信号,输入信号