数电-cpu设计精简指令集RISC32位单周期_第1页
数电-cpu设计精简指令集RISC32位单周期_第2页
数电-cpu设计精简指令集RISC32位单周期_第3页
数电-cpu设计精简指令集RISC32位单周期_第4页
数电-cpu设计精简指令集RISC32位单周期_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精简指令集(RISC)32位单周cpu设电气513CPUCPUCPU

010123 S

ASADoADoSe<< 总体电寄存器堆(RegisterFiles)、取指电路及相关基础部件(如选择器)等构成。MIPS指令格R

26 21I

26 21 16 J

26 R[10:I设置JJRop0func指定。rsrt是源寄存器号,rd是目的寄sa指定移位位数。I1632位,依指令的不同需进行零扩展J26数据路径设下一条指令地址的选42位的和;j262PC+4的4位拼接在一起。3-34012A3Be在图3-3中控制器(ControlUnit)根据op、funczero(对于beqbne指令)信pcsource。ALU的输入ALU2个:AB输入端。A、B2种输入情况。对于A输入端,有寄存器堆的A_data和移位数sa输入。对于B输入端,有寄存器堆的B_dataimm3-4所示ABeAB3-4ALUALUA、B端具体输入哪路数据由控制器(ControlUnit)根据指令译码产生控shiftaluimm来选择。寄存器堆的输入A_addrB_addr的输入来自指令,分别只有一种输入,W_addrData43-5ABABfAreget、jalm2reg来选择。在图3-5中模块f的输入为5位的寄存器号reg_dest和jalW_addrVerilogHDL语句为:AssignW_addr=reg_dest|基本功能部件的设计与实在本实验中基本功能部件主要有:3221多路选择器、3241器、521多路选择器、D32位加/3221选择器的设计与CPU的重要部件。32214-1所示。

Sel=0:O=ASel=1:O=moduleinputmoduleinput[31:0]input[31:0]B, output[31:0]OassignO=Sel?B:A;

4-132214-9MUX32_2_13241选择器的设计与32414-18MUMU

Sel[1:0]=00:O=Sel[1:0]=01:O=BSel[1:0]=10:O=

Sel[1:0]=11:O=4-183241324132213241modulemoduleinput[31:0]input[31:0]input[31:0]input[31:0]input[1:0]Sel,output[31:0]OassignO=(Sel==2'b00)?A:(Sel==2'b01)?B:(Sel==2'b10)?C:D; 521选择器的设计与实5214-19

Sel=0:O=ASel=1:O=4-195215213221521modulemoduleinput[4:0]input[4:0]B,inputSel,output[4:0]OassignO=Sel?B:A;带有异步清零的32D触发器的设计与实3221选择Verilog实现代码:modulemoduleinput[31:0]D, outputreg[31:0]Qalways@(posedgeClockornegedgeReset)beginif(Reset==0)Q<=0; Q<=移位器的3221Verilogmodulemoduleinput[31:0]input[4:0]Sa, outputreg[31:0]Oalways@(*)if(!Right) O=D<<Sa;elseif(!Arith)O=D>> O=$signed(D)>>>Sa;32位加/减法器的设计与实32位加/32位的加法/A

A(B)

ABVerilogmodulemoduleinput[31:0]input[31:0]B, output[31:0]Resultcla32cla32as32(A,B^{32{sub}},sub,moduleinput[31:0]input[31:0]b, output[31:0]sassigns=a+b+c;运算器(ALU)的设计与实运算器ALU是CPU组成的部件之一,其实现方法主要有2种:一种是以加法5-15-1:ALULui(设置ALU5-15-1

A:操作数,32

5-1ALU

B:操作数,32Zero:零标志,1位;当运算结010;NewSource命令,选VerilogModule输入,并输入Verilog文件名:ALU,单击Next按钮进入端口定义对ALUVerilog程序参考代码:modulemoduleinput[31:0]input[31:0]input[3:0]output[31:0]Result, wire[31:0]d_and=A&B;wire[31:0]d_or=A|B;wire[31:0]d_xor=A^wire[31:0]d_lui=wire[31:0]d_and_or=ALU_Operation[2]?d_or:d_and;wire[31:0]d_xor_lui=ALU_Operation[2]?d_lui:d_xor;wire[31:0]d_as,d_sh;addsub32as32(A,B,ALU_Operation[2],d_as);Shiftershift_1(B,A[4:0],ALU_Operation[2],ALU_Operation[3],d_sh);MUX32_4_1sel(d_as,d_and_or,d_xor_lui,d_sh,ALU_Operation[1:0],assignZero=~|Result;寄存器堆(RegisterFile)的设计与实6-1所示。

6-1RegisterFile6-11个数据输入端口,2个数据输出端口,因此可以从该寄存器组中同时输出2个数据由于没有设置读信号故在本实验中当A_addr(或B_addr)0时,并不是选择输出Register0的内容,而是直接输出06-1中各信号引脚的功A_addr:A输出端口地址,5B_addr:B输出端口地址,5W_addr:数据写入的寄存器号,5Write:写信号,1Data:数据,32A_data:A端口的输出数据,32B_data:B端口的输出数据,32ClockNewSource命令,选ModuleName栏输入模块名:RegFileNextFinishRegisterFilesVerilog module input[4:0]A_addr,input[4:0]B_addr,input[4:0]W_addr,input[31:0]Data, output[31:0]A_data,output[31:0]reg[31:0]//ReadassignA_data=(A_addr==0)?0:Register[A_addr];assignB_data=(B_addr==0)?0:Register[B_addr];//Writedataintegeri;always@(posedgeClockornegedgeReset)beginif(Reset==0)beginfor(i=1;i<=31;i=i+1)Register[i]<=0;endelseif((Write)&&(W_addr!=0))Register[W_addr]<=控制器(ControlUnit)的设计与实7-5-17-1z:运算结果为零,1op[5:0]:指令操作码,6func[5:0]:指令功能码,6wmem:写器,1位,为1时写器,否则不写,输出wreg:写寄存器,11regrtrt,11rtrtm2reg:器数据写寄存器信号,1位,为1选择器数据,否则t选ALUshift:ALUA端口使用移位位数,11时使用移位位数,否则使用寄jal:子程序调用,11jalsext:立即数符号扩展,11aluc[3:0]:ALU操作控制码,4pcsource[1:0]:下一条指令地址选择,2NewSource命令,选定义框。其中ModuleName栏输入模块名Control_Unit,单击Next进入下一步,FinishControl_UnitVerilog程序参考代码:moduleinput[5:0]input[5:0]func, outputoutputm2reg,output[3:0]aluc,output output[1:0]pcsource, //Registerwirei_add=(op==6'b000000&func==6'b100000)?1:0;wirei_sub=(op==6'b000000&func==6'b100010)?1:0;wirei_and=(op==6'b000000&func==6'b100100)?1:0;wirei_or=(op==6'b000000&func==6'b100101)?1:0;wirei_xor=(op==6'b000000&func==6'b100110)?1:0;wirei_sll=(op==6'b000000&func==6'b000000)?1:0;wirei_srl=(op==6'b000000&func==6'b000010)?1:0;wirei_sra=(op==6'b000000&func==6'b000011)?1:0;wirei_jr=(op==6'b000000&func==6'b001000)?1:0;//immediatewirei_addi=(op==6'b001000)?1:0;wirei_andi=(op==wirei_ori=(op==6'b001101)?1:0;wirei_xori=(op==6'b001110)?1:0;wirei_lw=(op==6'b100011)?1:0;wirei_sw=(op==6'b101011)?1:0;wirei_beq=(op==6'b000100)?1:0;wirei_bne=(op==6'b000101)?1:0;wirei_lui=(op==wirei_j =(op==6'b000010)?1:0;//jwirei_jal=(op==6'b000011)?1:0;////Createcontrolassignwreg=i_add|i_sub|i_and|i_or|i_xor|i_sll|i_srl|i_sra|i_addi|i_andi|i_ori|i_or|i_xori|i_lw|i_lui|i_jal;assignregrt=i_addi|i_andi|i_ori|i_xori|i_lw|i_lui;assignjal =i_jal;assignm2reg=assignshift=i_sll|i_srlassignaluimm=i_addi|i_andi|i_ori|i_xori|i_lw|i_lui|i_sw;assignsext=i_addi|i_lw|i_sw|i_beq|assignaluc[3]=assignaluc[2]=i_sub|i_or|i_srl|i_sra|i_ori|i_lui;assignaluc[1]=i_xor|i_sll|i_srl|i_sra|i_xori|i_beq|i_bne|assignaluc[0]=i_and|i_or|i_sll|i_srl|i_srai_andi|i_ori;assignwmem =i_sw; source[1]=i_jr|i_j| source[0]=i_beq&z|i_bne&~z|i_j|i_jal;Verilog实现代码中,首先对指令的功能进行译码,以“i_”开头的变(addassignregrt=i_addi|i_andi|i_ori|i_xori| |i_xori(立即数异或、i_lw(取整数数据字)或i_lui(设置)功能时控制信号regrt1。aluc[3:0]5-1CPU的封CPUCPUCPU8-1

8-1CPU8-1CPUClock:输入,1Reset:输入,1Inst[31:0]:输入,32位,CPUMem[31:0]:输入,32pc[31:0]:输入,32wmem:输出,1位,器写信号Result[31:0]:输出,32Data[31:0]:输出,32Bmodule input[31:0]inputmodule input[31:0]input[31:0]output[31:0]pc, output[31:0]Result,output[31:0]Datawire[31:0]p4,adr, ,res,ra,alu_mem,alua,alub;wire[4:0]reg_dest,wn;wire[3:0]wire[1:0]wirezero,wreg,regrt,wire[31:0]sa={27'b0,wire[31:0]offset={imm[13:0],inst[15:0],dff32ip( ,Clock,Reset,pc);cla32pcplus4(pc,32'h4,1'b0,p4);cla32br_adr(p4,offset,1'b0wire[31:0]jpc={p4[31:28],Control_UnitCU(inst[31:26],inst[5:0],shift,aluimm,pcsource,jal,sext);wiree=sext&inst[15];wire[15:0]imm={16{e}};wire[31:0]immdiate{imminst[15:0]};//RegFilerf(Clock,Reset,inst[25:21],inst[20:16],wn,res,wreg,ra,Data);MUX32_2_1alu_a(ra,sa,shift,alua);MUX32_2_1alu_b(Data,immdiate,aluimm,alub);ALUalu(alua,alub,aluc,Result,MUX5_2_1MUX5_2_1reg_wn(inst[15:11],inst[20:16],regrtassignwn=reg_dest|MUX32_2_1res_mem(Result,mem,m2reg,alu_mem);MUX32_2_1link(alu_mem,p4,jal,res);MUX32_4_1nextpc(p4,adr,ra,jpc,pcsource 测当CPU设计完成后,还需要对其进试,为此需要再设计一个指令器和一个数据器,同时再设计相应的测试程序。指令器及测试程moduleinput[31:0]output[31:0]wire[31:0]ramassignram[5'h00]=32'h3c011234;//luiR1,0x1234assignram[5'h01]=32'h34215678;//oriR1,R1,0x5678assignram[5'h02]=32'h3C02AAAA;//luiR2,0xaaaaassignram[5'h03]=32'h3442BBBB;//oriR2,R2,0xbbbbassignram[5'h04]=32'h00221820;//addR3,R1,R2assignram[5'h05]=32'h00221822;//subR3,R1,R2assignram[5'h06]=32'h00221824;//andR3,R1,R2assignram[5'h07]=32'h00221825;//orR3,R1,R2assignram[5'h08]=32'h00221826;//xorR3,R1,R2assignram[5'h09]=32'h00021900;//sllR3,R2,4assignram[5'h0a]=32'h00021902;//srlR3,R2,4assignram[5'h0b]=32'h00021903;//srlR3,R2,4assignram[5'h0c]=32'h20231234;//addiR3,R1,0x1234assignram[5'h0d]=32'h302300EF;//andiR3,R1,0xefassignram[5'h0e]=32'h342300EF;//oriR3,R1,0xefassignram[5'h0f]=32'h382300EF;//xoriR3,R1,0xefassignram[5'h10]=32'h00631826;//xorR3,R3,R3assignram[5'h11]=32'hAC610001;//swR1,1(R3)assignassignram[5'h12]=32'h90650001;//lwR5,1(R3)assigninst=ram[address[6:2]];数据器及测试数modulemodule output[31:0]dataout,input[31:0]datain,input[31:0]addr, reg[31:0]ramassigndataout=always@(posedgeClock)if(we)ram[addr[6:2]]=integerinitialfor(i=0;i<=31;i=i+1)ram[i]=i*仿真测图9-1CPU、指令器和数据器连到开发板验Switch[1:0]:输出内容选择,00–显示执行指令,01–pc,10–显示ALU运算结果,11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论