verilog HDLBits刷题“Module cseladd”--模块 cseladd---Carry-select adder 进位选择adder

verilog HDLBits刷题“Module cseladd”--模块 cseladd---Carry-select adder 进位选择adder 一、题目ripple carry adder 的一个缺点参见上一个练习 是 adder 计算 carry out 的延迟在最坏的情况下从 carry-in 开始相当慢并且第二阶段 adder 在第一阶段 adder 完成之前无法开始计算其carry-out。这会使加法器变慢。一项改进是 carry-select adder如下所示。第一级加法器与以前相同但我们复制了第二级加法器一个假设 carry-in0另一个假设 carry-in1然后使用快速的 2 对 1 多路复用器来选择哪个结果恰好是正确的。在本练习中您将获得与上一个练习相同的模块该模块将两个 16 位数字与进位相加并产生一个进出和 16 位总和。您必须使用您自己的 16 位 2 对 1 多路复用器实例化其中的三个来构建 carry-select 加法器。add16如下图所示将模块连接在一起。提供的模块具有以下声明add16module add16 ( input[15:0]a, input[15:0]b, inputcin, output[15:0]sum, outputcout);模块声明module top_module( input [31:0] a, input [31:0] b, output [31:0] sum );二、分析1、例化三个16位加法器低16位进位为0高16位的进位原本应来自低16位加法器的进位cout为提高加法器的速度分别假设高16位加法器的进位为0或1可得到高16位加法器的输出。2、根据低16位的进位输出sel), 选择高16位加法器的输出作为32位加法器的高16位输出。三、代码实现module top_module( input [31:0] a, input [31:0] b, output [31:0] sum ); wire [15:0]sum_hi0,sum_hi1; wire [15:0]sum_low; reg [15:0]sum_hi_sel; wire sel; add16 inst1(.a(a[15:0]),.b(b[15:0]),.cin(1b0),.cout(sel),.sum(sum_low)); add16 inst2(.a(a[31:16]),.b(b[31:16]),.cin(1b0),.cout(),.sum(sum_hi0)); add16 inst3(.a(a[31:16]),.b(b[31:16]),.cin(1b1),.cout(),.sum(sum_hi1)); always(*)begin case(sel) 1b0:sum_hi_selsum_hi0; 1b1:sum_hi_selsum_hi1; endcase end assign sum{sum_hi_sel,sum_low}; endmodule 或者 module top_module( input [31:0] a, input [31:0] b, output [31:0] sum ); wire cout_sel; wire [15:0]sum1,sum2,sum3; add16 instance1(.a(a[15:0]),.b(b[15:0]),.cin(1b0),.sum(sum1),.cout(cout_sel)); add16 instance2(.a(a[31:16]),.b(b[31:16]),.cin(1b0),.sum(sum2),.cout()); add16 instance3(.a(a[31:16]),.b(b[31:16]),.cin(1b1),.sum(sum3),.cout()); always(*)begin case(cout_sel) 0:sum{sum2,sum1}; 1:sum{sum3,sum1}; endcase end endmodule四、时序