[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 |
由指令产生控制信号 |
通过输入的指令分析出需要执行的操作,输出相应的控制信号 |