ALU与ALU控制器设计Word文档下载推荐.docx
- 文档编号:18007832
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:30
- 大小:584.79KB
ALU与ALU控制器设计Word文档下载推荐.docx
《ALU与ALU控制器设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ALU与ALU控制器设计Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
SUB
减法运算
0011
SBC
带进位的减法运算
0100
000
BIC
位清除指令
0101
001
AND
与操作
0110
010
ORR
或操作
0111
011
EOR
异或操作
1000
100
CMN
负数比较
1001
TST
位测试指令
1010
CMP
比较指令
1011
TEQ
相等测试指令
ADD:
若ADDr0,r1,r2,则r0=r1+r2;
ADC:
若ADCr0,r1,r2,则r0=r1+r2+C;
SUB:
若SUBr0,r1,r2,则r0=r1-r2;
SBC:
若SBCr0,r1,r2,则r0=r1+r2+C-1;
BIC:
A中值与B中值的反码进行与操作;
AND:
按位与操作;
ORR:
按位或操作;
EOR:
按位异或操作;
CMN:
A加B,若小于零则结果为1,不保存减的结果;
TST:
A和B进行按位与操作,全零则结果为1;
CMP:
A减B,若小于零则结果为1,不保存减的结果;
TEQ:
A和B进行按位异或操作,全零则结果为1。
五、实验步骤
(一)Ex1(MIPS的ALU及ALU控制器)
1、变量名列表
输出变量名
变量名类型
变量名含义说明
定义该变量的程序模块名
Operand_A
32位input
第一个操作数
mips_alu
Operand_B
第二个操作数
4位input
控制变量
Result_final
32位output
输出结果
Carry
1位output
进位
Zero
判零
Overflow
判断溢出
Less
比较两数大小
result
32位reg数组
用于存放结果的临时变量
i
1位integer
用于计数的临时变量
count
32位reg
用于存放扩展位的临时变量
extendA,extendB
用于存放扩展后数据的临时变量
tempA,tempB
用于存放数据的临时变量
temp
33位reg
用于存放数据经过加法器运算后的临时变量
Carry_f
1位reg
用于存放数据经过加法器运算后的进位
Sign
用于存放数据经过加法器运算后的符号位
2、代码
modulemips_alu(input[31:
0]Operand_A,
input[31:
0]Operand_B,
input[3:
0]AluOp,
outputreg[31:
0]Result_final,
outputregCarry,
outputregZero,
outputregOverflow,
outputregLess
);
reg[31:
0]result[6:
0];
always
begin
result[1]=Operand_A^Operand_B;
result[2]=Operand_A|Operand_B;
result[3]=~(Operand_A|Operand_B);
result[4]=Operand_A&
Operand_B;
end
integeri;
0]count;
0]extendA,tempA;
if(AluOp[0]==0)
begin
extendA=0;
else
extendA={32{1'
b1}};
tempA=(Operand_A^extendA);
count=32;
for(i=31;
i>
=0;
i=i-1)
if(tempA[31-i]==1)
count=i;
result[0]=count;
0]extendB,tempB;
reg[32:
0]temp;
regCarry_f;
regSign;
if(AluOp[0]==0)
extendB=0;
extendB={32{1'
tempB=(Operand_B^extendB);
temp=Operand_A+tempB+AluOp[0];
result[6]=temp[31:
Carry_f=temp[32];
Carry=Carry_f^AluOp[0];
if(AluOp[0]==1&
&
temp==0)
Zero=1;
Zero=0;
if(Operand_A[31]==tempB[31]&
temp[31]!
=Operand_A[31])
Overflow=1;
else
Overflow=0;
Sign=temp[31];
if(AluOp[1]==1)
Less=Carry;
Less=Sign^Overflow;
if(Less==1)
result[5]={32{1'
result[5]=0;
end
reg[2:
0]AluCtr;
AluCtr[2]=((~AluOp[3])&
(~AluOp[1]))|((~AluOp[3])&
AluOp[2]&
AluOp[0]);
AluCtr[1]=((~AluOp[3])&
(~AluOp[2])&
(~AluOp[1]))
|((~AluOp[3])&
AluOp[1]&
AluOp[0])
|((~AluOp[2])&
(~AluOp[1])&
(~AluOp[0]));
AluCtr[0]=(AluOp[3]&
case(AluCtr)
3'
b000:
Result_final=result[0];
b001:
Result_final=result[1];
b010:
Result_final=result[2];
b011:
Result_final=result[3];
b100:
Result_final=result[4];
b101:
Result_final=result[5];
b110:
Result_final=result[6];
endcase
end
endmodule
3、仿真结果:
功能仿真:
仿真结果说明:
0000
加法
01100000000000000000000000000000
11000000000000000000000000000000
1
0001
有符号减法
00000000000000000000000000000010
00000000000000000000000000000101
111111*********11111111111111101
0010
前导零
00000000000000000000000000000000
00000000000000000000000000100000
0011
前导一
11100000000000000000000000000000
00000000000000000000000000000011
0100
与
00000000000000000000000000001010
00000000000000000000000000001100
00000000000000000000000000001000
0101
slt/slti
00000000000000000000000000000001
111111*********11111111111111111
0110
或
00000000000000000000000000001110
0111
sltu/sltiu
1000
或非
11111111111111111111111111110001
1001
异或
00000000000000000000000000000110
(二)Ex2(ARM的ALU及ALU控制器)
arm_alu
C_before_move
1位input
标志位
ctr_LRAL
2位input
控制位
ctr_RRX
S
5位input
Result
modulearm_alu(Operand_A,Operand_B,AluOp,Carry,Less,Zero,Overflow,Result,
ctr_LRAL,ctr_RRX,S,C_before_move);
input[31:
0]Operand_A;
0]Operand_B;
input[3:
0]AluOp;
input[4:
0]S;
input[1:
0]ctr_LRAL;
inputctr_RRX;
inputC_before_move;
outputCarry,Less,Zero,Overflow;
output[31:
0]Result;
wireC_after_move;
wire[31:
0]Result_f;
wireCarry_f,Sign;
wire[2:
0]Control;
0]x0,x1,x2,x3,x4,x5;
0]A,B;
0]larger,out_move;
wireCin,inCarry0,inCarry1,inx4_01,inx4_11;
controlf_4to3(AluOp,Control);
larger1to32f_larger(AluOp[1],larger);
ARM_movef_move(Operand_B,S,ctr_LRAL,ctr_RRX,out_move,C_before_move,C_after_move);
assignA=Operand_A;
assignB=out_move^larger;
mux_2to1f_toCin(AluOp[1],C_after_move,AluOp[0],Cin);
alladdf_add(A,B,Cin,Result_f,Carry_f,Zero,Overflow,Sign);
assigninCarry0=Carry_f^AluOp[1];
assigninCarry1=C_after_move;
mux_2to1f_toCarry(inCarry0,inCarry1,ctr_RRX,Carry);
assignLess=Overflow^Sign;
assignx0=(~out_move)&
Operand_A;
assignx1=Operand_A&
out_move;
assignx2=Operand_A|out_move;
assignx3=Operand_A^out_move;
test_all0g1(x1,inx4_01);
test_all0g2(x1,inx4_11);
mux_4to1f_getx4(Less,inx4_01,Less,inx4_11,AluOp[1:
0],x4);
assignx5=Result_f;
mux32_6to1f_getResult(x0,x1,x2,x3,x4,x5,Control,Result);
modulecontrol(ALUop,ALUctr);
0]ALUop;
outputreg[2:
0]ALUctr;
always@(ALUop)
case(ALUop)
4'
b0000:
ALUctr=3'
b101;
b0001:
b0010:
b0011:
b0100:
b000;
b0101:
b001;
b0110:
b010;
b0111:
b011;
b1000:
b100;
b1001:
b1010:
b1011:
default:
b111;
endcase
endmodule
modulealladd(A,B,Cin,Result_f,Carry_f,Zero,Overflow,Sign);
0]A;
0]B;
inputCin;
outputCarry_f,Zero,Overflow,Sign;
0]C;
addf0(A[0],B[0],Cin,Result_f[0],C[0]);
addf1(A[1],B[1],C[0],Result_f[1],C[1]);
addf2(A[2],B[2],C[1],Result_f[2],C[2]);
addf3(A[3],B[3],C[2],Result_f[3],C[3]);
addf4(A[4],B[4],C[3],Result_f[4],C[4]);
addf5(A[5],B[5],C[4],Result_f[5],C[5]);
addf6(A[6],B[6],C[5],Result_f[6],C[6]);
addf7(A[7],B[7],C[6],Result_f[7],C[7]);
addf8(A[8],B[8],C[7],Result_f[8],C[8]);
addf9(A[9],B[9],C[8],Result_f[9],C[9]);
addf10(A[10],B[10],C[9],Result_f[10],C[10]);
addf11(A[11],B[11],C[10],Result_f[11],C[11]);
addf12(A[12],B[12],C[11],Result_f[12],C[12]);
addf13(A[13],B[13],C[12],Result_f[13],C[13]);
addf14(A[14],B[14],C[13],Result_f[14],C[14]);
addf15(A[15],B[15],C[14],Result_f[15],C[15]);
addf16(A[16],B[16],C[15],Result_f[16],C[16]);
addf17(A[17],B[17],C[16],Result_f[17],C[17]);
addf18(A[18],B[18],C[17],Result_f[18],C[18]);
addf19(A[19],B[19],C[18],Result_f[19],C[19]);
addf20(A[20],B[20],C[19],Result_f[20],C[20]);
addf21(A[21],B[21],C[20],Result_f[21],C[21]);
addf22(A[22],B[22],C[21],Result_f[22],C[22]);
addf23(A[23],B[23],C[22],Result_f[23],C[23]);
addf24(A[24],B[24],C[23],Result_f[24],C[24]);
addf25(A[25],B[25],C[24],Result_f[25],C[25]);
addf26(A[26],B[26],C[25],Result_f[26],C[26]);
addf27(A[27],B[27],C[26],Result_f[27],C[27]);
addf28(A[28],B[28],C[27],Result_f[28],C[28]);
addf29(A[29],B[29],C[28],Result_f[29],C[29]);
addf30(A[30],B[30],C[29],Result_f[30],C[30]);
addf31(A[31],B[31],C[30],Result_f[31],C[31]);
assignCarry_f=C[31];
assignSign=Result_f[31];
assignOverflow=C[30]^C[31];
assignZero=~(Result_f[0]|Result_f[1]|Result_f[2]|Result_f[3]|
Result_f[4]|Result_f[5]|Result_f[6]|Result_f[7]|
Result_f[8]|Result_f[9]|Result_f[10]|Result_f[11]|
Resu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ALU 控制器 设计