其他分享
首页 > 其他分享> > 动手写CPU----day2

动手写CPU----day2

作者:互联网

目录

一、五级流水线实现

1.大体框架

在这里插入图片描述
大体上分为两部分,一个是我们的CPU,另一个是ROM,用来存储我们的指令,等待读取,需要分布实现这两个模块

2.ROM

这个模块很简单,只需要提供三个接口

3.CPU

这个模块就是我们五级流水的重点了,day1里已经介绍了大体每个阶段的工作了,照着书写就可以了

在这里插入图片描述

二、MIPS架构

1.MIPS

MIPS架构是一种精简指令集(RISC:Reduced Instruction Set Computer)的处理器架构,包含大量的寄存器、指令数和字符。

具体指令合集可以看下面的连接
MIPS指令

2.实现ORI指令

在这里插入图片描述
简单说下,需要在两个module进行编写,

三、仿真结果

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的建立还是初级阶段,后续还有很多内容。。。

标签:译码,clk,day2,----,指令,模块,寄存器,rst,CPU
来源: https://blog.csdn.net/qq_37858023/article/details/116769133