右算术移位不能正常工作
Right arithmetic shift does not work properly
if(Op_ex == 5'b11011 || Op_ex==5'b11100 || Op_ex==5'b11101 || Op_ex==5'b11110 || Op_ex==5'b11111 )
begin
temp_carry = 1'b0;
ans_ex = A >>> B;
flag[3] = ans_ex[0]^ans_ex[1]^ans_ex[2]^ans_ex[3]^ans_ex[4]^ans_ex[5]^ans_ex[6]^ans_ex[7]; //flag[3] = parity
flag[2] = 0; //flag[2] = overflow
flag[0] = 0;
if(ans_ex == 8'b00000000)
begin
flag[1] = 1'b1; //flag[1] = zero
end
else
begin
flag[1] = 1'b0;
end
data_out = reg_data;
end
end
如果我输入 A = 8'hC0
和 B = 8'h01
那么它将给我输出 60,而不是十六进制的 e0。
A
未签名。无符号数的符号消退始终为 0。
使 A
(可能是 B 井)成为一个带符号的值。两个是这样做的:
input signed [7:0] A,B
ans_ex = $signed(A) >>> B;
仅供参考:
(Op_ex == 5'b11011 || Op_ex==5'b11100 || Op_ex==5'b11101 || Op_ex==5'b11110 || Op_ex==5'b11111 )
可以简化为(Op_ex >= 5'b11011)
flag[3] = ans_ex[0]^ans_ex[1]^ans_ex[2]^ans_ex[3]^ans_ex[4]^ans_ex[5]^ans_ex[6]^ans_ex[7];
可以简化为:flag[3] = ^ans_ex;
或flag[3] = ^ans_ex[7:0];
if(Op_ex == 5'b11011 || Op_ex==5'b11100 || Op_ex==5'b11101 || Op_ex==5'b11110 || Op_ex==5'b11111 )
begin
temp_carry = 1'b0;
ans_ex = A >>> B;
flag[3] = ans_ex[0]^ans_ex[1]^ans_ex[2]^ans_ex[3]^ans_ex[4]^ans_ex[5]^ans_ex[6]^ans_ex[7]; //flag[3] = parity
flag[2] = 0; //flag[2] = overflow
flag[0] = 0;
if(ans_ex == 8'b00000000)
begin
flag[1] = 1'b1; //flag[1] = zero
end
else
begin
flag[1] = 1'b0;
end
data_out = reg_data;
end
end
如果我输入 A = 8'hC0
和 B = 8'h01
那么它将给我输出 60,而不是十六进制的 e0。
A
未签名。无符号数的符号消退始终为 0。
使 A
(可能是 B 井)成为一个带符号的值。两个是这样做的:
input signed [7:0] A,B
ans_ex = $signed(A) >>> B;
仅供参考:
(Op_ex == 5'b11011 || Op_ex==5'b11100 || Op_ex==5'b11101 || Op_ex==5'b11110 || Op_ex==5'b11111 )
可以简化为(Op_ex >= 5'b11011)
flag[3] = ans_ex[0]^ans_ex[1]^ans_ex[2]^ans_ex[3]^ans_ex[4]^ans_ex[5]^ans_ex[6]^ans_ex[7];
可以简化为:flag[3] = ^ans_ex;
或flag[3] = ^ans_ex[7:0];