计算机组成原理-实验七-取指令与指令译码实验
一、实验要求1)在Vivado中使用Memory IP核生成一个只读存储器Inst_ROM,作为指令存储器,并关联一个实验六所生成的*.coe文件。2)编程实验取指令模块,调用Inst_ROM指令存储器模块。3)编写一个实验验证的顶层模块。二、配置IP核:不多说,直接上图三、实验代码模块结构图取指令模块`timescale 1ns / 1ps//取指令模块module Get_Inst(...
·
一、实验要求
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的处理。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)