26 进位选择加法器
前例中的加法器成为串行进位加法器,只有等前一级的加法器运算结束产生进位位之后,下一级加法器才能利用进位位进行计算,因此电路延时会随加法器串联级数的增加而线性增加,这使得电路计算速度大大降低。设每一级全加器的延时为t,则32bit加法器的延时则为:32t。
为降低电路整体延时,我们可以按下图进行设计:
我们将电路分为两段,每段实现16bit的加法,为了使高16位与低16位同时进行运算,我们采用两个add16对高位进行计算,区别在于进位位分别为0和1,最终通过低16位加法器的输出进位作为选择控制信号,选择高16位的运算结果。这样,32bit加法器的延时就变为:16t+tmux2 ≈16t,延时降低了接近一倍,这种以空间(增加电路)换时间(提高速度)的做法,在数字电路设计中经常使用。
请创建Verilog模块,实现上图中的电路结构,其中add16不需要用户编写,其声明如下:
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
assign {cout,sum} = a + b + cin;
endmodule
输入格式
32bit a, 32bit b
输出格式
32bit sum 为 a 与 b 的和
注意:在always模块中,需要用reg
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
assign {cout,sum} = a + b + cin;
endmodule
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire cin,cin1,cin2,cout;
wire [15:0] sum0, sum1, sum2;
reg [15:0] sum_total;
assign cin = 0;
assign cin1 = 0;
assign cin2 = 1;
add16 add0 (a[15:0], b[15:0], cin, sum0[15:0], cout);
add16 add1 (a[31:16], b[31:16], cin1, sum1[15:0],);
add16 add2 (a[31:16], b[31:16], cin2, sum2[15:0],);
always @(*)
begin
case(cout)
1'b0: sum_total = sum1;
1'b1: sum_total = sum2;