verilog 减法探究

  • Post author:
  • Post category:其他


一段代码如下:

module test
(
//test 1
//input  sys_clk     ,
//input  soft_rst_n  ,

input [2:0] minu   ,
input [2:0] subs   ,
input [2:0] subs1  ,

output [2:0] resu0   ,
output [3:0] resu1   ,
output [3:0] resu2   ,
output [3:0] resu3   ,
output [2:0] resu2_1  ,
output [2:0] resu3_1  ,

output [3:0] resu2_2  ,
output [3:0] resu3_2  ,

output [4:0] resu2_3  ,
output [4:0] resu3_3  ,

output [2:0] subs_inv  


);

//wire [2:0] subs_inv      ;
assign  subs_inv = ~subs ;

 assign resu0 = minu - subs;         //a-b
 assign resu1 = minu - subs;         //a-b带进位
 assign resu2 = minu - (~subs)   ;   //a-(~b)带进位
 assign resu3 = minu - subs_inv  ;   //a - b_inv ; b_inv = ~b ; 带进位
 
 assign resu2_1 = minu - (~subs)   ;   //a-(~b)无带进位
 assign resu3_1 = minu - subs_inv  ;   //a - b_inv ; b_inv = ~b ; 无进位
  
 
 assign resu2_2 = minu - (~subs)  - subs1  ;   //a-(~b)无带进位
 assign resu3_2 = minu - subs_inv - subs1  ;   //a - b_inv ; b_inv = ~b ; 无进位
 
 assign resu2_3 = minu - (~subs)  - subs1  ;   //a-(~b)无带进位
 assign resu3_3 = minu - subs_inv - subs1  ;   //a - b_inv ; b_inv = ~b ; 无进位
 
endmodule

综合的电路图如下:

可以看到modelsim平台中,带进位拓展的结果D中,1:C= ~B,2:D=A – C 直接综合成了D=A+B;

而 D= A- (~B),则综合成了 D={~A[MSB] , A+B };

不带进位的D则无区别;见 resu2和resu3;

减法是这样做的:

电路里头 :

A – B = A+ (~B) +1

若,B>A则,进位是1,否则进位是0;(resu0和resu1)

仿真的结果如下:

在 Verilog 中,a-b 表示将变量 b 的值从变量 a 的值中减去。这个操作产生一个有符号的差值。如果 a 和 b 都是有符号数,则结果仍然是有符号数。如果其中一个或两个输入是无符号数,则结果将被解释为无符号数。

具体地说,a-b 操作将对应以下计算:

  1. 如果 a 和 b 都是有符号数,则执行带符号的减法运算。
  2. 如果 a 和 b 都是无符号数,则执行无符号减法运算。

    如果 b 大于 a,则结果将是 2^(n+1) – (b – a),其中 n 是变量的位宽。
  3. 如果只有 a 是有符号数,则先将 b 扩展为有符号数,然后执行带符号的减法运算。
  4. 如果只有 b 是有符号数,则先将 a 扩展为有符号数,然后执行带符号的减法运算。



版权声明:本文为kofiliu2018原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。