从零开始实现一个基于RISC-V的流水线处理器 (4) :内部模块

内部模块设计

处理器内部模块的实现。难度是没有的,工作量是巨大的。话不多说,直接进入模块描述。

Decoder

查表法确定各指令的op,funct3,funct7,使用op和funct3无法判定的指令(add/sub srl/sra srli/srai)再用funct7进行判定。

自己定义一组alu_op,使每一条需要进行计算的指令都有对应的op,并把其送入ALU。

`timescale 1ns / 1ps

module decoder
 #(
    localparam INS_WIDTH    =    32,
    localparam JUMP_OP      =    7'b1101111,
    localparam BRANCH_OP    =    7'b1100011,
    localparam LOAD_OP      =    7'b0000011,
    localparam STORE_OP     =    7'b0100011,
    localparam I_TYPE_OP    =    7'b0010011,
    localparam R_TYPE_OP    =    7'b0110011,
    localparam BEQ_FUNCT    =    3'b000,
    localparam BNE_FUNCT    =    3'b001,
    localparam BLT_FUNCT    =    3'b100,
    localparam BGE_FUNCT    =    3'b101,
    localparam BLTU_FUNCT   =    3'b110,
    localparam BGEU_FUNCT   =    3'b111,
    localparam LW_FUNCT     =    3'b010,
    localparam LH_FUNCT     =    3'b001,
    localparam LB_FUNCT     =    3'b000,
    localparam SW_FUNCT     =    3'b010,
    localparam ADDI_FUNCT   =    3'b000,
    localparam SLTI_FUNCT   =    3'b010,
    localparam SLTIU_FUNCT  =    3'b011,
    localparam XORI_FUNCT   =    3'b100,
    localparam ORI_FUNCT    =    3'b110,
    localparam ANDI_FUNCT   =    3'b111,
    localparam SLLI_FUNCT   =    3'b001,
    localparam SRLI_FUNCT   =    3'b101,
    localparam SRAI_FUNCT   =    3'b101,
    localparam ADD_FUNCT    =    3'b000,
    localparam SUB_FUNCT    =    3'b000,
    localparam SLL_FUNCT    =    3'b001,
    localparam SLT_FUNCT    =    3'b010,
    localparam SLTU_FUNCT   =    3'b011,
    localparam XOR_FUNCT    =    3'b100,
    localparam SRL_FUNCT    =    3'b101,
    localparam SRA_FUNCT    =    3'b101,
    localparam OR_FUNCT     =    3'b110,
    localparam AND_FUNCT    =    3'b111,
    localparam SUB_SRA_FUNCT =   7'b0100000
  )
  (
    input      [31 : 0]    ins,
    input  reg [31 : 0]    rs1_data,
    input  reg [31 : 0]    rs2_data,
    output reg             J,
    output reg             JR,
    output reg             Branch,
    output reg             ram_read,
    output reg             ram_write,
    output reg             regs_write,
    output reg [1 : 0]     op_b_sel,
    output reg [1 : 0]     load_type,
    output reg [5 : 0]     alu_op
  );
//==========================================================
//==    op定义
//==========================================================
  wire [6 : 0] op,
               funct7;
  wire [2 : 0] funct3;
  assign op = ins[6 : 0];
  assign funct3 = ins[14 : 12];
  assign funct7 = ins[31 : 25];
//==========================================================
//==    Jump
//==========================================================
  assign J = op == JUMP_OP;
  assign JR = op == JR_OP;
//==========================================================
//==    Branch是否跳转的判断
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值