自己动手写CPU之第八阶段(3)——转移指令实现过程1

将陆续上传本人写的新书《自己动手写CPU》,今天是第35篇,我尽量每周四篇

开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20


转移指令的实现过程比较长,分两次介绍,今天是第一次


8.4 修改OpenMIPS以实现转移指令

8.4.1 修改取指阶段的PC模块

      参考图8-6可知,PC模块需要增加接口,增加的接口如表8-1所示。


      修改取指阶段的PC模块如下,主要修改一点:如果branch_flag_i为Branch,那么设置新的PC值为branch_target_address_i。完整代码位于本书附带光盘Code\Chapter8目录下的pc_reg.v文件。

module pc_reg(

  input	wire		        clk,
  input  wire                 rst,

  // 来自控制模块的信息
  input wire[5:0]             stall,

  // 来自译码阶段ID模块的信息
  input wire                  branch_flag_i,
  input wire[`RegBus]         branch_target_address_i,
	
  output reg[`InstAddrBus]    pc ,
  output reg                  ce
	
);

      ......

  always @ (posedge clk) begin
    if (ce == `ChipDisable) begin
       pc <= 32'h00000000;
    end else if(stall[0] == `NoStop) begin
       if(branch_flag_i == `Branch) begin
         pc <= branch_target_address_i;
       end else begin
         pc <= pc + 4'h4;
       end
    end
  end

endmodule

其中Branch是defines.v中给出的宏定义:
`define Branch     1'b1                // 转移
`define NotBranch  1'b0                // 不转移

8.4.2 修改译码阶段

      1、修改ID模块

      参考图8-6可知,ID模块需要增加一些接口,增加的接口描述如表8-2所示。


      在ID模块要增加对转移指令的分析,根据图8-3、8-4给出的转移指令格式可得,确定转移指令的过程如图8-7所示。


      其中涉及的宏定义如下,在本书附带光盘Code\Chapter8目录下的defines.v文件中可以找到这些定义。

`define EXE_J      6'b000010
`define EXE_JAL    6'b000011
`define EXE_JALR   6'b001001
`define EXE_JR     6'b001000
`define EXE_BEQ    6'b000100
`define EXE_BGEZ   5'b00001
`define EXE_BGEZAL 5'b10001
`define EXE_BGTZ   6'b000111
`define EXE_BLEZ   6'b000110
`define EXE_BLTZ   5'b00000
`define EXE_BLTZAL 5'b10000
`define EXE_BNE    6'b000101

此外,还新增如下宏定义,在实现转移指令时会使用到:
`
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值