Verilog 有符号数和无符号数的赋值和移位实验
发布时间
阅读量:
阅读量
//验证算术右移和逻辑右移
module test (
input signed [7:0] A0,
input signed [7:0] A1,
input [7:0] B0,
input [7:0] B1
);
wire [7:0] C0,C1,C2,C3;
wire signed [7:0] D0,D1,D2,D3;
wire [7:0] E0,E1,E2,E3;
wire signed [7:0] F0,F1,F2,F3;
assign C0 = B0 << 2;
assign C1 = B0 >> 2;
assign C2 = B0 <<< 2;
assign C3 = B0 >>> 2;
assign D0 = A0 << 2;
assign D1 = A0 >> 2;
assign D2 = A0 <<< 2;
assign D3 = A0 >>> 2;
assign E0 = A0 << 2;
assign E1 = A0 >> 2;
assign E2 = A0 <<< 2;
assign E3 = A0 >>> 2;
assign F0 = B0 << 2;
assign F1 = B0 >> 2;
assign F2 = B0 <<< 2;
assign F3 = B0 >>> 2;
endmodule
java

module test_tb(
3. );
reg signed [7:0] A0,A1;
reg [7:0] B0,B1;
test test1(
.A0(A0),
.A1(A1),
.B0(B0),
.B1(B1)
);
initial begin
A0 = 1101_0011;
B0 = 1101_0011;
A1 = -82;
B1 = -82;
#2
$stop;
end
endmodule
java

设计代码和测试代码如上。
内容一:
输入中,A系列为有符号数,B系列为无符号。对A0,B0使用二进制赋初值1101_0011,对A1,B1使用十进制赋初值-82.

按理说,A系列的范围是-127到127,B系列的范围是0到255.作如下赋值
A0 = -8'd250;
B0 = -8'd250;
A1 = 8'd250;
B1 = 8'd250;

现在将赋值从数值改为变量,观察无符号数和符号数之间的转换。
A0 = -8'd25;
B1 = 8'd128;
B0 = A0;
A1 = B1;

结论:对变量的赋值,若使用二进制是直接赋值。若使用十进制,则会将十进制转换为对应的二进制补码形式后再赋值给变量,不论被赋值的变量是不是有符号数。而若使用变量赋值,则视作使用二进制直接赋值。
内容二:
回到最初的仿真值。
现在是无符号数分别使用算术移位和逻辑移位后赋值给无符号数。

现在是无符号数分别使用算术移位和逻辑移位后赋值给有符号数。

现在是有符号数分别使用算术移位和逻辑移位后赋值给有符号数。

现在是有符号数分别使用算术移位和逻辑移位后赋值给无符号数。
结论:算术位移只对有符号数的负数操作时生效,其他情况下和逻辑位移的结果一样。在赋值操作中包含了算术位移时,是否进行算术位移取决于进行位移的变量是否时有符号数,与被赋值的变量是否是有符号数无关。
全部评论 (0)
还没有任何评论哟~

