MIPS处理器设计(1):支持9条指令的单周期处理器

这两天写完了一个 MIPS 的支持9条指令的单周期处理器。

简要说明

单周期的 Mips 处理器
只支持 add、sub、and、or、lw、sw、slt、beq、j 这9条指令

开发语言、工具和环境

采用 Verilog 语言开发
Window 10 环境下
使用了 Sublime Text + ModelSim 的方式进行开发(ModelSim 自带的编辑器真的难用一个tab竟然是8个空格啊啊啊啊啊)

具体设计

具体分为两大部分和处理器部分

datapath(数据通路)

定义了各种元部件

alu.v

模块名:alu
说明:算逻部件
输入接口:op(4位,运算符编码), a, b(32位,运算数)
输出接口:zero(结果是否为0), dout(32位,运算结果)
op的说明:
  0010: dout = a + b
  0110: dout = a - b
  0001: dout = a | b
  0000: dout = a & b
  0111: dout = a < b ? 1 : 0

dm.v

模块名:dm_4k
说明:数据寄存器,大小为4k(时钟上升沿触发)
输入接口:addr(10位,数据地址), din(32位,写数据时的数据端), we(写数据使能端), re(读数据使能端), clk(时钟端)
输出接口:dout(32位,读数据时的数据输出端)

ext.v

模块名:ext
说明:符号扩展部件(W 表示输入数据宽度)
输入接口:din(W 位)
输出接口:dout(32位)

im.v

模块名:im_4k
说明:指令存储器,大小为4k
输入接口:addr(10位,运算符编码)
输出接口:dout(32位,对应指令)

mux.v

模块名:mux2
说明:二路选择器(W 表示输入数据宽度)
输入接口:a, b(W 位,表示0和1对应的数据源), s(选择信号)
输出接口:dout(W 位,选择结果)

pc.v

模块名:pc
说明:程序计数器(时钟上升沿触发)
输入接口:clk(时钟端), rst(重置信号), data(32位,下一指令地址)
输出接口:dout(32位,当前指令地址)

regheap.v

模块名:regheap
说明:寄存器堆(时钟上升沿触发)
输入接口:clk(时钟端), we(写寄存器使能端), rreg1(5位,读寄存器1地址), rreg2(5位,读寄存器2地址), wreg(5位,写寄存器的地址), wdata(写入寄存器的数据)
输出接口:rdata1(32位,读寄存器1的数据), rdata2(32位,读寄存器2的数据)
另:有部分为方便测试而添加的初始化寄存器的值的代码。

control(控制信号)

解析指令,生成对应的控制信号

ALUctrl.v

模块名:ALUctrl
说明:算逻部件控制器
输入接口:ALUOp(2位), funct(6位,指令的5-0位)
输出接口:op(4位,对应的 alu 运算符编码)

ctrl.v

模块名:ctrl
说明:算逻部件控制器
输入接口:op(6位,指令的31-26位)
输出接口:RegDst, RegWrite, ALUSrc, MemRead, MemWrite, MemtoReg, Jump, Branch, ALUOp(各种控制信号,其中 ALUOp 为2位)

mips.v(处理器部分)

模块名:mips
说明:单周期处理器(时钟上升沿触发)
输入接口:clk(时钟端), rst(重置信号)

testbench.v(测试代码)

模块名:testbench
说明:生成时钟信号测试部件可行性

详见 Github