Verilog 有符号数 signed

首先记住,有符号数的运算全都是补码的方式

在Verilog里面,可以使用有符号数据进行运算,定义时使用signed,例如
reg signed[7:0] adder; //定义了一个reg型有符号8位变量 adder
在Verilog中,数据是以补码形式存储的,正数补码还是本身,负数补码是除符号位取反加一。例如:
上边定义的adder赋值为-3,则-3的二进制为1000 0011,这个叫原码,其补码为1111 1101,adder中真实存储的是1111 1101(补码)。
在运算的过程中也是使用补码的。那为什么我们在testbench中输出该值的时候(默认十进制)仍然显示的是-3呢,个人觉得是因为在显示的过程中,IDE做好了补码到原码的转换。
在寄存器里面存储的数据是1111 1101,按照有符号十进制显示是-3,按照无符号显示是253,按照十六进制显示FD,当然,按照二进制显示是1111 1101。
所以,无论是-3、253还是FD,对应的二进制都是1111 1101,只不过显示格式不同,那系统是怎么知道一个8位寄存器中1111 1101这个二进制表示的是-3还是253呢,这就是定义该寄存器时使用signed的作用了,signed表示有符号,此时的1111 1101表示的是-3,若是没有signed,则默认是无符号类型,那么此时的1111 1101表示的就是253。
另外,有符号数1000 0000表示的-128(比较特殊,不能用原码补码概念来理解,记住就好),所以8位寄存器表示的数据范围是-128~0~127,共256个数。无符号8位表示的数据范围是0~255,也是256个数。
————————————————
版权声明:本文为CSDN博主「hutuxiaozi77」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hutuxiaozi77/article/details/78762631

下面看3个例子:
-------------------------------------------------------------
reg [7:0]   temp1, temp2, temp3, temp4, temp5, temp6 ;  
temp1 = 8'd18;
        temp2 = -8'd18;
        temp3 = 8'sd18;
        temp4 = -12/3;
        temp5 = -8'd12/3;
        temp6 = -8'sd12/3;
-------------------------------------------------------------
以下是仿真的结果;

先看前3个
8'd18表示输入的是无符号的十进制数18
      -8'd18表示输入的是-18,所以结果为11101110
      8'sd18表示输入的是有符号的18
再看后3个
-12/3      的结果为-4的补码
-8'd12/3 的结果比较奇怪,因为-8'sd12可以分解为 -(8'd12)/3,就是11110100/3,结果为01010001
-8'sd12/3的结果为-4的补码
这里可以看出,加上了s后,在运算的时候编译器把数当作有符号数计算,不加s时,即使是补码的负数,也会直接当作无符号数处理。
————————————————
版权声明:本文为CSDN博主「永不放弃EX」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013564276/article/details/48730355

 

更多参考:

https://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html

你可能感兴趣的:(计算机基础,Verilog,Verilog,RTL,signed,有符号数,数值运算)