Verilog中的流水线MIPS处理器(第3部分)
应用介绍
此项目是Verilog中的流水线MIPS处理器(第3部分)。
该项目将展示32位流水线MIPS处理器的Verilog代码。 在第2部分中,我介绍了单周期MIPS数据路径的所有Verilog代码。在这一部分中,添加了流水线寄存器以完成流水线MIPS处理器。 将提供完整的32位流水线MIPS处理器的Verilog代码。在将流水线寄存器,转发单元,停顿控制单元和刷新控制单元添加到单周期数据路径后。 转发,停转控制和冲洗控制单元旨在解决流水线MIPS处理器中的数据并控制危害。
转发单元:
转发单元旨在解决流水线式MIPS处理器中的数据危险。 当检测到数据危险时,ALU输出上的正确数据将转发到ALU输入。 当前指令的源寄存器与上一条指令的目标寄存器相同时,将检测到数据危害。添加转发单元以解决数据危险后,ALU输入处的2x32至32多路复用器将变为3x32至32多路复用器。
失速控制单元:
当前读取存储指令的目标寄存器与ID阶段中下一指令的源寄存器相同时,会发生需要暂停1个周期的数据危险,但XORI和LW指令的ID_rt除外(其中 Rt是目标寄存器,而不是XORI和LW的源寄存器)。
冲洗控制单元:
冲洗控制单元旨在解决控制危险,当执行跳转指令时,它将丢弃IF和ID阶段的指令。
附件文件中包括:转发单元的Verilog代码、多路复用器的Verilog代码、失速控制单元的Verilog代码、冲洗控制单元的Verilog代码、WB_Forward单位的Verilog代码、32位流水线MIPS处理器的顶级Verilog代码、用于32位流水线MIPS处理器的Verilog Testbench代码。
本人在下方展示了转发单元的Verilog代码;如想了解的更多请下载附件。
`timescale 1 ps / 100 fs
// fpga4student.com: FPGA projects, Verilog Projects, VHDL projects
// Verilog project: 32-bit 5-stage Pipelined MIPS Processor in Verilog
// Forwarding Unit
module ForwardingUnit(ForwardA,ForwardB,MEM_RegWrite,WB_RegWrite,MEM_WriteRegister,WB_WriteRegister,EX_rs,EX_rt);
output [1:0] ForwardA,ForwardB;
wire [1:0] ForwardA,ForwardB;
input MEM_RegWrite,WB_RegWrite;
input [4:0] MEM_WriteRegister,WB_WriteRegister,EX_rs,EX_rt;
// a= 1 if ( MEM_WriteRegister != 0 )
or #(50) orMEM_WriteReg(a,MEM_WriteRegister[4],MEM_WriteRegister[3],MEM_WriteRegister[2],MEM_WriteRegister[1],MEM_WriteRegister[0]);
CompareAddress CompMEM_WriteReg_EXrs(b,MEM_WriteRegister,EX_rs);
and #(50) andx(x,MEM_RegWrite,a,b);
// x=1 if ((MEM_RegWrite==1)&&(MEM_WriteRegister != 0)&&(MEM_WriteRegister==EX_rs))
// c= 1 if ( WB_WriteRegister != 0 )
or #(50) orWB_WriteReg(c,WB_WriteRegister[4],WB_WriteRegister[3],WB_WriteRegister[2],WB_WriteRegister[1],WB_WriteRegister[0]);
CompareAddress CompWB_WriteReg_EXrs(d,WB_WriteRegister,EX_rs);
and #(50) andy(y,WB_RegWrite,c,d);
// y=1 if ((WB_RegWrite==1)&&(WB_WriteRegister != 0)&&(WB_WriteRegister==EX_rs))
// ForwardA[1] = x; va ForwardA[0] = (NOT x). y ;
assign ForwardA[1] = x;
not #(50) notxgate(notx,x);
and #(50) NOTxANDy(ForwardA[0],notx,y);
// ForwardB
CompareAddress CompMEM_WriteReg_EXrt(b1,MEM_WriteRegister,EX_rt);
CompareAddress CompWB_WriteReg_EXrt(d1,WB_WriteRegister,EX_rt);
and #(50) andx1(x1,MEM_RegWrite,a,b1);
and #(50) andy1(y1,WB_RegWrite,c,d1);
assign ForwardB[1] = x1;
not #(50) notx1gate(notx1,x1);
and #(50) NOTx1ANDy1(ForwardB[0],notx1,y1);
endmodule
©版权声明:本文内容由互联网用户自发贡献,版权归原创作者所有,本站不拥有所有权,也不承担相关法律责任。如果您发现本站中有涉嫌抄袭的内容,欢迎发送邮件至: www_apollocode_net@163.com 进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
转载请注明出处: apollocode » Verilog中的流水线MIPS处理器(第3部分)
文件列表(部分)
名称 | 大小 | 修改日期 |
---|---|---|
Verilog中的流水线MIPS处理器(第3部分)附件.txt | 4.31 KB | 2020-04-01 |
发表评论 取消回复