【Verilog】进位选择加法器

该博客探讨了如何设计32位加法器,首先介绍了通过简单串联两个16位加法器的原始方法,但指出了这种方法存在的延迟问题。然后,提出了32位进位选择加法器的方案,通过使用三个16位加法器和2-1多路复用器,提高了计算效率。这种方法允许在第一级加法器计算的同时进行高位加法,从而减少了整体延迟。
摘要由CSDN通过智能技术生成

假设已经有16位的加法器add16,设计一个32位加法器。

一、原始加法器

用两个16位的加法器连在一起,将第一个加法器的进位输出作为第二个加法器的进位输入。

1.1 框图

在这里插入图片描述

1.2代码

module top_module(
	input [31:0] a,
	input [31:0] b,
	output [31:0] sum
	);

wire [15:0] a_1,a_2;
wire [15:0] b_1,b_2;
wire [15:0] sum_1,sum_2;
wire cin_1,cout_1,cin_2,cout_2;
assign cin_1 = 0;
assign a_1 = a [15:0];
assign a_2 = a[31:16];
assign b_1 = b[15:0];
assign b_2 = b[31:16];
assign sum = {sum_2[15:0],sum_1[15:0]};
add16 u_add16_1(.a(a_1),.b(b_1),.sum(sum_1),.cin(cin_1),.cout(cout_1));
add16 u_add16_2(.a(a_2),.b(b_2),.sum(sum_2),.cin(cout_1));
endmodule

1.3 不足

加法器计算进位的延迟(在最坏的情况下,从进位开始)相当慢,并且在第一级加法器完成之前,第二级加法器无法开始计算其进位,这会使加法器变慢。

二、32位进位选择加法器

由三个16位加法器组成,一个负责低16位的加法计算。另外两个对高16位进行计算,一个假设进位=0,一个假设进位=1,,然后使用快速2-1多路复用器,用第一个16位加法器的cout对高位的加法器进行选择。

2.1框图

在这里插入图片描述

2.2 代码

module top_module(
	input [31:0]a,
	input [31:0]b,
	output [31:0]sum
	);

wire [15:0] a_1,a_2;
wire [15:0] b_1,b_2;
wire cin_1,cin_2,cin_3;
wire cout_1,cout_2,cout_3;
wire [15:0] sum_1,sum_2,sum_3;
assign a_1 = a[15:0];
assign a_2 = a[31:16];
assign b_1 = b[15:0];
assign b_2 = b[31:16];
assign sum[15:0] = sum_1;
assign cin_1 = 1'b0 ;
assign cin_2 = 1'b0 ;
assign cin_3 = 1'b1 ;

assign sum[31:16]= cout_1 ? sum_3:sum_2;
add16 u1_add16(
	.a(a_1),
	.b(b_1),
	.cin(cin_1),
	.sum(sum_1),
	.cout(cout_1)
	);
add16 u2_add16(
	.a(a_2),
	.b(b_2),
	.cin(cin_2),
	.sum(sum_2),
	.cout(cout_2)
	);
add16 u3_add16(
	.a(a_2),
	.b(b_2),
	.cin(cin_3),
	.sum(sum_3),
	.cout(cout_3)
	);

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值