不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

Verilog减法

Verilog 的减法之前一直认为用补码会方便一些,如果直接相减的结果是啥样呢?

写了一个简单的减法

  1.  
    module subtract(a,b,d);
  2.  
    input [3:0]a,b;//a为被减数,b为减数
  3.  
    output [3:0]d;//输出d
  4.  
     
  5.  
    assign
  6.  
    d=a-b;
  7.  
     
  8.  
    endmodule
  9.  
     

直接减法的仿真结果如下

可见当a大于等于b时可以直接得到正确的值,如果a比b小会直接得到负值并以补码形式写出来。

但是由于a和b都是无符号数,如果得出来的是补码形式会很难理解,而且由于d只有4位

0001-1101会等于0100 其实应该是10100 是-12的补码 所以直接减会有错误

如果此时把a b都看成有符号数,

那么计算结果就是对的,所以有符号数是可以直接加减的

如果此时扩展b的位数,代码变为:

  1.  
    module subtract(a,b,d);
  2.  
    input [3:0]a,b;//a为被减数,b为减数
  3.  
    output [4:0]d;//输出d
  4.  
     
  5.  
    assign
  6.  
    d=a-b;
  7.  
     
  8.  
    endmodule
  9.  
     

此时若a,b为无符号数

得出的d是正确结果的补码

但是若a,b为有符号数,则计算结果就是错误的

所以直接减法需要考虑补位的问题。

posted on 2022-07-20 11:17  皮皮祥  阅读(1638)  评论(0)    收藏  举报