您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 计算机组成CPU数据通路verilog实验报告
计算机组成与系统结构实验报告院(系):计算机科学与技术学院专业班级:学号:姓名:同组者:指导教师:实验时间:2012年5月23日实验目的:完成处理器的单周期cpu的设计。实验仪器:PC机(安装Altebra公司的开发软件QuartusII)一台实验原理:控制器分为主控制器和局部ALU控制器两部分。主控制器的输入为指令操作码op,输出各种控制信号,并根据指令所涉及的ALU运算类型产生ALUop,同时,生成一个R-型指令的控制信号R-type,用它来控制选择将ALUop输出作为ALUctr信号,还是根据R-型指令中的func字段来产生ALUctr信号。实验过程及实验记录:1.设计过程:第一步:分析每条指令的功能,并用RTL来表示。第二步:根据指令的功能给出所需的元件,并考虑如何将它们互连。第三步:确定每个元件所需控制信号的取值。第四步:汇总各指令涉及的控制信号,生成所反映指令与控制信号之间的关系图。第五步:根据关系表,得到每个控制信号的逻辑表达式,据此设计控制电路。2.完成代码的编写,并调试运行。1)controlmoduleControl(op,func,Branch,Jump,RegDst,ALUSrc,ALUctr,MemtoReg,RegWr,MemWr,ExtOp);input[5:0]op,func;outputregBranch,Jump,RegDst,ALUSrc,MemtoReg,RegWr,MemWr,ExtOp;outputreg[2:0]ALUctr;always@(op)case(op)6'b000000:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;MemtoReg=0;RegWr=1;MemWr=0;case(func)6'b100000:ALUctr=3'b001;6'b100010:ALUctr=3'b101;6'b100011:ALUctr=3'b100;6'b101010:ALUctr=3'b111;6'b101011:ALUctr=3'b110;endcaseend6'b001101:beginBranch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=0;RegWr=1;MemWr=0;ExtOp=0;ALUctr=3'b010;end6'b001001:beginBranch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=0;RegWr=1;MemWr=0;ExtOp=1;ALUctr=3'b000;end6'b100011:beginBranch=0;Jump=0;RegDst=0;ALUSrc=1;MemtoReg=1;RegWr=1;MemWr=0;ExtOp=1;ALUctr=3'b000;end6'b101011:beginBranch=0;Jump=0;ALUSrc=1;RegWr=0;MemWr=1;ExtOp=1;ALUctr=3'b000;end6'b000100:beginBranch=1;Jump=0;ALUSrc=0;RegWr=0;MemWr=0;ALUctr=3'b100;end6'b000010:beginBranch=0;Jump=1;RegWr=0;MemWr=0;endendcaseendmodule2)数据通路DataRoadmoduleDataRoad(Run,Clk,RegWr,MemWr,MemtoReg,RegDst,Branch,Jump,ExtOp,ALUctr,ALUSrc,busA,busB,busW,Instruction,Reg0,Reg1,Reg2,Reg3,Reg4,Mem1,Mem2,Mem3,Result,Im);inputRun,Clk,RegWr,MemWr,MemtoReg,RegDst,Branch,Jump,ExtOp,ALUSrc;input[2:0]ALUctr;output[31:0]Instruction,busA,busB,busW,Reg0,Reg1,Reg2,Reg3,Reg4,Mem1,Mem2,Mem3,Result,Im;wire[31:0]busC,DataOut;wire[15:0]im;wire[4:0]Rs,Rd,Rt;wireOverflow,Zero;QZLqzl(Clk,Branch,Jump,Zero,Instruction,Run);assignRs=Instruction[25:21];assignRt=Instruction[20:16];assignRd=Instruction[15:11];assignim=Instruction[15:0];Registerregister(Run,RegWr,Overflow,RegDst,Rd,Rs,Rt,busW,busA,busB,Clk,Reg0,Reg1,Reg2,Reg3,Reg4);ALUalu(busA,busC,ALUctr,Zero,Overflow,Result);DataMem(Run,MemWr,Clk,busB,DataOut,Result,Mem1,Mem2,Mem3);MUXmux1(ALUSrc,busB,Im,busC);MUXmux2(MemtoReg,Result,DataOut,busW);Extenderext(im,Im,ExtOp);endmodule3)取指令moduleQZL(Clk,Branch,Jump,Zero,Instruction,Run);inputClk,Branch,Jump,Zero,Run;output[31:0]Instruction;wire[4:0]addmem;reg[29:0]PC;wire[29:0]Newpc,pc_1,pc_2,pc_3,pc_12,imm30;wireBranch_Zero;assignaddmem={PC[2:0],2'b00};InsMemGetIns(addmem,Instruction);always@(negedgeClk)if(Run==1)beginPC=Newpc;endelsebeginPC=0;endassignpc_1=PC+1;assignimm30={{14{Instruction[15]}},Instruction[15:0]};assignpc_2=pc_1+imm30;assignpc_3={PC[29:26],Instruction[25:0]};assignBranch_Zero=Branch&Zero;MUXm1(Branch_Zero,pc_1,pc_2,pc_12);MUXm2(Jump,pc_12,pc_3,Newpc);endmodulemoduleInsMem(addmem,Instruction);input[4:0]addmem;outputreg[31:0]Instruction;reg[31:0]Mem[31:0];always@(*)beginMem[0]={6'b100011,5'b00000,5'b00001,5'b00000,5'b00000,6'b000001};Mem[4]={6'b100011,5'b00000,5'b00010,5'b00000,5'b00000,6'b000010};Mem[8]={6'b000000,5'b00001,5'b00010,5'b00011,5'b00000,6'b100000};Mem[12]={6'b101011,5'b00000,5'b00011,5'b00000,5'b00000,6'b000010};Mem[16]={6'b001101,5'b00100,5'b00100,5'b11111,5'b11111,6'b111111};Mem[20]={6'b000000,5'b00011,5'b00010,5'b00010,5'b00000,6'b100010};Mem[24]={6'b000100,5'b00010,5'b00001,5'b00000,5'b00000,6'b001000};Mem[28]={6'b000010,5'b00000,5'b00000,5'b00000,5'b00000,6'b000000};endalways@(*)Instruction=Mem[addmem];Endmodule4)ALUmoduleALU(A,B,ALUctr,Zero,Overflow,Result);parametern=32;input[n-1:0]A,B;input[2:0]ALUctr;outputZero,Overflow;output[n-1:0]Result;wireSUBctr,OVctr,SIGctr,SignA,SignB,Cin;wire[1:0]OPctr;wire[n-1:0]X,Y,Z,Less,M,N,Add_Result;wireAdd_Carry,Add_Overflow,Add_Sign;assignM={n{1'b0}};assignN={n{1'b1}};assignSUBctr=ALUctr[2];assignOVctr=!ALUctr[1]&ALUctr[0];assignSIGctr=ALUctr[0];assignOPctr[1]=ALUctr[2]&ALUctr[1];assignOPctr[0]=!ALUctr[2]&ALUctr[1]&!ALUctr[0];assignCin=SUBctr;assignX=B^{n{SUBctr}};assignY=A|B;Adderad(Cin,A,X,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero);assignSignA=Cin^Add_Carry;assignSignB=Add_Overflow^Add_Sign;assignOverflow=Add_Overflow&OVctr;MUXm1(SIGctr,SignA,SignB,Less);defparamm1.k=1;MUXm2(Less,M,N,Z);MUX3_1m3(Add_Result,Y,Z,Result,OPctr);endmodulemoduleMUX3_1(A,B,C,D,ctr);parameterk=32;input[k-1:0]A,B,C;outputreg[k-1:0]D;input[1:0]ctr;always@(AorBorCorctr)if(ctr==2'b00)D=A;elseif(ctr==2'b01)D=B;elseif(ctr==2'b10)D=C;endmodulemoduleAdder(Cin,X,Y,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero);parameterk=32;input[k-1:0]X,Y;inputCin;outputreg[k-1:0]Add_Result;outputAdd_Carry,Add_Overflow,Add_Sign,Zero;regAdd_Carry;assignZero=~|Add_Result;assignAdd_Sign=Add_Result[k-1];assignAdd_Overflow=(X[k-1]&Y[k-1]&~Add_Result[k-1])|(~X[k-1]&~Y[k-1]&Add_Result[k-1]);always@(XorYorCin){Add_Carry,Add_Result}=X+Y+Cin;Endmodule5)数据存数moduleDataMem(Run,MemWr,Clk,DataIn,DataOut,Adr,Mem1,Mem2,Mem3);inputRun,MemWr,Clk;input[31:0]DataIn,Adr;output[31
本文标题:计算机组成CPU数据通路verilog实验报告
链接地址:https://www.777doc.com/doc-4642137 .html