自己动手写CPU之第六阶段(3)——移动操作指令的实现

本文详细介绍了如何在OpenMIPS处理器中实现移动操作指令,包括HI、LO寄存器的实现,以及从译码阶段到回写阶段的修改过程,涉及ID模块、EX模块、EX/MEM模块、MEM模块、MEM/WB模块的更新。
摘要由CSDN通过智能技术生成

将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第22篇,我尽量每周四篇


6.3 修改OpenMIPS以实现移动操作指令

6.3.1 HILO寄存器的实现

      在HILO模块中实现HILO寄存器,HILO模块的接口描述如表6-1所示。


      HILO模块的代码如下,源文件是本书附带光盘Code\Chapter6目录下的hilo_reg.v。整个代码很简单:在时钟上升沿,如果复位信号无效,那么就判断输入的写使能信号we是否为WriteEnable,如果是WriteEnable,那么就将输入的hi_ilo_i的值,作为HILO寄存器的新值,并通过hi_olo_o接口输出。

module hilo_reg(

	input	wire		  clk,
	input  wire		  rst,
	
	// 写端口
	input wire		  we,
	input wire[`RegBus]	  hi_i,
	input wire[`RegBus]	  lo_i,
	
	// 读端口
	output reg[`RegBus]   hi_o,
	output reg[`RegBus]   lo_o
	
);

	always @ (posedge clk) begin
	  if (rst == `RstEnable) begin
		hi_o <= `ZeroWord;
		lo_o <= `ZeroWord;
	  end else if((we == `WriteEnable)) begin
		hi_o <= hi_i;
		lo_o <= lo_i;
	  end
	end

endmodule

6.3.2 修改译码阶段的ID模块

      在译码阶段要增加对移动操作指令的分析,根据图6-1给出的移动操作指令格式可知,这6条指令都是SPECIAL类指令,且6-10bit均为0,需要依据0-5bit的功能码确定指令,确定指令的过程如图6-6所示。


      其中涉及的宏定义如下,正是图6-1中各个指令的功能码。在本书附带光盘Code\Chapter6目录下的defines.v文件可以找到这些宏定义。

`define EXE_MOVZ  6'b001010
`define EXE_MOVN  6'b001011
`define EXE_MFHI  6'b010000
`define EXE_MTHI  6'b010001
`define EXE_MFLO  6'b010010
`define EXE_MTLO  6'b010011

      译码阶段的ID模块主要修改如下。完整代码位于本书附带光盘Code\Chapter6目录下的id.v文件。

module id(
  ......
);

  wire[5:0] op  = inst_i[31:26];
  wire[4:0] op2 = inst_i[10:6];
  wire[5:0] op3 = inst_i[5:0];
  wire[4:0] op4 = inst_i[20:16];
  ......
  
always @ (*) begin	
......
aluop_o     <= `EXE_NOP_OP;
  alusel_o    <= `EXE_RES_NOP;
  wd_o        <= inst_i[15:11];           // 默认目的寄存器地址wd_o
  wreg_o      <= `WriteDisable;
  instvalid   <= `InstInvalid;
  reg1_read_o <= 1'b0;
  reg2_read_o <= 1'b0;
  reg1_addr_o <= inst_i[25:21];           // 默认的reg1_addr_o
  reg2_addr_o <= inst_i[20:16];           // 默认的reg2_addr_o
  imm         <= `ZeroWord;
  case (op)
    `EXE_SPECIAL_INST:		begin      // 是SPECIAL类指令
        case (op2)
	   5'b00000:			begin      // op2为5'b00000
	     case (op3)
              ......
		`EXE_MFHI: begin               // mfhi指令
                  wreg_o      <= `WriteEnable;
                  aluop_o     <= `EXE_MFHI_OP;
                  alusel_o    <= `EXE_RES_MOVE; 
                  reg1_read_o <= 1'b0;
                  reg2_read_o <= 1'b0;
                  instvalid   <= `InstValid;	
                end
		`EXE_MFLO: begin               // mflo指令
                  wreg_o      <= `WriteEnable;
                  aluop_o     <= `EX E_MFLO_OP;
                  alusel_o    <= `EXE_RES_MOVE; 
                  reg1_read_o <= 1'b0;
                  reg2_read_o <= 1'b0;
                  instvalid   <= `InstValid;	
                end
		`EXE_MTHI: begin               // mthi指令
                  wreg_o      <= `WriteDisable;	
                  aluop_o     <= `EXE_MTHI_OP;
                  reg1_read_o <= 1'b1;
                  reg2_read_o <= 1'b0; 
                  instvalid   <= `InstValid;	
                end
		`EXE_MTLO: begin               // mtlo指令
                  wreg_o      <= `WriteD
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
《自己动手CPU(含CD光盘1张)》使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化,与教科书相似,便于使用其进行教学、学术研究和讨论,也有助于学生理解课堂上讲授的知识。实践版的设计目标是能完成特定功能,发挥实际作用。《自己动手CPU(含CD光盘1张)》分为三篇。第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令移动操作指令、算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。 《自己动手CPU(含CD光盘1张)》适合计算机专业的学生、FPGA开发人员、处理器设计者、嵌入式系统应用开发工程师、MIPS平台开发人员以及对处理器内部的实现感兴趣的读者阅读,也可以作为高等院校计算机原理、计算机体系结构等课程的实践参考书。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值