32位alu(基于modelsim Verilog语言)


module alu(A,B,ALUOp,C);
input [31:0] A;  //The first value to participate in the ALU calculation
input [31:0] B;  //The second value to participate in the ALU calculation
input [2:0] ALUOp;  //ALU function selection signal
output reg [31:0] C;   //Calculation result of ALU
//every signal assigned within an"always" block must be defined as reg

always@(*)//only ALUOp is wrong
begin
case(ALUOp)

//Add
3'b000:
begin
C=A+B;
end

//Sub
3'b001:
begin
C=A-B;
end

//AND
3'b010:
begin
C=A&B;
end

//OR
3'b011:
begin
C=A|B;
end

//srl
3'b100:
begin
C=A>>B;
end

//sra
3'b101:
begin
C=($signed(A))>>>B;
end
/*猜测:在算数右移中>>>,是多次重复调用“右移一次”,
当结束后需再次判断是有符号数,而非无符号数。
使用$signed(A)可直接将A转化为有符号数进行操作。*/
//unsigned comparison operation 
3'b110:
begin
if(A>B)
C=1;
else
C=0;
end

//signed comparison operation
3'b111:
begin
if(A[31]==1&&B[31]==1&&A>B)
C=0;
else if(A[31]==1&&B[31]==0)
C=0;
else 
C=1;
end

endcase
end
endmodule

猜测:在算数右移中>>>,是多次重复调用“右移一次”,当结束后需再次判断是有符号数,而非无符号数。使用$signed(A)可直接将A转化为有符号数进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值