杭电计组实验10-实现R-I-J型指令的CPU设计实验 下载本文

内容发布更新时间 : 2024/12/28 6:28:09星期一 下面是文章的全部内容请认真阅读。

实验报告

2018 年 6 月 9 日 成绩: 姓名 专业 任课老师 实验序号 实验时间 阳光男 学号 16041321 课程名称 张翔老师 班级 16052317 计算机科学与技术 张翔老师 10 2018/6/9 指导老师 实验名称 实验地点 《计算机组成原理与系统结构试验》 机位号 默认 《实验十 实现R-I-J型指令的CPU设计实验》 1教221 实验设备号 个人电脑、Nexys3开发板 一、实验程序源代码 顶层RI型指令CPU模块测试文件: module test; // Inputs reg rst; reg clk_100MHz; reg clk; // Outputs wire ZF; wire OF; wire [31:0] F; wire [31:0] M_R_Data; wire [31:0] PC; // Instantiate the Unit Under Test (UUT) TOP_RIJ_CPU uut ( .rst(rst), .clk_100MHz(clk_100MHz), .clk(clk), .ZF(ZF), .OF(OF), .F(F), .M_R_Data(M_R_Data), .PC(PC) ); initial begin // Initialize Inputs rst = 0; clk_100MHz = 0; clk = 0; // Wait 100 ns for global reset to finish #100; // Add stimulus here forever begin #2; clk=~clk; #10; clk_100MHz=~clk_100MHz; end end endmodule 顶层LED验证模块 module TOP_LED(clk_100MHz,oclk,rst,SW,LED); input clk_100MHz; input oclk,rst; input [3:0]SW; output reg[7:0]LED; wire rclk; wire ZF,OF; wire [31:0]F; wire [31:0]M_R_Data; wire [31:0]PC; xiaodou doudong(clk_100MHz,oclk,rclk); TOP_RIJ_CPU(rst,clk_100MHz,rclk,ZF,OF,F,M_R_Data,PC); always@(*) begin case(SW) 4'b0000:LED=F[7:0]; 4'b0001:LED=F[15:8]; 4'b0010:LED=F[23:16]; 4'b0011:LED=F[31:24]; 4'b0100:LED=M_R_Data[7:0]; 4'b0101:LED=M_R_Data[15:8]; 4'b0110:LED=M_R_Data[23:16]; 4'b0111:LED=M_R_Data[31:24]; 4'b1000:begin LED[7:2]=0;LED[1]=OF;LED[0]=ZF;end 4'b1100:LED=PC[7:0]; 4'b1101:LED=PC[15:8]; 4'b1110:LED=PC[23:16]; 4'b1111:LED=PC[31:24]; default:LED=0; endcase end endmodule 顶层RIJ型指令CPU验证模块: module TOP_RIJ_CPU(input rst,input clk_100MHz,input clk,output ZF, output OF,output [31:0]F,output [31:0]M_R_Data,output [31:0]PC); wire Write_Reg; wire [31:0]Inst_code; wire [4:0]rs; wire [4:0]rt; wire [4:0]rd; wire [31:0]rs_data; wire [31:0]rt_data; wire [31:0]rd_data; wire [31:0]imm_data;//被扩展的立即数 wire [15:0]imm; //wire rd_rt_s; wire [1:0]w_r_s; wire imm_s;//判断是否需要扩展 wire rt_imm_s;//B端选择rt或者是扩展后的imm wire Mem_Write; //wire alu_mem_s; wire [1:0]wr_data_s; wire [31:0]W_Addr; wire [31:0]W_Data; wire [31:0]R_Data_A; wire [31:0]R_Data_B; wire [31:0]F; wire [31:0]ALU_B;//B端口数据 wire [2:0]ALU_OP; wire [1:0]PC_s; wire [31:0]PC_new; wire [31:0]PC; wire [25:0]address; pc pc_connect(clk,rst,PC_s,R_Data_A,imm_data,address,Inst_code,PC); OP_YIMA op(Inst_code,ALU_OP,rs,rt,rd,Write_Reg,imm,imm_s, rt_imm_s,Mem_Write,address,w_r_s,wr_data_s,PC_s,ZF); assign W_Addr=(w_r_s[1])?5'b11111:((w_r_s[0])?rt:rd); assign imm_data=(imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm}; Register_file R_connect(rs,rt,W_Addr,Write_Reg,W_Data,clk,rst,R_Data_A,R_Data_B); assign ALU_B=(rt_imm_s)?imm_data:R_Data_B; ALU ALU_connect(R_Data_A,ALU_B,F,ALU_OP,ZF,OF); RAM_B Data_Mem ( .clka(clk_100MHz), // input clka .wea(Mem_Write), // input [0 : 0] wea .addra(F[5:0]), // input [5 : 0] addra .dina(R_Data_B), // input [31 : 0] dina .douta(M_R_Data) // output [31 : 0] douta ); assign W_Data=(wr_data_s[1])?PC_new:((wr_data_s[0])?M_R_Data:F); endmodule PC取指令模块: module pc(input clk,input rst,input [1:0]PC_s,input [31:0]R_Data_A, input [31:0]imm_data,input [25:0]address,output [31:0]Inst_code,output [31:0]PC); reg [31:0]PC; wire[31:0]PC_new; initial PC<=32'h00000000; Inst_ROM Inst_ROM1 ( .clka(clk), .addra(PC[7:2]), .douta(Inst_code) ); assign PC_new=PC+4; always@(negedge clk or posedge rst) begin if(rst) PC<=32'h00000000;