verilog 加减法溢出

minu - subs /minu +sub

输入1测试例2测试例3测试例
A111010010
B010111110
A-B resu0101   正常011100
A-B 带1bit溢出resu10101 正常10111100
A+B ad_re0001001000

A+B带1bit溢出

ad_re1

100110011000
分析 无符号数

A>B 减法ok; 

加法也ok,

有溢出得到实际值7+2=9;

A<B

2-7=-5,结果按照有符号数计算,得到2+8-5=3;得到011,减法溢出,有借位标志1,1011;

即-5的补码 1011 

2-6=-4;

2+8-6=4;得到4 有借位标志;

-4的补码 1100

  

一个问题:verilog中 

a-(~b) 和   c = ~b, a - c  计算结果不一样;

测试代码:

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

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

output [2:0] resu0   ,
output [3:0] resu1   ,
output [3:0] resu2   ,
output [3:0] resu3   ,
output [2:0] ad_re0  ,
output [3:0] ad_re1  

);

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 ad_re0 = minu+subs;
 assign ad_re1 = minu+subs;
 
 
endmodule

代码如上;

resu2和resu3 结果不同;

RTL 图:

减去反码,带进位,不带进位RTL图:

图中 resu2 , resu3直接就是一个adder;

不带进位的resu2_1, resu3_1,这两个是一样的;

  assign resu2 = minu - (~subs)   ;  对应 Add2;

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

assign resu3 = minu - subs_inv  ;  对应 Add3

上述的计算结果不一样:

 总结:写完代码,减法的的结果看下RTL 视图,最好仿真自测验证一下;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数码逐渐远去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值