问题26 Carry-select adder (Module cseladd)
问题25 实现的加法器叫做行波进位加法器(RCA: Ripple-Carry Adder),缺点是计算进位输出的延迟是相当慢的(最坏的情况下,来自于进位输入),前一级加法器计算完成之前,后一级加法器不能开始计算,使得加法器的计算延迟变大。
在本练习中,为您提供与前一练习相同的模块 add16
,它将两个 16
位数字与进位相加,并产生一个进位和 16
位和。您必须使用您自己的 16
位 2
对 1 多路复用器来实例化其中的三个以构建进位选择加法器。
如下图所示将模块连接在一起。提供的模块 add16
具有以下声明:
module add16(input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout); • 1
module top_module( input [31:0] a, input [31:0] b, output [31:0] sum ); wire [15:0] sum1; wire [15:0] sum2; wire [15:0] sum3; wire cout; assign sum = cout ? {sum3, sum1} : {sum2, sum1}; add16 add161( .a (a[15:0] ), .b (b[15:0] ), .sum (sum1 ), .cin (1'b0 ), .cout (cout ) ); add16 add162( .a (a[31:16] ), .b (b[31:16] ), .sum (sum2 ), .cin (1'b0 ), .cout ( ) ); add16 add163( .a (a[31:16] ), .b (b[31:16] ), .sum (sum3 ), .cin (1'b1 ), .cout ( ) ); endmodule
问题27 Adder–subtractor (Module addsub)
减法器可以由加法器来构建,对其中一个数取相反数(逐位取反加1)即可。最终结果是一个可以执行两种操作的电路:(a + b + 0) 和 (a + ~b + 1)。如果您想更详细地了解该电路的工作原理,请参阅 Wikipedia。
为您提供了一个 16 位加法器模块,您需要对其进行两次实例化:module add16 (
input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout ); 1
当 sub 为 1 时,使用 32 位的异或门对 b 进行取反(这也可以被视为 b[31:0] 与 sub 复制 32 次相异或),同时 sub 信号连接到加法器的进位。
module top_module( input [31:0] a, input [31:0] b, input sub, output [31:0] sum ); wire cout; wire [31:0] b_com; assign b_com = {32{sub}}^ b; add16 add161( .a (a[15:0] ), .b (b_com[15:0] ), .cin (sub ), .cout (cout ), .sum (sum[15:0] ) ); add16 add162( .a (a[31:16] ), .b (b_com[31:16] ), .cin (cout ), .cout ( ), .sum (sum[31:16] ) ); endmodule
结语
注意巩固练习