总结:
从下面的Timing summary来看,流水线的频率最高、并行加法器次之,串行进位加法器再次,超前进位加法器最慢。
按理论,超前进位加法器应该比串行进位加法器快,此处为何出现这种情况,原因未知。
并行加法器因为使用加法符号实现的,从RTL图上也可以看到,具体是用加法器实现的,这个加法器是经过优化的,因此速度比较快。
流水线因为减小了组合逻辑的延时,因此可以达到较高的运行频率(注意运行速度与响应速度是不同的概念)。具体是通过缓存中间结果,从而分割组合逻辑实现流水线的。
相应地,串行进位加法器组合逻辑时延较大,因此速度较慢。
资源占用因为涉及到不同类型资源的比较,不较复杂,此处不再分析。
注意几点:
- 有符号数的加法,要进行符号位扩展;
- 对流水线加法,注意最后一级是符号扩展,前几级是0扩展;
代码以及综合结果如下。
8bit级联(即串行进位)加法器:
1 module adder_serial(rst_n, 2 clk, 3 a, 4 b, 5 cin, 6 sum 7 ); 8 9 parameter DATA_SIZE = 8; 10 11 input rst_n; 12 input clk; 13 input [DATA_SIZE - 1 : 0] a; 14 input [DATA_SIZE - 1 : 0] b; 15 input cin; 16 17 output [DATA_SIZE : 0] sum; 18 19 reg [DATA_SIZE - 1 : 0] a_r; 20 reg [DATA_SIZE - 1 : 0] b_r; 21 reg cin_r; 22 23 wire [DATA_SIZE : 0] sum_tmp; 24 wire [DATA_SIZE - 1 : 0] cout_tmp; 25 26 reg [DATA_SIZE : 0] sum; 27 28 always@(posedge clk) 29 if(!rst_n) 30 begin 31 a_r <= 8'd0; 32 b_r <= 8'd0; 33 cin_r <= 1'b0; 34 end 35 else 36 begin 37 a_r <= a; 38 b_r <= b; 39 cin_r <= cin; 40 end 41 //级联加法器,本级的进位输出作为下一级的进位输入 42 full_adder_1bit u0_full_adder_1bit ( 43 .a(a_r[0]), 44 .b(b_r[0]), 45 .cin(cin), 46 .sum(sum_tmp[0]), 47 .cout(cout_tmp[0]) 48 ); 49 50 full_adder_1bit u1_full_adder_1bit ( 51 .a(a_r[1]), 52 .b(b_r[1]), 53 .cin(cout_tmp[0]), 54 .sum(sum_tmp[1]), 55 .cout(cout_tmp[1]) 56 ); 57 58 full_adder_1bit u2_full_adder_1bit ( 59 .a(a_r[2]), 60 .b(b_r[2]), 61 .cin(cout_tmp[1]), 62 .sum(sum_tmp[2]), 63 .cout(cout_tmp[2]) 64 ); 65 66 full_adder_1bit u3_full_adder_1bit ( 67 .a(a_r[3]), 68 .b(b_r[3]), 69 .cin(cout_tmp[2]), 70 .sum(sum_tmp[3]), 71 .cout(cout_tmp[3]) 72 ); 73 74 full_adder_1bit u4_full_adder_1bit ( 75 .a(a_r[4]), 76 .b(b_r[4]), 77 .cin(cout_tmp[3]), 78 .sum(sum_tmp[4]), 79 .cout(cout_tmp[4]) 80 ); 81 82 full_adder_1bit u5_full_adder_1bit ( 83 .a(a_r[5]), 84 .b(b_r[5]), 85 .cin(cout_tmp[4]), 86 .sum(sum_tmp[5]), 87 .cout(cout_tmp[5]) 88 ); 89 90 full_adder_1bit u6_full_adder_1bit ( 91 .a(a_r[6]), 92 .b(b_r[6]), 93 .cin(cout_tmp[5]), 94 .sum(sum_tmp[6]), 95 .cout(cout_tmp[6]) 96 ); 97 98 full_adder_1bit u7_full_adder_1bit ( 99 .a(a_r[7]), 100 .b(b_r[7]), 101 .cin(cout_tmp[6]), 102 .sum(sum_tmp[7]), 103 .cout(cout_tmp[7]) 104 ); 105 106 full_adder_1bit u8_full_adder_1bit ( //为计算有符号数的加法,加上符号扩展 107 .a(a_r[7]), 108 .b(b_r[7]), 109 .cin(cout_tmp[7]), 110 .sum(sum_tmp[8]), 111 .cout() 112 ); 113 114 always@(posedge clk) 115 if(!rst_n) 116 begin 117 sum <= 9'd0; 118 end 119 else 120 begin 121 //sum <= {cout_tmp[7],sum_tmp}; //无符号相加时的结果 122 sum <= sum_tmp; //有符号相加时的结果 123 end 124 125 endmodule
testbench:
module adder_serial_tb;</span><span style="color: #008000;">//</span><span style="color: #008000;"> Inputs</span> <span style="color: #0000ff;">reg</span><span style="color: #000000;"> rst_n; </span><span style="color: #0000ff;">reg</span><span style="color: #000000;"> clk; </span><span style="color: #0000ff;">reg</span> [<span style="color: #800080;">7</span>:<span style="color: #800080;">0</span><span style="color: #000000;">] a; </span><span style="color: #0000ff;">reg</span> [<span style="color: #800080;">7</span>:<span style="color: #800080;">0</span><span style="color: #000000;">] b; </span><span style="color: #0000ff;">reg</span><span style="color: #000000;"> cin; </span><span style="color: #008000;">//</span><span style="color: #008000;"> Outputs</span> <span style="color: #0000ff;">wire</span> [<span style="color: #800080;">8</span>:<span style="color: #800080;">0</span><span style="color: #000000;">] sum; </span><span style="color: #008000;">//</span><span style="color: #008000;"> Instantiate the Unit Under Test (UUT)</span>