📄 arithmetic.v
字号:
module arithmetic(op, clock,result,overflow,zero,pn);//运算器模块,输入为一个32位的机器指令和时钟,输出为运算结果和标志位input clock;//时钟input [31:0] op;//32位的机器指令output [31:0] result;//32位的结果output overflow,zero,pn;//标志位,依次为溢出位,是否为0和符号位//下面为各个wire型的定义,具体含义参看所使用模块的接口wire ina ,inb ,writein ,shiftsign , extend , luisign,cout,overflowalu,overflowmult,sign, signslt,aluzero,multzero,divzero,shiftzero;wire [1:0] aluOp , outcalc;wire [3:0] aluCtrl;wire [4:0] writereg;wire [31:0] dataA0,dataB0,dataA1,dataB1,dataA2,dataB2,extout,aport,bport,aport1,bport1,result0,result1,result10,result11,result2,result20,result21,result3,r;//生成控制信号单元alucontrl ctl( op , ina , inb , aluOp , aluCtrl , writein , outcalc , shiftsign , extend , luisign , sign , signslt);//2选1多路选择器,用来指定要写入的寄存器的编号mux2_2 mux1(op[20:16],op[15:11],writein,writereg);//寄存器堆registerfile regfile(op[25:21],op[20:16],writereg,result,1,dataA0,dataB0,clock);//符号扩展单元bitext ext(aluOp[0],op[15:0],~luisign,extend,extout);//2选1多路选择器,用于指定A口的数据mux2 muxa(dataA0,32'b0,ina,aport);//2选1多路选择器,用于指定B口的数据mux2 muxb(dataB0,extout,inb,bport);//符号处理单元,在处理有符号数时需要进行此单元signcontrol sign1(1,aport,dataA1);signcontrol sign2(1,bport,dataB1);//2选1多路选择器,用于指定送入乘法器或除法器的数据来自A口,B口还是来自符号处理后的结果mux2 muxc(aport,dataA1,sign,dataA2);mux2 muxd(bport,dataB1,sign,dataB2);//快速移位寄存器shift2 shift(shiftsign,0,op[10:6],bport,result0,shiftzero);//快速除法器divider32 div(dataA2,dataB2,result10,r,divzero);//快速乘法器mult32 m32(dataA2,dataB2,result20,overflowmult,multzero);////符号处理单元,在处理有符号数时需要进行此单元signcontrol sign3(0,result10,result11);signcontrol sign4(0,result20,result21);//2选1多路选择器,用于指定乘法器或除法器的最终结果数据来自乘除法器的结果还是来自其进行符号处理后的结果mux2 muxf(result10,result11,sign&(aport[31]^bport[31]),result1);mux2 muxg(result20,result21,sign&(aport[31]^bport[31]),result2);//slt处理单元,用于进行有符号的slt指令的预处理sltcontrol s1(signslt,aport,aport1);sltcontrol s2(signslt,bport,bport1);//32位ALUalu32 a32(aport1,bport1,aluCtrl,result3,cout,overflowalu,aluzero);//4选1多路选择器,用于指定最后的结果来自ALU,乘法器,除法器还是移位寄存器mux4 muxe(result3,result2,result0,result1,outcalc,result);//标志位处理单元,根据各个部件的运算结果以及控制信号计算整个运算器的标志位flagpro fp(~sign,overflowalu,overflowmult,~outcalc[0],~outcalc[1],aluCtrl[2],result2[31],result3[31],result1[31],aport1[31]^bport1[31],overflow,aluzero,multzero,divzero,shiftzero,zero,pn);endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -