杭电计组实验报告10

  • 格式:docx
  • 大小:61.15 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计组实验十

老师:包健

一、源代码测试模块代码:

module Top(

inputinclk,

inputmem_clk,

inputrst,

outputreg[7:0] LED,

input [3:0] SW

);

wireclk;

MyButtonmb(

.clk_100MHz(mem_clk),

.BTN(inclk),

.BTN_Out(clk)

);

wire [31:0] ALU_F;

wire [31:0] M_R_Data;

wire ZF;

wire OF;

wire [31:0]PC;

My_I_CPUmy_i_cpu(

.clk(clk),

.mem_clk(mem_clk),

.rst(rst),

.ALU_F(ALU_F),

.M_R_Data(M_R_Data),

.ZFF(ZF),

.OF(OF),

.PC_out(PC)

);

always@(*)

begin

case(SW)

4'd0:LED=ALU_F[7:0];

4'd1:LED=ALU_F[15:8];

4'd2:LED=ALU_F[23:16];

4'd3:LED=ALU_F[31:24];

4'd4:LED=M_R_Data[7:0];

4'd5:LED=M_R_Data[15:8];

4'd6:LED=M_R_Data[23:16];

4'd7:LED=M_R_Data[31:24];

4'd8:LED={ZF,6'd0,OF};

4'd12:LED=PC[7:0];

4'd13:LED=PC[15:8];

4'd14:LED=PC[23:16];

4'd15:LED=PC[31:24];

default:LED=8'b0000_0000;

endcase

end

endmodule

顶层模块代码:

moduleMy_I_CPU(

inputclk,

inputmem_clk,

inputrst,

output [31:0] ALU_F,

output [31:0] M_R_Data,

output ZFF,

output OF,

output [31:0]PC_out

);

//wire clk_n = ~clk;

wire[31:0] codes;

wire [31:0]PC_new;

reg [31:0]PC;

Inst_Fetch1 inst_fetch(

.PC(PC),

.rst(rst),

.clk(clk),

.Inst_codes(codes),

.PC_new(PC_new)

);

wire[5:0] OP;

wire[5:0] func;

wire ZF;

assign ZFF=ZF;

assignPC_out=PC;

wire [1:0]w_r_s;

wireimm_s;

wirert_imm_s;

wire [1:0]wr_data_s;

wire[2:0] ALU_OP; wireWrite_Reg;

wireMem_Write;

wire [1:0]PC_s;

wire [15:0] imm;

wire [31:0] imm_data ; wire [25:0] address;

assign OP = codes[31:26]; assignfunc = codes[5:0]; assignimm = codes[15:0]; assign address=codes[25:0];

OP_Decoderop_decoder( .OP(OP),//input

.func(func),

.ZF(ZF),//input

.w_r_s(w_r_s),

.imm_s(imm_s),

.rt_imm_s(rt_imm_s),

.wr_data_s(wr_data_s),

.ALU_OP(ALU_OP),

.Write_Reg(Write_Reg),

.Mem_Write(Mem_Write), .PC_s(PC_s)

);

wire[4:0] rs;

wire[4:0] rt;

wire[4:0] rd;

assignrs = codes[25:21]; assignrt = codes[20:16]; assignrd = codes[15:11];

wire[4:0] W_Addr;

wire [31:0]W_Data;

wire [31:0]ALU_B;

assign W_Addr=(w_r_s[1])?5'b11111:((w_r_s[0])?rt:rd);

assign W_Data=(wr_data_s[1])?PC_new:((wr_data_s[0])?M_R_Data:ALU_F); assign imm_data = (imm_s)?{{16{imm[15]}},imm}:{{16{1'b0}},imm}; assign ALU_B =(rt_imm_s)?imm_data:R_Data_B;

always@(*)

begin

case(PC_s)

2'b00:PC=PC_new;

2'b01:PC=R_Data_A;

2'b10:PC=PC_new+(imm_data<<2);

2'b11:PC={PC_new[31:28],address,2'b00};

default:PC=PC_new;

endcase

end

wire [31:0]R_Data_A;

wire [31:0]R_Data_B;

RegisterHeapregister(

.R_Addr_A(rs),

.R_Addr_B(rt),

.W_Addr(W_Addr),

.Write_Reg(Write_Reg),

.Reset(rst),

.Clk(clk),

.W_Data(W_Data),

.R_Data_A(R_Data_A),

.R_Data_B(R_Data_B)

);

wire [31:0]ALU_A;

assign ALU_A = R_Data_A;

ALU alu(

.ALU_OP(ALU_OP),

.A(ALU_A),

.B(ALU_B),

.F(ALU_F),