logo资料库

计算机组成原理实验课程设计.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
西南交通大学计算机组成原理实验课程设计 一、CPU 模块 Verilog HDL 代码 module CPU ( // 清零信号 // 时钟信号 // 指令 input reset, input clock, input [7:0] M_data_in, output reg [7:0] M_data_out, // 运算溢出信号 output reg overflow, output reg Write_Read, // 读写信号 output reg [11:0] M_address, // 指令地址 output reg [7:0] R_0,R_1,R_2,R_3 // 输出到内存单元的数据 ); // 通用寄存器组 reg [7:0] R0; reg [7:0] R1; reg [7:0] R2; reg [7:0] R3; // 指令寄存器 reg [15:0] IR; // 程序计数器 reg [11:0] PC; // 内存数据寄存器 reg [7:0] MDR; // 内存地址寄存器 reg [11:0] MAR; // 操作数和被操作数寄存器 reg [7:0] A; // 操作码寄存器 reg [3:0] OP; // 状态寄存器 reg [3:0] state; // 临时寄存器 reg [8:0] Temp; always @ (reset or state) begin M_address = MAR; M_data_out = MDR; end always @ (posedge clock) begin R_0=R0;
R_1=R1; R_2=R2; R_3=R3; end // 指令读取分析执行 always @ (posedge clock) begin if(reset==0) // PC,IR,MDR,MAR 寄存器清零 begin PC=0; IR=0; MAR=0; MDR=0; R0=0; R1=0; R2=0; R3=0; state=0; OP=0; end begin case(state) // 0 状态取指令,提取操作码 0: begin Write_Read=1'b0; PC=PC+1; MAR=PC; IR={M_data_in,8'b00000000}; OP=IR[15:12]; case(IR[9:8]) 0:A=R0; 1:A=R1; 2:A=R2; 3:A=R3; endcase state=1; end // 1 状态分析操作码 1: begin Write_Read=1'b0; case(OP) 0:begin state=0; end 1:begin R0={4'b0000,IR[11:8]}; state=0; end // 立即数寻址 2:begin // Move // PC+1
case(IR[11:10]) 0:R0=A; 1:R1=A; 2:R2=A; 3:R3=A; endcase state=0; end 3:begin // ADD case(IR[11:10]) 0:begin Temp={R0[7],R0}+{A[7],A}; R0=Temp[7:0]; end 1:begin Temp={R1[7],R1}+{A[7],A}; R1=Temp[7:0]; end 2:begin Temp={R2[7],R2}+{A[7],A}; R2=Temp[7:0]; end 3:begin Temp={R3[7],R3}+{A[7],A}; R3=Temp[7:0]; end endcase if(Temp[8]^Temp[7]) // 判断溢出 else overflow=1; overflow=0; state=0; end 4:begin // Sub case(IR[11:10]) 0:begin Temp={R0[7],R0}-{A[7],A}; R0=Temp[7:0]; end 1:begin Temp={R1[7],R1}-{A[7],A}; R1=Temp[7:0]; end 2:begin Temp={R2[7],R2}-{A[7],A}; R2=Temp[7:0]; end 3:begin Temp={R3[7],R3}-{A[7],A}; R3=Temp[7:0]; end endcase if(Temp[8]^Temp[7]) // 判断溢出 else overflow=1; overflow=0; state=0; end 5:begin // AND case(IR[11:10]) 0:R0=R0&A; 1:R1=R1&A; 2:R2=R2&A; 3:R3=R3&A; endcase state=0; end 6:begin // OR
case(IR[11:10]) 0:R0=R0|A; 1:R1=R1|A; 2:R2=R2|A; 3:R3=R3|A; endcase state=0; end 7:begin // XOR case(IR[11:10]) 0:R0=R0^A; 1:R1=R1^A; 2:R2=R2^A; 3:R3=R3^A; endcase state=0; end 8:begin // Shr case(IR[11:10]) 0:R0={1'b0,R0[7:1]}; 1:R1={1'b0,R1[7:1]}; 2:R2={1'b0,R2[7:1]}; 3:R3={1'b0,R3[7:1]}; endcase state=0; end 9:begin //Shl case(IR[11:10]) 0:R0={R0[6:0],1'b0}; 1:R1={R1[6:0],1'b0}; 2:R2={R2[6:0],1'b0}; 3:R3={R3[6:0],1'b0}; endcase state=0; end 10:begin // Swap case(IR[11:8]) 0:R0=R0; 1:R1=R0; 2:R2=R0; 3:R3=R0; 4:R0=R1; 5:R1=R1; 6:R2=R1;
7:R3=R1; 8:R0=R2; 9:R1=R2; 10:R2=R2; 11:R3=R2; 12:R0=R3; 13:R1=R3; 14:R2=R3; 15:R3=R3; endcase case(IR[11:10]) 0:R0=A; 1:R1=A; 2:R2=A; 3:R3=A; endcase state=0; end 11:begin // Jmp state=2; end 12:begin end 13:begin end 14:begin end 15:begin // Jz state=2; // Read state=2; // Write state=2; // Stop state=1; end endcase end 2:begin Write_Read=1'b0; MDR=R0; PC=PC+1; state=3; case(OP) 11:begin // Jmp IR[7:0]=M_data_in; MAR=IR;
end 12:begin // Jz if(R0==0) begin IR[7:0]=M_data_in; MAR[11:0]=IR[11:0]; end else MAR[11:0]=PC; end 13:begin // Read IR[7:0]=M_data_in; MAR=IR; end 14:begin // Write PC=MAR; IR[7:0]=M_data_in[7:0]; MAR[11:0]=IR[11:0]; end endcase end 3:begin Write_Read=1'b0; case(OP) 11:begin // Jmp PC=IR[11:0]; state=0; end 12:begin // Jz if(R0==0) PC=IR[11:0]; state=0; end 13:begin // Read MAR=PC; state=4; end 14:begin // Write Write_Read=1'b1; MAR=PC; state=4; end endcase end
Write_Read=1'b0; if(OP==13) R0=M_data_in; state=0; 4:begin end endcase end end endmodule 二、顶层原理图 三、MIF 文件
分享到:
收藏