内容案例教案_第1页
内容案例教案_第2页
内容案例教案_第3页
内容案例教案_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

5CPU2019年6月6I/OVerilogquartus20MIPS5段流水CPU设计。采用I/O统一编址方式,即将输入输出的I/O地址空间,作为数据存I/OlwDE2实验板上的按键等输入设备信息。即将外部设备状态,读到CPU内部寄存器。利用设计的I/O端口,通过sw指令,输出对DE2实验板上的LED从CPU内部的寄存器,写入到外部设备的相应控制寄存器(或可直利用自己编写的程序代码,在自己设计的CPU上,实现对板载输入LED7段LED数码管显示出来。4bit4bit二进制输入相加,利用两LED10进制形式显示“和”等(具体任务形式不做MIPS20供以上两种指令集(MIPS和Y86)应用功能的程序设计代码,并提DE1-SOC就能够实现一个5段流水CPU。首先我仔细观察了5段流水线的CPU设flush信号,清10pipepcpipepc模块的主要作用是在时钟上升沿时,将下一条指令的地址( 写入pc。为IF阶段从instructionrom正确的下一条指令做准备。当resetn信号下降沿时,需要将pc复位到-4。需要注意的是,wpcir为低电平时,代表流水线因为lw指令发生了数据,需要插入一条nop指令。对 modulepipepc(,wpcir,clock,resetn,pc [31:0] clock,resetn output[31:0] [31:0] always@(negedgeresetnorposedge if(resetn== pc<= if(wpcir!=pc; 18pipeifpipeif模块的主要作用就是根据pc值取出下一条指令。总体的代码与单周期cpu中的非常相似。其中 _mux需要的四个信号产生在流水线需要注意的是mem_clock与单周期cpu有较大区别。因为需要给pc信号 modulepipeif(pcsource,pc,bpc,da,jpc,,pc4,ins,mem_clock [31:0]pc,bpc,jpc, output[31:0],pc4,ins6 [31:0],pc4,ins mux4x32_mux(pc4,bpc,da,jpc,pcsource, assignpc4=pc+ sc_instmemimem(pc,ins,mem_clock11pipeirpipeir模块就是IF/ID阶段的段间寄存器。在时钟上升沿处写入寄存时,flush为高电平,需要清空这一条读入的指令。1modulepipeir(pc4,ins,wpcir,flush,clock,resetn,dpc4,inst2 pc4,ins3wpcir,flush,clock,resetn4outputdpc4,inst56 dpc4,inst7 always@(posedgeclockornegedge if(resetn== dpc4<= inst<= if(wpcir!= dpc4<= if(flush==0)inst<= elseinst<= 23pipeid及控制信号的产生。从寄存器堆中取数据与单周期cpu较为类似(时钟信号需要注意。pipeif3pc的来源(bpc,jpc,da)也在而cu才是关键中的关键,需要用来管理等操作。我在着手编写程所有的控制信号都应该与wpcirwpcir信号为低电判断数据时,需要辨别当前的指令是r型、i型还是j型,它们指fwdafwdb的表达式可以通过分析,直接通过组合逻辑给出,不一定要按课件的伪代码一样通过if判断。按照上述思路,完成cu的编写后,pipeid模块中其他部分并不, modulepipeid(mwreg,mrn,ern,ewreg,em2reg,mm2reg,dpc4, wrn,wdi,ealu,malu,mmo,wwreg,clock, bpc,jpc,pcsource,wpcir,flush,dwreg,dm2reg,dwmem, daluimm,da,db,dimm,drn,dshift,djal56mrn,ern,7mm2reg,em2reg,mwreg,ewreg,wwreg,clock,8inst,wdi,ealu,malu,mmo, output[31:0]bpc,dimm,jpc,da, output wpcir,flush,dwreg,dm2reg,dwmem,daluimm,dshift,djal;q1,q2,da,fwda,rsrtequ=(da==regrt,e=sext&instdimm={{16{e}},jpc={dpc4[31:28],inst[25:0],1’offset={{14{e}},inst[15:0],1’bpc=dpc4+reg_clock= regfilerf(inst[25:21],inst[20:16],wdi,wrn,wwreg,reg_clock,resetn,q1,q2); mux4x32da_mux(q1,ealu,malu,mmo,fwda,da mux4x32db_mux(q2,ealu,malu,mmo,fwdb,db mux2x5rn_mux(inst[15:11],inst[20:16],regrt,drn sc_cucu(inst[31:26],inst[5:0],rsrtequ,dwmem,dwreg,regrt,dm2reg,daluc,dshift,daluimm,pcsource,djal,sext,wpcir,flush,inst[25:21],inst[20:16],mrn,mm2reg,mwreg,ern,em2reg,ewreg,fwda,fwdb);32cucpu中提供的代码完1modulesc_cu(op,func,rsrtequ,wmem,wreg,regrt,m2reg,aluc,shift aluimm,pcsource,jal,sext,wpcir,flush,rs,rt,mrn,mm2reg,mwreg,ern,em2reg,ewreg,fwda, assignwpcir=~(em2reg&(~(i_j|i_jal)&(r_type&ern==rt|ern==rs)));5 assignflush=(i_beq&rsrtequ)|(i_bne&~rsrtequ7 assignpcsource[1]=i_jr|i_j|i_jal assignpcsource[0]=(i_beq&rsrtequ)|(i_bne&~rsrtequ)||i_jal assignwreg=wpcir&(i_add|i_sub|i_and|i_or|i_xor i_sll|i_srl|i_sra|i_addi|i_andi i_ori|i_xori|i_lw| | assignaluc[3]=wpcir& assignaluc[2]=wpcir&(i_sub|i_or|i_lui|i_srl|i_sra| assignaluc[1]=wpcir&(i_xor|i_lui|i_sll|i_srl|i_sra| assignaluc[0]=wpcir&(i_and|i_or|i_sll|i_srl|i_sra|i_andi|i_ori); assign =wpcir&(i_sll|i_srl| assignaluimm=wpcir&(i_addi|i_andi|i_ori|i_xori|i_lw| assign =wpcir&(i_addi|i_lw|i_sw|i_beq| assignwmem=wpcir& assignm2reg=wpcir& assignregrt =wpcir&(i_addi|i_andi|i_ori|i_xori|i_lw| =wpcir& assignfwda[1]=~(ewreg&(ern!=0)&(ern==rs)&~em2reg)&(mwreg&(mrn!=0)&(mrn==rs)); assignfwda[0]=(ewreg&(ern!=0)&(ern==rs)&~em2reg)|(mwreg&(mrn!=0)&(mrn==rs)&mm2reg); assignfwdb[1]=~(ewreg&(ern!=0)&(ern==rt)&~em2reg)&(mwreg&(mrn!=0)&(mrn==rt)); assignfwdb[0]=(ewreg&(ern!=0)&(ern==rt)&~em2reg)|(mwreg&(mrn!=0)&(mrn==rt)&mm2reg);32pipederegpipederegID/EX段间寄存器,并无值得赘述的部分,完全就pipeexe1modulepipeexe(ealuc,ealuimm,ea,eb,eimm,eshift,ern0,epc4,ejalern,ealu [31:0]ea,eb,eimm, ealuimm,eshift,ejal output[31:0] output [31:0]a,b,r [31:0]epc8=epc4+ [4:0]ern=ern0| mux2x32a_mux(ea,eimm,eshift,a mux2x32b_mux(eb,eimm,ealuimm,b mux2x32ealu_mux(r,epc8,ejal,ealu al_unit(a,b,ealuc,r15pipeemregpipeemregEX/MEM段间寄存器,同样没有值得赘述的部分,pipememipemem经完成了IO唯一值得注意的就是时钟信号,此前实验的代码中write_enable=we也就是clock下降沿处。因此,在写入时,恰好write_enable也处于跳变过 问题。因此只要简单地令write_enable=we即可,这样做的一个前提是,we50MHz的频率下并不构除此以外,sc_datamem模块及其调用的模块与单周期实验中完全相1modulepipemem(resetn,mwmem,malu,mb,clock,mem_clock,mmo,in_port0,in_port1,in_port2,out_port0,out_port1,out_port2);2mwmem,clock,3 malu,mb,in_port0,in_port1,45outputmmo,out_port0,out_port1,6mem_clock= sc_datamemdmem(resetn,malu,mb,mmo,mwmem,mem_clock,in_port0,in_port1,in_port2,out_port0,out_port1,8pipemwregpipemwregMEM/WB由于I/O部分的代码与上次实验中完全相同,因此不再一一展示。直接进入

温馨提示

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

评论

0/150

提交评论