欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机组成原理-实验七-取指令与指令译码实验

程序员文章站 2022-03-17 14:29:15
...
一、实验要求

1)在Vivado中使用Memory IP核生成一个只读存储器Inst_ROM,作为指令存储器,并关联一个实验六所生成的*.coe文件。

2)编程实验取指令模块,调用Inst_ROM指令存储器模块。

3)编写一个实验验证的顶层模块。

二、配置IP核:

不多说,直接上图

计算机组成原理-实验七-取指令与指令译码实验

计算机组成原理-实验七-取指令与指令译码实验

三、实验代码

模块结构图

计算机组成原理-实验七-取指令与指令译码实验

取指令模块

`timescale 1ns / 1ps
//取指令模块
module Get_Inst(
    clk,clr,
    Inst_code,PC,PC_new,
    op_code,rs_addr,rt_addr,rd_addr,shamt,func
    );
    input clk;//时钟
    input clr;//清零
    
    output reg [31:0]PC;//地址
    output [31:0]PC_new;
    output [31:0]Inst_code;//取出的指令
    output [5:0]op_code,func;//指令分段
    output [4:0]rs_addr,rt_addr,rd_addr,shamt;//指令分段
    
    assign PC_new = PC+4;//组合逻辑电路,不需要时钟控制
    always @(negedge clk) 
    begin
        if(clr) PC<=32'h00000000;//清零
        PC = PC_new;//下降沿的时候,把PC_new赋值给PC
    end
    
    //实例化模块
    Inst_Rom Inst_Rom(
        .clka(clk),
        .addra(PC),
        .douta(Inst_code)
    );
    
    //指令分段
    assign op_code = Inst_code[31:26];
    assign rs_addr = Inst_code[25:21];
    assign rt_addr = Inst_code[20:16];
    assign rd_addr = Inst_code[15:11];
    assign shamt = Inst_code[10:6];
    assign func = Inst_code[5:0];
endmodule

顶层测试模块

`timescale 1ns / 1ps
//顶层测试模块
module Test();
    reg clk,clr;
    wire [31:0]PC,PC_new;//地址
    wire [31:0]Inst_code;
    wire [5:0]op_code;//指令分段
    wire [4:0]rs_addr,rt_addr,rd_addr,shamt;//指令分段
    wire [5:0]func;
    
    always #50 clk = ~clk;
    initial 
    begin
        clk = 1'b0;clr = 1'b1;#25;
        clr = 1'b0;
    end
    
    //实例化模块
    Get_Inst Get_Inst(
        clk,clr,
        Inst_code,PC,PC_new,
        op_code,rs_addr,rt_addr,rd_addr,shamt,func
        );
endmodule
四、实验验证

仿真波形图:

计算机组成原理-实验七-取指令与指令译码实验

电路图:

计算机组成原理-实验七-取指令与指令译码实验

电路图比波形图更加直观。可以看到PC是经过+4之后,放在PC_reg里面。PC_reg通过时钟控制,赋值给PC并且把值送入Inst_Rom里面。Inst_Rom取出指令后进行操作码分段。

五、心得体会
   配置IP核在实验六做过了,实验七难度不大,需要仔细思考的是PC_new和PC的处理。