这两天写完了一个 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
说明:生成时钟信号测试部件可行性