[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 |
做乘法 |
根据操作控制信号,将输入两数的相乘结果保存至 HI 和 LO 寄存器中 |
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 |
由指令产生控制信号 |
通过输入的指令分析出需要执行的操作,输出相应的控制信号 |