动手写CPU----day2

目录

一、五级流水线实现

1.大体框架

动手写CPU----day2
大体上分为两部分,一个是我们的CPU,另一个是ROM,用来存储我们的指令,等待读取,需要分布实现这两个模块

2.ROM

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

  • 地址访问
  • 使能
  • 指令

3.CPU

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

  • 红线为不参与访问通用寄存器,为整个大体的流程,
  • 蓝线是对通用寄存器进行读写的操作,取出操作数,要注意到虽然regfile模块有clk,但是只会在写寄存器的时候执行,对于读取寄存器的时候是不起作用的,不然会使得时序混乱,也就是regfile模块是组合逻辑和时序逻辑共存。

动手写CPU----day2

二、MIPS架构

1.MIPS

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

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

2.实现ORI指令

动手写CPU----day2
简单说下,需要在两个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,停止复位,此时就开始工作了
动手写CPU----day2
取值阶段,第一个上升沿到来,开始读取ROM,也就是取值阶段开始了,可以看到34011100正是我们的第一条指令
动手写CPU----day2
译码阶段,下一个clk到达了,开始进入译码阶段,同时我们开始取第二条指令
这里讲解下译码的结果,id_reg1_o为0也就是$0寄存器内值为0,id_reg2_o的值为32’h00001100也就是进行了符号扩展的立即数,id_wreg_o为5’b00001也即是写到$1寄存器内
动手写CPU----day2
执行阶段到了,可以看到执行的结果为32’h00001100显然是正确的
动手写CPU----day2
访存阶段,不做啥处理,因为ORI指令不需要
动手写CPU----day2
回写阶段,写入到需要的寄存器$1,同时注意到蓝框内指令已经读取完毕了,我们目前虽然只完全执行玩了一条指令,但是其他指令也是在同步执行的,这样效率是非常高的,这也就是为什么采取流水线的设计原因。
动手写CPU----day2
最后的结果,显然结果都被写入了指定的寄存器,仿真测试完毕
动手写CPU----day2
到此CPU的建立还是初级阶段,后续还有很多内容。。。

上一篇:[CISCN2019 华北赛区 Day2 Web1]Hack World


下一篇:leetcode刷题day2