【 FPGA/IC 】addsub 的实现
【摘要】 要实现一个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)