原创 Verilog HDL 中的有符号数

2013-12-31 09:59 1588 12 12 分类: FPGA/CPLD 文集: 细枝末节
今天有一个学弟问我 Verilog 中 reg(或 wire)是否加 signed 关键字的区别。回答他之后,总结如下。其实,两者的区别和计算机中有符号数和无符号数的区别是完全一致的
 
添加 signed 关键字的 reg(或 wire)与不添加 signed 关键字的 reg(或 wire),主要有以下三点不同。
  • 有符号右移
对于普通的右移(>>),是否加 signed 是没有区别的,第一位都是补 0 。
 
有符号右移(>>>)就有区别了,有符号数是补和符号位相同的值,无符号数是补 0 。
 
例如:
 
以下是代码片段:
     reg  [5:0] unsignedRegA;
     reg  signed [5:0] signedRegA;
 
     initial begin
 
          unsignedRegA <= 6'b110000;
          signedRegA   <= 6'b110000;
     
          unsignedRegA <= unsignedRegA>>>2;
          signedRegA   <= signedRegA>>>2;
          
     end
 
这段程序运行后, unsignedRegA 为 6'b001100, signedRegA 为 6'b111100。
  • 减法
加法应该是没区别的,区别在减法。无符号数是做二进制减法,有符号数是将减数取补再做加法。前者符合将数视为无符号数时的结果,后者符合将数视为有符号数(补码)时的结果。
 
例如:
 
以下是代码片段:
     reg  [5:0] unsignedRegA;
     reg  [5:0] unsignedRegB;
     reg  [6:0] unsignedRegS;

     reg  signed [5:0] signedRegA;
     reg  signed [5:0] signedRegB;
     reg  signed [6:0] 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  [5:0] unsignedRegA;
     reg  [5:0] unsignedRegB;

     reg  signed [5:0] signedRegA;
     reg  signed [5:0] signedRegB;
  
     reg  unsignedCompare;
     reg  signedCompare;
 
     initial begin
  
     unsignedRegA <= 6'b111000;
     unsignedRegB <= 6'b000110;
    
     signedRegA   <= 6'b111000;
     signedRegB   <= 6'b000110;
    
     unsignedCompare <= (unsignedRegA>unsignedRegB) ? 1'b1 : 1'b0;
     signedCompare   <= (signedRegA>signedRegB) ? 1'b1 : 1'b0;
  
     end
 
这段程序运行后, unsignedCompare 为 1'b1, signedCompare 为 1'b0 。
  • 总结
总之,如果涉及负数,就一定加上 signed 。否则如果涉及上面三种运算,就会跟想象的不一样。

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条