Abstract

支持 45 条 MIPS 指令的单周期处理器,不支持溢出

ADDU, SUBU, AND, OR, XOR, NOR, SLT, SLTU; ADDIU, SLTI, ALTIU, ANDI, ORI, XORI, LUI; SLL, SRL, SRA, SLLV, SRLV, SRAV; LW, SW, LB, LBU, SB; BEQ, BNE, BGEZ, BGTZ, BLEZ, BLTZ; J, JR, JALR, JAL; MULT; MFHI, MFLO, MTHI, MTLO; MFC0, MTC0; SYSCALL, ERET.

Instruction Set

Total: 36 + 9

StatusIns TypeopfuncALUctrCompareJumpRegDstALUSrcBALUSrcAMemtoRegRegWrMemWrImmExtCopWrByteExtiaddrtoNPCManInput_raddrManInput_shf
supportedaddu000000100001000000010000000100x00x00
supportedsubu000000100011000100010000000100x00x00
supportedand000000100100001000010000000100x00x00
supportedor000000100101001100010000000100x00x00
supportedxor000000100110010100010000000100x00x00
supportednor000000100111010000010000000100x00x00
supportedslt000000101010101100010000000100x00x00
supportedsltu000000101011101000010000000100x00x00
supportedaddiu001001x0000000001000001000000x00
supportedslti001010x1011000001000001000100x00
supportedsltiu001011x1010000001000001000000x00
supportedandi001100x0010000001000001000000x00
supportedori001101x0011000001000001000000x00
supportedxori001110x0101000001000001000000x00
supportedlui001111x0110000001100001000000x00x0x00000010
supportedsll000000000000011000010001000100x00x00
supportedsrl000000000010011100010001000100x00x00
supportedsra000000000011100000010001000100x00x00
supportedsllv000000000100011000010000000100x00x00
supportedsrlv000000000110011100010000000100x00x00
supportedsrav000000000111100000010000000100x00x00
supportedlw100011x00000000010001010001001100
supportedsw101011x000000x0100x000101001100
supportedlb100000x00000000010001010001000100
supportedlbu100100x00000000010001010001000000
supportedsb101000x000000000100x000101001000
supportedbeq000100xx10x0000x0000x00x00
supportedbne000101xx10x0000x0000x00x00
supportedbgez000001xx10x0000x0000x00x00
supportedbgtz000111xx10x0000x0000x00x00
supportedblez000110xx10x0000x0000x00x00
supportedbltz000001xx10x0000x0000x00x00
supportedj000010xx01xxxx0000x00x00
supportedjr000000001000x01xx00000000x00x00
supportedjalr000000001001x0101x00110100x00x00
supportedjal000011xx0110xx1101000000x0011111
StatusIns TypeopfuncALUctrCompareJumpRegDstALUSrcBALUSrcAMemtoRegRegWrMemWrImmExtCopWrByteExtiaddrtoNPC
supportedmult000000011000100100x0000x0000x00x00
supportedmfhi000000010000110100010000000100x00x00
supportedmthi000000010001111000xx00x0000x00x00
supportedmflo000000010010110000010000000100x00x00
supportedmtlo000000010011111100xx00x0000x00x00
supportedmfc0010000xx0000xx100100x00x00
supportedmtc0010000xx000000x000000x01x00
supportedsyscall000000001100x01xxx000000x01x01
supportederet010000011000x01xxx000000x01x01

Modules

整个 CPU 分为 Datapath(数据通路)Control(控制单元) 两大模块,其下共有 11 个子组件。

Datapath

PC

PC (Program Counter) – 指令计数器

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

信号名方向描述
clkI时钟信号
rstI复位信号
niaddrI下一条指令的地址
iaddrO当前需要执行的指令地址

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

NPC

NPC (Next PC) – 下指令部件

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

信号名方向描述
iaddrI当前需要执行的指令地址
branchI分支信号
jumpI跳转信号
insI指令信号
jiaddrI跳转地址
imm16II-指令的16位立即数
imm26IJ-指令的26位立即数
riaddrI返回的当前指令地址
niaddrO下一条指令的地址

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

DM

DM (Data Memeory)– 数据内存

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

信号名方向描述
addrI读/写数据地址
dinI内存写入总线
byteExtI字节控制信号
wEnI写使能信号
clkI时钟信号
doutO数据输出总线

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

IM

IM (Instruction Memory) – 指令内存

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

信号名方向描述
iaddrI当前需要执行的指令地址
insO指令输出

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

MUX

MUX (Multiplexer) – 选择器

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

信号名方向描述
aI选择输入信号 A(00)
bI选择输入信号 B(01)
cI选择输入信号 C(10)
dI选择输入信号 D(11)
ctrl_sI选通控制信号
doutO选择器输出

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

RF

RF (Register File) – 寄存器堆

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

信号名方向描述
busWI寄存器写入总线
clkI时钟信号
wEI写使能信号
rWI寄存器写入地址
rAI输出总线A读出的数据地址
rBI输出总线B读出的数据地址
busAO寄存器输出总线A
busBO寄存器输出总线B

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

ALU

ALU (Arithmetic Logic Unit) – 算术逻辑单元

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

信号名方向描述
ALUopI算术逻辑单元操作控制信号
aI输入总线A
bI输入总线B
clkI时钟信号
resultO输出总线

序号功能名称功能描述
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

EXT (Extender) – 扩展器

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

信号名方向描述
dinIX 位立即数
extOpI扩展器控制信号
doutO扩展器输出总线

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

COMP

COMP (Compare) – 比较器

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

信号名方向描述
dinAI输入总线 A
dinBI输入总线 B
insI指令信号
compareI比较信号
branchO分支信号

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

Coprocessor0RF

CoP0 (CoProcessor0) – 协处理器 0 寄存器堆

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

信号名方向描述
clkI时钟信号
dinI输入总线
wEnI写使能信号
regNumI读写地址
selI地址子号
npc_outI下地址指令地址输入总线
insI指令信号
doutO输出总线
expiaddrOEPC输出总线

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

Control

CTRL

CTRL (Controller) – 控制单元

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

信号名方向描述
insI当前需要执行的指令
compareI比较信号
branchO分支信号
jumpO跳转信号
regDstO寄存器写入地址控制信号
aluSrcAO算数逻辑单元输入控制信号 A
aluSrcBO算数逻辑单元输入控制信号 B
aluCtrO算术逻辑单元操作控制信号
regWrO寄存器写入使能信号
memWrO内存写入使能信号
immExtO扩展器控制信号
memtoRegO寄存器写入总线控制信号
copWrO协处理器 0 写入使能信号
byteExtO字节扩展信号
manInput_raddrO寄存器地址输入
manInput_shfO偏移量输入
iaddrtoNPCO指令地址选择信号

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

Code Repository

代码仓库。

Github: COExperiment_Repo

版权信息。

Copyright (c) 2017 TripleZ

Open source under the MIT License.


知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。