一段代码如下:
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 操作将对应以下计算:
- 如果 a 和 b 都是有符号数,则执行带符号的减法运算。
-
如果 a 和 b 都是无符号数,则执行无符号减法运算。
如果 b 大于 a,则结果将是 2^(n+1) – (b – a),其中 n 是变量的位宽。
- 如果只有 a 是有符号数,则先将 b 扩展为有符号数,然后执行带符号的减法运算。
- 如果只有 b 是有符号数,则先将 a 扩展为有符号数,然后执行带符号的减法运算。
版权声明:本文为kofiliu2018原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。