【 FPGA/IC 】addsub 的实现

举报
李锐博恩 发表于 2021/07/15 02:00:20 2021/07/15
【摘要】 要实现一个32位的加减器,加减由变量sub来决定,sub为0时,实现add,否则,实现sub。 输入输出变量有: input [31:0] a, input [31:0] b, input sub, input cin, output cout, output [31:0] out; 要实现相加,则a和b相加;要实现相减,则a加上-b的补码。 相减,在数字电...

要实现一个32位的加减器,加减由变量sub来决定,sub为0时,实现add,否则,实现sub。

输入输出变量有:

input [31:0] a,

input [31:0] b,

input sub,

input cin,

output cout,

output [31:0] out;

要实现相加,则a和b相加;要实现相减,则a加上-b的补码。

相减,在数字电路中,可以用加法器实现,也即a加上-b的补码,-b的补码等于b取反加1;

具体实现方法参考:addsub

具体的Verilog实现为:


  
  1. module top_module(
  2. input [31:0] a,
  3. input [31:0] b,
  4. input sub,
  5. output [31:0] result
  6. );
  7. wire [31:0] sub1, sub2;
  8. wire [31:0] b1;
  9. //assign sub1 = 32'b0;
  10. //assign sub2 = 32'b1;
  11. //assign b1 = sub ? b^sub2 : b^sub1;
  12. assign b1 = sub ? ( b^( {32{sub}} ) ) : ( b^( {32{sub}} ) );
  13. wire [15:0] sum1, sum2;
  14. wire cout1;
  15. add16 inst1(
  16. .cin(sub),
  17. .a(a[15:0]),
  18. .b(b1[15:0]),
  19. .cout(cout1),
  20. .sum(sum1)
  21. );
  22. add16 inst2(
  23. .cin(cout1),
  24. .a(a[31:16]),
  25. .b(b1[31:16]),
  26. .cout(),
  27. .sum(sum2)
  28. );
  29. assign result = {sum2, sum1};
  30. endmodule

其中16位的数据加法为:


  
  1. module add16(
  2. input [15:0] a,
  3. input [15:0] b,
  4. input cin,
  5. output cout,
  6. output [15:0] sum
  7. );
  8. assign {cout, sum} = a + b + cin;
  9. endmodule

当然,可以采用先进进位加法器,怎么实现可以参考:https://blog.csdn.net/Reborn_Lee/article/details/99634895

仿真结果为:

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/99656643

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。