[TOC]

Datapath

PC

PC 的主要功能是输出当前指令地址并保存下一条指令的地址,复位后,PC指向 0x0000_3000,这是第一条指令所在地址。

信号名 方向 描述
clk I 时钟信号
rst I 复位信号
niaddr I 下一条指令的地址
iaddr O 当前需要执行的指令地址

序号 功能名称 功能描述
1 复位 当复位信号有效时,PC被设置成0x0000_3000(ModelSim) / 0x0000_0000(On board)
2 保存 NPC 并退出 在每个时钟上升沿保存 NPC,并将其输出

NPC

根据当前指令地址以及判断信号来计算下一指令地址。

信号名 方向 描述
iaddr I 当前需要执行的指令地址
branch I 分支信号
jump I 跳转信号
ins I 指令信号
jiaddr I 跳转地址
imm16 I I-指令的16位立即数
imm26 I J-指令的26位立即数
riaddr I 返回的当前指令地址
niaddr O 下一条指令的地址

序号 功能名称 功能描述
1 下一指令地址 将指令地址移至下一条指令
2 分支地址跳转 当分支信号和判零标志有效时,使用I-指令中的16位立即数做逻辑扩展,使其扩展成30位,再将地址乘4,得到需要跳转的分支地址并将其输出
3 绝对地址跳转 当跳转信号有效时,使用J-指令中的26位立即数,根据跳转指令类型将其进行不同种的拼接并将其输出
4 返回指令地址 将当前指令地址进行输出

DM

数据内存,在程序运行中提供数据交换空间。

信号名 方向 描述
addr I 读/写数据地址
din I 内存写入总线
byteExt I 字节控制信号
wEn I 写使能信号
clk I 时钟信号
dout O 数据输出总线

序号 功能名称 功能描述
1 写入数据 当写使能信号有效时,在每个时钟上升沿将写入总线的数据写进相应内存地址中
2 读出数据 将指定地址的数据通过数据输出总线进行输出
3 读/写字节数据 当字节控制信号有效时,根据输入的数据地址来寻找相应的字节进行读/写操作

IM

指令内存,用于存储程序运行指令。

信号名 方向 描述
iaddr I 当前需要执行的指令地址
ins O 指令输出

序号 功能名称 功能描述
1 写入指令 使用 $readmemh 函数将 code.txt 中的指令写入指令内存中
2 读出指令 根据得到的指令地址从指令内存中读出相应的指令数据

MUX

选择器,根据选通信号输出选定的输入值。

信号名 方向 描述
a I 选择输入信号 A(00)
b I 选择输入信号 B(01)
c I 选择输入信号 C(10)
d I 选择输入信号 D(11)
ctrl_s I 选通控制信号
dout O 选择器输出

序号 功能名称 功能描述
1 选择输出 A 当选通控制信号为00时,选择器输出输入信号 A
2 选择输出 B 当选通控制信号为01时,选择器输出输入信号 B
3 选择输出 C 当选通控制信号为10时,选择器输出输入信号 C
4 选择输出 D 当选通控制信号为11时,选择器输出输入信号 D

RF

寄存器单元,用于存储程序临时数据。

信号名 方向 描述
busW I 寄存器写入总线
clk I 时钟信号
wE I 写使能信号
rW I 寄存器写入地址
rA I 输出总线A读出的数据地址
rB I 输出总线B读出的数据地址
busA O 寄存器输出总线A
busB O 寄存器输出总线B

序号 功能名称 功能描述
1 写入数据 当写使能信号有效时,在每个时钟上升沿根据写入地址写入寄存器数据
2 读出数据 根据 A / B 数据地址读出相应的寄存器数据并通过输出总线 A / B 输出

ALU

算术逻辑单元,可完成加减与或比较等操作。

信号名 方向 描述
ALUop I 算术逻辑单元操作控制信号
a I 输入总线A
b I 输入总线B
clk I 时钟信号
result O 输出总线

序号 功能名称 功能描述
1 做加法 根据操作控制信号,通过输出总线输出输入两数之和
2 做减法 根据操作控制信号,通过输出总线输出输入两数之差
3 按位与 根据操作控制信号,通过输出总线输出输入两数的按位与结果
4 按位或 根据操作控制信号,通过输出总线输出输入两数的按位或结果
5 按位或非 根据操作控制信号,通过输出总线输出输入两数的按位或非结果
6 按位异或 根据操作控制信号,通过输出总线输出输入两数的按位异或结果
7 逻辑左移 根据操作控制信号,通过输出总线输出输入 B 数逻辑左移 A 位的结果
8 逻辑右移 根据操作控制信号,通过输出总线输出输入 B 数逻辑右移 A 位的结果
9 算术右移 根据操作控制信号,通过输出总线输出输入 B 数算术右移 A 位的结果
10 做乘法 根据操作控制信号,将输入两数的相乘结果保存至 HILO 寄存器中
11 无符号比较 根据操作控制信号,若输入总线 A 的数值小于总线 B 的数值,则为真,否则为假
12 带符号比较 根据操作控制信号,若输入总线 A 的带符号数值小于总线 B 带符号的数值,则为真,否则为假
13 读取 LO 值 根据操作控制信号,通过输出总线输出 LO 寄存器的数值
14 读取 HI 值 根据操作控制信号,通过输出总线输出 HI 寄存器的数值
15 写入 HI 值 根据操作控制信号,在时钟上升沿来临时将输入总线 A 的数值 写入 HI 寄存器中
16 写入 LO 值 根据操作控制信号,在时钟上升沿来临时将输入总线 A 的数值 写入 LO 寄存器中

EXT

扩展器,可将 X 位立即数扩展成为 32 位数。

信号名 方向 描述
din I X 位立即数
extOp I 扩展器控制信号
dout O 扩展器输出总线

序号 功能名称 功能描述
1 逻辑扩展 当控制信号无效时,对输入的立即数逻辑扩展为 32 位
2 算术扩展 当控制信号有效时,对输入的立即数算术扩展为 32 位

COMP

比较器,判断是否需要条件转移。

信号名 方向 描述
dinA I 输入总线 A
dinB I 输入总线 B
ins I 指令信号
compare I 比较信号
branch O 分支信号

序号 功能名称 功能描述
1 条件跳转 根据当前指令信号,判断是否需要进行条件跳转,并通过分支信号输出

Coprocessor0RF

协处理器 0 寄存器堆, 用于存储 CPU 状态信息。

信号名 方向 描述
clk I 时钟信号
din I 输入总线
wEn I 写使能信号
regNum I 读写地址
sel I 地址子号
npc_out I 下地址指令地址输入总线
ins I 指令信号
dout O 输出总线
expiaddr O EPC输出总线

序号 功能名称 功能描述
1 写入数据 当写使能信号有效时,在每个时钟上升沿根据写入地址写入寄存器数据
2 读出数据 根据读数据地址读出相应的寄存器数据并通过输出总线输出
3 系统调用 将当前指令地址值写入EPC寄存器中,更改 Status 寄存器并使指令地址跳转到例外入口地址
4 异常返回 将EPC寄存器的数值输出至下地址逻辑,并更改Status寄存器

Control

CTRL

控制模块,通过解析指令信息来产生相应的控制信号执行指令。

信号名 方向 描述
ins I 当前需要执行的指令
compare I 比较信号
branch O 分支信号
jump O 跳转信号
regDst O 寄存器写入地址控制信号
aluSrcA O 算数逻辑单元输入控制信号 A
aluSrcB O 算数逻辑单元输入控制信号 B
aluCtr O 算术逻辑单元操作控制信号
regWr O 寄存器写入使能信号
memWr O 内存写入使能信号
immExt O 扩展器控制信号
memtoReg O 寄存器写入总线控制信号
copWr O 协处理器 0 写入使能信号
byteExt O 字节扩展信号
manInput_raddr O 寄存器地址输入
manInput_shf O 偏移量输入
iaddrtoNPC O 指令地址选择信号

序号 功能名称 功能描述
1 由指令产生控制信号 通过输入的指令分析出需要执行的操作,输出相应的控制信号