Advertisement

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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/3pAPmk8ClWF29Gez5HJfhj0n1wvX.png)
复制代码
 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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/oYq6IQ1Mbnh7wlpLXaRiWVjUxvTZ.png)

设计代码和测试代码如上。

内容一:

输入中,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)

还没有任何评论哟~