目录
一、五级流水线实现
1.大体框架
大体上分为两部分,一个是我们的CPU,另一个是ROM,用来存储我们的指令,等待读取,需要分布实现这两个模块
2.ROM
这个模块很简单,只需要提供三个接口
- 地址访问
- 使能
- 指令
3.CPU
这个模块就是我们五级流水的重点了,day1里已经介绍了大体每个阶段的工作了,照着书写就可以了
- 红线为不参与访问通用寄存器,为整个大体的流程,
- 蓝线是对通用寄存器进行读写的操作,取出操作数,要注意到虽然regfile模块有clk,但是只会在写寄存器的时候执行,对于读取寄存器的时候是不起作用的,不然会使得时序混乱,也就是regfile模块是组合逻辑和时序逻辑共存。
二、MIPS架构
1.MIPS
MIPS架构是一种精简指令集(RISC:Reduced Instruction Set Computer)的处理器架构,包含大量的寄存器、指令数和字符。
具体指令合集可以看下面的连接
MIPS指令
2.实现ORI指令
简单说下,需要在两个module进行编写,
- 第一是译码模块,译码的时候是需要读取操作数的,而输出的操作数只有两个,也就决定了我们这个指令需要输出,寄存器1的值和立即数到后续的执行模块进行执行,而输出的写地址用来保存我们的输出结果,同样要输出到执行模块
- 第二是执行模块,这里要将,立即数和寄存器1的值进行或操作,输出结果,同时保证写操作和前面的译码模块一致
三、仿真结果
1.先编写testbench文件,比较简单
`timescale 1ns/1ps
`include "defines.v"
module openmips_spoc_tb();
parameter T = 20;
reg clk;
reg rst;
//初始化时钟
initial begin
clk = 1'b0;
forever #(T/2) clk = ~clk;
end
//初始化openMips
initial begin
rst = `RstEnable;
#195 rst = `RstDisable;
#1000 $stop;
end
openmips_sopc u_openmips_sopc(
.clk (clk ),
.rst (rst )
);
endmodule
2.决定输入到ROM也就是存储器的指令
or $1,$0,0x1100
or $2,$0,0x0020
or $3,$0,0xff00
or $4,$0,0xffff
转为16进制如下
34011100
34020020
3403ff00
3404ffff
3.仿真结果
195ns时候拉低rst,停止复位,此时就开始工作了
取值阶段,第一个上升沿到来,开始读取ROM,也就是取值阶段开始了,可以看到34011100正是我们的第一条指令
译码阶段,下一个clk到达了,开始进入译码阶段,同时我们开始取第二条指令
这里讲解下译码的结果,id_reg1_o为0也就是$0寄存器内值为0,id_reg2_o的值为32’h00001100也就是进行了符号扩展的立即数,id_wreg_o为5’b00001也即是写到$1寄存器内
执行阶段到了,可以看到执行的结果为32’h00001100显然是正确的
访存阶段,不做啥处理,因为ORI指令不需要
回写阶段,写入到需要的寄存器$1,同时注意到蓝框内指令已经读取完毕了,我们目前虽然只完全执行玩了一条指令,但是其他指令也是在同步执行的,这样效率是非常高的,这也就是为什么采取流水线的设计原因。
最后的结果,显然结果都被写入了指定的寄存器,仿真测试完毕
到此CPU的建立还是初级阶段,后续还有很多内容。。。