tag 标签: 有符号数

相关博文
  • 热度 12
    2013-12-31 09:59
    1604 次阅读|
    0 个评论
    今天有一个学弟问我 Verilog 中 reg(或 wire)是否加 signed 关键字的区别。回答他之后,总结如下。其实, 两者的区别和计算机中有符号数和无符号数的区别是完全一致的 。   添加 signed 关键字的 reg(或 wire)与不添加 signed 关键字的 reg(或 wire),主要有以下三点不同。 有符号右移 对于普通的右移(),是否加 signed 是没有区别的,第一位都是补 0 。   有符号右移()就有区别了,有符号数是补和符号位相同的值,无符号数是补 0 。   例如:   以下是代码片段:      reg  unsignedRegA;      reg  signed signedRegA;        initial begin             unsignedRegA = 6'b110000;           signedRegA   = 6'b110000;                 unsignedRegA = unsignedRegA2;           signedRegA   = signedRegA2;                 end   这段程序运行后, unsignedRegA 为 6'b001100, signedRegA 为 6'b111100。 减法 加法应该是没区别的,区别在减法。无符号数是做二进制减法,有符号数是将减数取补再做加法。前者符合将数视为无符号数时的结果,后者符合将数视为有符号数(补码)时的结果。   例如:   以下是代码片段:      reg  unsignedRegA;      reg  unsignedRegB;      reg  unsignedRegS;      reg  signed signedRegA;      reg  signed signedRegB;      reg  signed signedRegS;           initial begin                unsignedRegA = 6'b111000;           unsignedRegB = 6'b000110;                 signedRegA   = 6'b111000;           signedRegB   = 6'b000110;                 unsignedRegS = unsignedRegA-unsignedRegB;           signedRegS   = signedRegA-signedRegB;         end   这段程序运行后, unsignedRegS 为 7'b0110010 (56-6=50), signedRegS 为 7'b1110010 (-8-6=-14)。 比较 比较的区别很明显。   对于有符号数,符号位为 1 的数是负数,显然小于符号位为 0 的正数。   对于无符号数,没有符号位,对应的比特是 MSB 。显然, MSB 为 1 的数要大于 MSB 为 0 的数。   例如:   以下是代码片段:      reg  unsignedRegA;      reg  unsignedRegB;      reg  signed signedRegA;      reg  signed signedRegB;         reg  unsignedCompare;      reg  signedCompare;        initial begin         unsignedRegA = 6'b111000;      unsignedRegB = 6'b000110;           signedRegA   = 6'b111000;      signedRegB   = 6'b000110;           unsignedCompare = (unsignedRegAunsignedRegB) ? 1'b1 : 1'b0;      signedCompare   = (signedRegAsignedRegB) ? 1'b1 : 1'b0;         end   这段程序运行后, unsignedCompare 为 1'b1, signedCompare 为 1'b0 。 总结 总之,如果涉及负数,就一定加上 signed 。否则如果涉及上面三种运算,就会跟想象的不一样。
相关资源