【 FPGA/IC 】addsub 的实现

举报
李锐博恩 发表于 2021/07/15 02:00:20 2021/07/15
3.6k+ 0 0
【摘要】 要实现一个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实现为:


      module top_module(
      	input [31:0] a,
      	input [31:0] b,
      	input sub,
     	output [31:0] result
      );
      	wire [31:0] sub1, sub2;
      	wire [31:0] b1;
     	//assign sub1 = 32'b0;
       //assign sub2 = 32'b1;
     	//assign b1 = sub ? b^sub2 : b^sub1;
       assign b1 = sub ? ( b^( {32{sub}} ) ) : ( b^( {32{sub}} ) );
       wire [15:0] sum1, sum2;
      	wire cout1;
      	add16 inst1(
      		.cin(sub),
       .a(a[15:0]),
       .b(b1[15:0]),
       .cout(cout1),
       .sum(sum1)
       );
      	add16 inst2(
      		.cin(cout1),
      		.a(a[31:16]),
      		.b(b1[31:16]),
      		.cout(),
      		.sum(sum2)
      		);
      	assign result = {sum2, sum1};
      endmodule
  
 

其中16位的数据加法为:


      module add16(
     	input [15:0] a,
     	input [15:0] b,
     	input cin,
     	output cout,
     	output [15:0] sum
     	);
     	assign {cout, sum} = a + b + cin;
      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

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

    全部回复

    上滑加载中

    设置昵称

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

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

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