xx大学计算机原理 实验四 多周期MIPS CPU存储器实验预习报告文档格式.docx
《xx大学计算机原理 实验四 多周期MIPS CPU存储器实验预习报告文档格式.docx》由会员分享,可在线阅读,更多相关《xx大学计算机原理 实验四 多周期MIPS CPU存储器实验预习报告文档格式.docx(5页珍藏版)》请在冰豆网上搜索。
moduleregfile(rna,rnb,d,wn,we,clk,clrn,qa,qb);
input[4:
0]rna,rnb,wn;
input[31:
0]d;
inputwe,clk,clrn;
output[31:
0]qa,qb;
reg[31:
0]register[1:
31];
assign qa=(rna==0)0:
register[rna];
assign qb=(rnb==0)0:
register[rnb];
always@(posedgeclkornegedgeclrn)beginif(clrn==0)begin integeri;
for(i=1;
ia[4:
0];
4'
b1111:
cal=$signed(b)>
>
a[4:
endcaseendfunctionendmodule
其他部件:
modulef(reg_dest,jal,wn);
0]reg_dest;
input jal;
output[4:
0]wn;
assignwn=reg_dest|{5{jal}};
endmodule
modulesa(di,dot);
0]di;
0]dot;
assigndot={27'
b0,di};
moduleout4(out);
0]out;
assignout=32'
h4;
modulee(immin,sext,immediate,offset);
input[15:
0]immin;
inputsext;
0]immediate,offset;
wire e=sext&
immin[15];
wire[15:
0]imm={16{e}};
assignoffset={imm[13:
0],immin[15:
0],1'
b0,1'
b0};
assignimmediate={imm,immin[15:
0]};
modulexxbine(address,pc,add);
input[25:
0]address;
input[3:
0]pc;
0]add;
assignadd={pc[3:
0],address[25:
moduleconvert1(dain,sain,op,func,rs,rt,rd,imm,addr);
0]dain;
0]sain,rs,rt,rd;
output[5:
0]op,func;
output[15:
0]imm;
output[25:
0]addr;
assignsain={dain[10:
6]};
assignop={dain[31:
26]};
assignfunc={dain[5:
assignrs={dain[25:
21]};
assignrt={dain[20:
16]};
assignrd={dain[15:
11]};
assignimm={dain[15:
assignaddr={dain[25:
moduleconvert2(pc,pcout);
output[3:
0]pcout;
assignpcout={pc[31:
28]};
存储器内的测试数据:
--Copyright(C)1991-20XXAlteraCorporation
--YouruseofAlteraCorporation'
sdesigntools,logicfunctions--andothersoftwareandtools,anditsAMPPpartnerlogic--functions,andanyoutputfilesfromanyoftheforegoing--(includingdeviceprogrammingorsimulationfiles),andany--associateddocumentationorinformationareexpresslysubject--tothetermsandconditionsoftheAlteraProgramLicense--SubscriptionAgreement,AlteraMegaCoreFunctionLicense--Agreement,orotherapplicablelicenseagreement,including,--withoutlimitation,thatyouruseisforthesolepurposeof
--programminglogicdevicesmanufacturedbyAlteraandsoldby--Alteraoritsauthorizeddistributors.Pleaserefertothe--applicableagreementforfurtherdetails.
--QuartusIIgeneratedMemoryInitializationFile(.mif)
DEPTH=64;
%MemorydepthandwidtharerequiredWIDTH=32;
%Enteradecimalnumber ADDRESS_RADIX=HEX;
-dressandvalueradixesareoptionalDATA_RADIX=HEX;
%EnterBIN,DEC,HEX,orOCT;
unless %otherwisespecified,radixes=HEX
CONTENTBEGIN
[0..3F]:
00000000;
%Range--Everyaddressfrom0to3F=000000000:
3c010000;
%(00)main:
luir1,0#addressofdata[0]1:
34240080;
%(04)orir4,r1,0x80#addressofdata[0]2:
20XX0004;
%(08)addir5,r0,4#counter 3:
0c000018;
%(0c)call:
jalsum #callfunction4:
ac820XX0;
%(10)swr2,0(r4)#storeresult5:
8c890000;
%(14)lwr9,0(r4)#checksw6:
01244022;
%(18)subr8,r9,r4#sub:
r8>
16=ffff8000(arith)r8,r8,15#>
15=0001ffff(logic)finish#deadloop r8,r0,r0#sum r9,0(r4)#loaddata r4,4#address+4 r8,r8,r9#sum r5,-1#counter-1 r5,r0,loop#finish r2,r8,0#moveresulttov0r31#return %
%%%%%%%%%%%%%%%%%
六.EDA阶段的实验结果
仿真结果如上图。
七.测试时的电路总体结构及其说明
实验电路图
八.测试计划及其相关说明
输出说明:
于引脚及输出需要,故下表ir对应ir[31..0]且将显示高四位,pc对应pc[31..0]且将显示低两位,alu对应alu[31..0]且将显示低两位
输入clock mem_clk pc 输出alu ir clock 输入mem_clk pc 输出alu ir
九.关于实验电路设计的其他说明
于引脚及输出需要,故只输出ir、pc、aluir[31..0]切将显示ir高四位,pc[31..0]低两位,alu[31..0]低两位,q、adr、fromm、a、b、tom将不会输出
十.前期实验总结
本次实验,不仅加深了我对多周期CPU及存储器相关知识的理解,而且帮助自己回忆和复习了单周期CPU方面的知识,比如如何用VerilogHDL描述ALU模块、一些数据选择器、符号扩展电路、以及寄存器。
i<
32;
i=i+1) register[i]<
=0;
endelsebegin if((wn!
=0)&
&
(we==1)) register[wn]<
=d;
endendendmodule
32位四选一选择器:
modulemux4x32(a0,a1,a2,a3,s,y);
0]a0,a1,a2,a3;
input[1:
0]s;
0]y;
function[31:
0]select;
case(s) 2'
b00:
select=a0;
2'
b01:
select=a1;
b10:
select=a2;
b11:
select=a3;
endcaseendfunctionassigny=select(a0,a1,a2,a3,s);
//r1-r31//read//read
//reset
//write
5位二选一选择器:
modulemux2x5(a0,a1,s,y);
0]a0,a1;
inputs;
output[4:
assigny=sa1:
a0;
32位二选一选择器:
modulemux2x32(a0,a1,s,y);
存储器元件:
modulemcmem(clk,dataout,datain,addr,we,inclk,outclk);
0]datain;
inputclk,we,inclk,outclk;
0]dataout;
wire write_enable=we&
~clk;
lpm_ram_dqram
(.data(datain),.address(addr[7:
2]),.we(write_enable),.inclock(inclk),.outclock(outclk),.q(dataout));
defparam_width=32;
defparam_widthad=6;
defparam_indata=\defparam_outdata=\defparam_file =\defparam_address_control=\endmodule
控制部件:
modulemccu(op,func,z,clock,resetn,wpc,wir,wmem,wreg,iord,regrt,m2reg,aluc,shift,alusrca,alusrcb,pcsource,jal,sext,state);
input[5:
0]op,func;
inputz,clock,resetn;
outputregwpc,wir,wmem,wreg,iord,regrt,m2reg;
outputreg[3:
0]aluc;
outputreg[1:
0]alusrcb,pcsource;
outputregshift,alusrca,jal,sext;
outputreg[2:
0]state;
reg[2:
0]next_state;
parameter[2:
0]sif=3'
b000, //IFstate sid=3'
b001, //IDstate sexe=3'
b010, //EXEstate smem=3'
b011, //MEMstate swb=3'
b100;
//WBstatewirer_type,i_add,i_sub,i_and,i_or,i_xor,i_sll,i_srl,i_sra,i_jr;
wirei_addi,i_andi,i_ori,i_xori,i_lw,i_sw,i_beq,i_bne,i_lui,i_j,i_jal;
and(r_type,~op[5],~op[4],~op[3],~op[2],~op[1],~op[0]);
and(i_add,r_type,func[5],~func[4],~func[3],~func[2],~func[1],~func[0]);
and(i_sub,r_type,func[5],~func[4],~func[3],~func[2],func[1],~func[0]);
and(i_and,r_type,func[5],~func[4],~func[3],func[2],~func[1],~func[0]);
and(i_or,r_type,func[5],~func[4],~func[3],func[2],~func[1],func[0]);
and(i_xor,r_type,func[5],~func[4],~func[3],func[2],func[1],~func[0]);
and(i_sll,r_type,~func[5],~func[4],~func[3],~func[2],~func[1],~func[0]);
and(i_srl,r_type,~func[5],~func[4],~func[3],~func[2],func[1],~func[0]);
and(i_sra,r_type,~func[5],~func[4],~func[3],~func[2],func[1],func[0]);
and(i_jr,r_type,~func[5],~func[4],func[3],~func[2],~func[1],~func[0]);
and(i_addi,~op[5],~op[4],op[3],~op[2],~op[1],~op[0]);
and(i_andi,~op[5],~op[4],op[3],op[2],~op[1],~op[0]);
and(i_ori,~op[5],~op[4],op[3],op[2],~op[1],op[0]);
and(i_xori,~op[5],~op[4],op[3],op[2],op[1],~op[0]);
and(i_lw,op[5],~op[4],~op[3],~op[2],op[1],op[0]);
and(i_sw,op[5],~op[4],op[3],~op[2],op[1],op[0]);
and(i_beq,~op[5],~op[4],~op[3],op[2],~op[1],op[0]);
and(i_bne,~op[5],~op[4],~op[3],op[2],~op[1],op[0]);
and(i_lui,~op[5],~op[4],op[3],op[2],op[1],op[0]);
and(i_j,~op[5],~op[4],~op[3],~op[2],op[1],~op[0]);
and(i_jal,~op[5],~op[4],~op[3],~op[2],op[1],op[0]);
wirei_shift;
or(i_shift,i_sll,i_srl,i_sra);
always@*begin //controlsignals'
dfaultoutputs:
wpc=0;
//donotwritepcwir=0;
//donotwriteirwmem=0;
//donotwritememorywreg=0;
//donotwriteregisterfileiord=0;
//selectpcasmemoryaddressaluc=4'
bx000;
//ALUoperation:
addalusrca=0;
//ALUinputa:
regaorsaalusrcb=2'
h0;
//ALUinputb:
regbregrt=0;
//regdestno:
rdm2reg=0;
//selectregcshift=0;
//