关于FPGA CPU设计的一些心得体会-FPGA常见问题社区-FPGA CPLD-ChipDebug

关于FPGA CPU设计的一些心得体会

 

最近在设计cpu,是基于mips32指令的体系。设计的很头疼,但是花了时间后发现其实还是蛮有趣的,而且还有一些技巧在里面,今天我就分享出来。1.首先要把CPU放到最大化角度来看待这个问题:2.0版本中,CPU可以用更小、更轻量级的方式去处理它们之间的关系;3.1版本中,CPU能够使用更多的功能和配置,比如说自动驾驶模式(Auto-Transfer)或者是智慧型手机等等。4.2版本中,CPU会根据你需要调整不同的位置,并且让你感觉自己处在一种非常舒适的状态下。5.3版本中,CPU会将所需的信息进行重新排列组合,使得你不再像之前那样只知道打电话,不知道做事情。6.4版本中,CPU会对应着各类数字信号,例如“Hello”、“Lightning”、“Showtime”等等。7.5版本中,CPU会通过设定好的路径来实时监控车辆的运作情况,从而确保每一次出差。

module top(Clk,En,Clrn,dataadr,writedata,memwrite);
 
input Clk,En,Clrn;
output[31:0] dataadr,writedata;
output memwrite;
 
wire [31:0] IF_Result,IF_Addr,IF_PCadd4,IF_Inst,D,D1,ID_Qa,ID_Qb,ID_PCadd4,ID_Inst,ID_InstL2,EX_InstL2;
wire [31:0] E_R1,E_R2,E_I,X,Y,E_R,EX_PC,EX_Inst,M_R,M_S,Dout,W_D,W_C,ID_EXTIMM,Alu_X,E_NUM,ID_EXTIMM_L2,ID_PC,EX_PCadd4,M_PCadd4,W_PCadd4;
wire [5:0] E_Op,E_Func;
wire [4:0] ID_Wr,ID_Wr1,W_Wr,E_Rd,M_Rd;
wire [3:0]Aluc,E_Aluc;
wire [1:0]Pcsrc,FwdA,FwdB,E_FwdA,E_FwdB;
wire Regrt,Se,Wreg,Aluqb,Reg2reg,Wmem,Z,shift,j,Clkn,E_j,M_j,W_j;
wire E_Wreg,E_Reg2reg,E_Wmem,E_Aluqb,M_Wreg,M_Reg2reg,M_Wmem,W_Wreg,W_Reg2reg,stall,condep;
 
//IF
not i0(Clkn,Clk);
mux4 #(32) mux4x32(IF_PCadd4,EX_PC,E_R1,EX_InstL2,Pcsrc,IF_Result);
pc pc(IF_Result,Clk,En,Clrn,IF_Addr,stall);
pcadd4 pcadd4(IF_Addr,IF_PCadd4);
imem instmem(IF_Addr,IF_Inst);
 
reg_ifid ifid(IF_PCadd4,IF_Inst,En,Clk,Clrn,ID_PCadd4,ID_Inst,stall,condep);
 
//ID
CONUNIT conunit(E_Op,ID_Inst[31:26],E_Func,ID_Inst[5:0],Z,Regrt,Se,Wreg,Aluqb,Aluc,Wmem,Pcsrc,Reg2reg,shift,j,ID_Inst[25:21],ID_Inst[20:16],E_Rd,M_Rd,E_Wreg,M_Wreg,FwdA,FwdB,E_Reg2reg,stall,condep);
mux2 #(5) mux2x5_1(ID_Inst[15:11],ID_Inst[20:16],Regrt,ID_Wr1);
mux2 #(5) mux2x5_2(ID_Wr1,5'b11111,j,ID_Wr);
ext16t32 ext16t32(ID_Inst[15:0],Se,ID_EXTIMM);//ID_EXTIMM 瀵瑰簲 E_I
regfile regfile(.ra1(ID_Inst[25:21]),.ra2(ID_Inst[20:16]),.wd3(D),.wa3(W_Wr),.we3(W_Wreg),.clk(Clkn),.clrn(Clrn),.rd1(ID_Qa),.rd2(ID_Qb) );
sl2 shifter2(ID_EXTIMM,ID_EXTIMM_L2);//鎺у埗鍐掗櫓
sl1 shifter1(ID_Inst[25:0],ID_PCadd4,ID_InstL2);
adder cla_32(ID_PCadd4,ID_EXTIMM_L2,ID_PC);//ID_PCadd4 瀵瑰簲 E_PC
mux2 #(32) mux2x32_1(D1,W_PCadd4,W_j,D);
reg_idex idex(ID_Inst[5:0],j,ID_PCadd4,ID_InstL2,ID_PC,Wreg,Reg2reg,Wmem,
	ID_Inst[31:26],Aluc,Aluqb,ID_Inst,ID_Qa,ID_Qb,ID_EXTIMM,ID_Wr,En,Clk,Clrn,
	E_Wreg,E_Reg2reg,E_Wmem,E_Op,E_Aluc,E_Aluqb,EX_Inst,E_R1,E_R2,E_I,E_Rd,
	FwdA,FwdB,E_FwdA,E_FwdB,EX_PC,stall,EX_InstL2,EX_PCadd4,E_j,E_Func,condep);
 
//EX
mux4 #(32) mux4x32_ex_1(E_R1,D1,M_R,0,E_FwdA,Alu_X);
mux4 #(32) mux4x32_ex_2(E_R2,D1,M_R,0,E_FwdB,E_NUM);
mux2 #(32) mux2x32_2(E_I,E_NUM,E_Aluqb,Y);
mux2 #(32) mux2x32_3(Alu_X,EX_Inst,shift,X);
alu alu(X,Y,E_Aluc,E_R,Z);
 
reg_exmem exmem(E_j,EX_PCadd4,E_Wreg,E_Reg2reg,E_Wmem,E_R,E_R2,E_Rd,En,Clk,Clrn,
				M_Wreg,M_Reg2reg,M_Wmem,M_R,M_S,M_Rd,M_PCadd4,M_j);
 
//MEM
dmem datamem(.a(M_R),.wd(M_S),.clk(Clk),.we(M_Wmem),.rd(Dout));
 
reg_memwb memwb(M_j,M_PCadd4,M_Wreg,M_Reg2reg,M_R,Dout,M_Rd,En,Clk,Clrn,
				W_Wreg,W_Reg2reg,W_D,W_C,W_Wr,W_PCadd4,W_j);
 
//WB
mux2 #(32) mux2x32_4(W_C,W_D,W_Reg2reg,D1);
 
assign dataadr =M_R;
assign writedata=M_S;
assign memwrite=M_Wmem;
endmodule

 

最近在设计cpu,是基于mips32指令的体系。设计的很头疼,但是花了时间后发现其实还是蛮有趣的,而且还有一些技巧在里面,今天我就分享出来。1.首先要把CPU放到最大化角度来看待这个问题:2.0版本中,CPU可以用更小、更轻量级的方式去处理它们之间的关系;3.1版本中,CPU能够使用更多的功能和配置,比如说自动驾驶模式(Auto-Transfer)或者是智慧型手机等等。4.2版本中,CPU会根据你需要调整不同的位置,并且让你感觉自己处在一种非常舒适的状态下。5.3版本中,CPU会将所需的信息进行重新排列组合,使得你不再像之前那样只知道打电话,不知道做事情。6.4版本中,CPU会对应着各类数字信号,例如“Hello”、“Lightning”、“Showtime”等等。7.5版本中,CPU会通过设定好的路径来实时监控车辆的运作情况,从而确保每一次出差。

请登录后发表评论

    没有回复内容