1)在Vivado中使用Memory IP核生成一个只读存储器Inst_ROM,作为指令存储器,并关联一个实验六所生成的*.coe文件。
2)编程实验取指令模块,调用Inst_ROM指令存储器模块。
3)编写一个实验验证的顶层模块。
不多说,直接上图
模块结构图
取指令模块
`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取出指令后进行操作码分段。
